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

问题描述

现在我正在使用HostSNI( * )来映射TCP服务,例如Kubernetes集群v1.18中的traefik 2.2.1中的mysql\postgresql...。因为我在本地计算机上,并且没有有效的证书。这是配置:

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

是配置在我的本地计算机上工作正常。但是我仍然想知道使用的副作用 HostSNI( )映射策略。使用HostSNI( )(而不是域名)有什么缺点?可以在我的本地计算机上使用伪造的域名吗?

解决方法

截至最新的 Traefik 文档 (2.4 at this time):

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

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

因此,回答您的问题:

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

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...