问题描述
现在我正在使用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 .- 我在
ingressRouteTCP
和HostSNI(`some.fqdn.here`)
的tls:
部分取得了喜忧参半的成功,但根据 2 部分,它似乎是受支持的配置
- 我在
- 一个可能的“缺点”(airquotes,因为它是主观的)是:此配置意味着路由到您的
entrypoint
(即mysql
)的任何流量都将通过此 {{1} }- 考虑:如果由于某种原因您有另一个具有相同
ingressRouteTCP
的ingressRoute
,则entrypoint
将按照 1 优先
- 考虑:例如,如果您想通过同一个
ingressRouteTCP
路由多个不同的mysql
服务,您将无法基于此配置
- 考虑:如果由于某种原因您有另一个具有相同