在traefik TCP路由映射中使用hostSNI(*)有什么缺点

Dol*_*hin 4 kubernetes traefik traefik-ingress

现在我使用HostSNI(*)来映射 TCP 服务,就像mysql\postgresql...Kubernetes 集群 v1.18 中的 traefik 2.2.1 一样。因为我在本地机器上并且没有有效的认证。这是配置:

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteTCP
metadata:
    name: mysql-ingress-tcp-route
    namespace: middleware
spec:
    entryPoints:
        - mysql
    routes:
        - match: HostSNI(`*`)
          services:
            - name: report-mysqlha
                port: 3306
Run Code Online (Sandbox Code Playgroud)

配置在我的本地计算机上运行良好。但我仍然想知道使用映射策略的副作用 HostSNI()HostSNI()不使用域名有什么缺点?是否可以在我的本地计算机上使用假域名?

Ray*_*Ray 10

对于那些需要具有 TLS 直通和 SNI 路由的 TCP 示例的人

apiVersion: traefik.containo.us/v1alpha1
kind: IngressRouteTCP
metadata:
  name: test-https
  namespace: mynamespace
spec:
  entryPoints:
  - websecure # maps to port 443 by default
  routes:
  - match: HostSNI(`my.domain.com`)
    services:
    - name: myservice
      port: 443
  tls:
    passthrough: true
Run Code Online (Sandbox Code Playgroud)


mar*_*s64 8

截至最新的 Traefik 文档(此时为 2.4):

如果 HTTP 路由器和 TCP 路由器都侦听相同的入口点,则 TCP 路由器将在 HTTP 路由器之前应用

值得注意的是,服务器名称指示是 TLS 协议的扩展。因此,只有 TLS 路由器才能使用该规则指定域名。但是,非 TLS 路由器必须明确使用带有 *(每个域)的规则来声明每个非 TLS 请求都将由路由器处理。

因此,回答您的问题:

  • 使用HostSNI(`*`)是使用ingressRouteTCP 不带tls 的唯一合理方法——因为您明确要求 TCP 路由器,而 TCP 不支持 TLS。
    • 我在一个部分ingressRouteTCP中取得了不同程度的成功,但它似乎确实是受支持的配置2HostSNI(`some.fqdn.here`)tls:
  • 一个可能的“缺点”(空中报价,因为它是主观的)是:此配置意味着路由到您的entrypoint(即mysql)的任何流量都将通过此路由ingressRouteTCP
    • 考虑一下:如果由于某种原因你有另一个ingressRoute具有相同的entrypoint,则将ingressRouteTCP按照1优先
    • 考虑:例如,如果您想mysql通过同一个路由多个不同的服务entrypoint: mysql,您将无法基于此配置

  • “如果 HTTP 路由器和 TCP 路由器都侦听相同的入口点,则 TCP 路由器将在 HTTP 路由器之前应用”在官方文档中没有找到这一点,这对我帮助很大,谢谢! (2认同)