跳到正文
Træfɪk

TLS

概述

要将 TCP 路由器配置为处理 TLS 流量,请在其定义中加入 tls 字段。此字段告知 Traefik,该路由器只应处理 TLS 连接,并忽略非 TLS 流量。

默认情况下,带有 TLS 字段的路由器会终止 TLS 连接,也就是说,它会向服务发送解密后的数据。

配置示例

tcp:
  routers:
    my-tls-router:
      rule: "HostSNI(`example.com`)"
      service: "my-tcp-service"
      tls:
        passthrough: true
        options: "my-tls-options"
        domains:
          - main: "example.com"
            sans:
              - "www.example.com"
              - "api.example.com"
        certResolver: "myresolver"
[tcp.routers.my-tls-router]
  rule = "HostSNI(`example.com`)"
  service = "my-tcp-service"

  [tcp.routers.my-tls-router.tls]
    passthrough = true
    options = "my-tls-options"
    certResolver = "myresolver"

    [[tcp.routers.my-tls-router.tls.domains]]
      main = "example.com"
      sans = ["www.example.com", "api.example.com"]
labels:
  - "traefik.tcp.routers.my-tls-router.tls=true"
  - "traefik.tcp.routers.my-tls-router.rule=HostSNI(`example.com`)"
  - "traefik.tcp.routers.my-tls-router.service=my-tcp-service"
  - "traefik.tcp.routers.my-tls-router.tls.passthrough=true"
  - "traefik.tcp.routers.my-tls-router.tls.options=my-tls-options"
  - "traefik.tcp.routers.my-tls-router.tls.certResolver=myresolver"
  - "traefik.tcp.routers.my-tls-router.tls.domains[0].main=example.com"
  - "traefik.tcp.routers.my-tls-router.tls.domains[0].sans=www.example.com,api.example.com"
{
  //...
  "Tags": [
    "traefik.tcp.routers.my-tls-router.tls=true",
    "traefik.tcp.routers.my-tls-router.rule=HostSNI(`example.com`)",
    "traefik.tcp.routers.my-tls-router.service=my-tcp-service",
    "traefik.tcp.routers.my-tls-router.tls.passthrough=true",
    "traefik.tcp.routers.my-tls-router.tls.options=my-tls-options",
    "traefik.tcp.routers.my-tls-router.tls.certResolver=myresolver",
    "traefik.tcp.routers.my-tls-router.tls.domains[0].main=example.com",
    "traefik.tcp.routers.my-tls-router.tls.domains[0].sans=www.example.com,api.example.com"
  ]
}
Postgres STARTTLS

Traefik 支持 Postgres STARTTLS 协议, 可以对 Postgres 连接执行 TLS 路由。

为此,Traefik 会读取 Postgres 客户端发送的前几个字节, 判断它们是否对应 STARTTLS 协商消息, 如果是,则确认该消息,并通知客户端可以开始 TLS 握手。

请注意,STARTTLS 本身存在一些细节,会影响连接最终是否采用 TLS。 这些细节取决于客户端配置中的 sslmode 值(以及服务器身份认证规则)。 因此,建议使用 require 作为 sslmode 的值。

随后即可按预期进行 TLS 握手和基于 TLS 的路由。

Postgres STARTTLS 与 TCP TLS 透传路由器

如上所述,sslmode 配置参数确实影响 STARTTLS 会话能否成功。 尤其是在 TCP TLS 透传场景中,某些值(如 allow)甚至没有意义。 因此,再次建议使用 require 值。

配置选项

字段 说明 默认值 必填
passthrough 定义是否将请求“原样”转发,保持所有数据加密。 false 否
options 支持精细控制 TLS 参数。它引用一组 TLS 选项,且仅在定义 HostSNI 规则时应用。
与 HTTP 路由器不同,多个 TCP 路由器可以使用不同的 TLS 选项处理相同的 HostSNI。详见 TLS 选项与 HostSNI。
"" 否
certResolver 通过 ACME 提供者(如 Let's Encrypt)自动生成证书时使用的证书解析器名称。详见证书解析器一节。 "" 否
domains 用于显式指定证书域名的域名和使用者备用名称(SAN)列表。详见自定义域名一节。 [] 否

TLS 选项与 HostSNI

与 HTTP 路由器不同, 多个 TCP 路由器可以使用不同的 TLS 选项处理相同的 HostSNI, 这不会造成冲突。

TCP 路由器规则不限于 HostSNI 匹配器,TCP 多路复用器能够在 TLS 握手前判断哪条路由匹配该连接。 因此,TLS 选项按路由选择,而非按主机名选择, 所以以下配置有效:

# Dynamic configuration

tcp:
  routers:
    routerfoo:
      rule: "HostSNI(`example.com`) && ClientIP(`192.168.0.11`)"
      tls:
        options: foo

    routerbar:
      rule: "HostSNI(`example.com`) && ClientIP(`192.168.0.12`)"
      tls:
        options: bar
# Dynamic configuration

[tcp.routers]
  [tcp.routers.routerfoo]
    rule = "HostSNI(`example.com`) && ClientIP(`192.168.0.11`)"
    [tcp.routers.routerfoo.tls]
      options = "foo"

  [tcp.routers.routerbar]
    rule = "HostSNI(`example.com`) && ClientIP(`192.168.0.12`)"
    [tcp.routers.routerbar.tls]
      options = "bar"

证书解析器

tls.certResolver 选项允许指定证书解析器,通过 ACME 提供者(如 Let's Encrypt)自动生成证书。

为路由器配置证书解析器后, Traefik 会自动获取和管理路由器规则(HostSNI 匹配器)或 tls.domains 配置中所指定域名的 TLS 证书(以 tls.domains 为优先)。

前提条件

  • 必须在静态配置中定义证书解析器
  • 路由器必须启用 tls
  • 必须为证书解析器配置 ACME 质询类型

自定义域名

使用 ACME 证书解析器时,会从路由器规则中自动提取域名, 但 tls.domains 选项支持显式指定需要生成证书的域名和使用者备用名称(SAN)。

这可以精细控制证书生成,并优先于从路由器规则自动提取的域名。

每个域名都必须具有指向 Traefik 的 A/AAAA 记录。


在生产环境使用 Traefik OSS?

如果你在工作中使用 Traefik,可以考虑为 Traefik OSS 增加企业级 API 网关能力或商业支持。

为 Traefik OSS 增加 API 网关能力快捷且平滑,无需推倒重来,现有配置也会完整保留。请通过这个简短视频了解实际效果。


版权所有 © 头文件软件工作室

文档由 HeadFile Studio 翻译。

Traefik v3.7 中文快照 · 原文版权归 Traefik Labs 及贡献者所有 · MIT 许可证