了解 TLS 配置
Istio 最重要的功能之一是能够锁定和保护进出网格以及网格内的网络流量。但是,配置 TLS 设置可能会很混乱,并且是常见的错误配置来源。本文档试图解释在 Istio 中发送请求时涉及的各种连接,以及如何配置其关联的 TLS 设置。有关一些最常见的 TLS 配置问题的摘要,请参阅 TLS 配置错误。
Sidecar
Sidecar 流量具有各种关联连接。让我们逐一分解它们。
外部入站流量 这是来自外部客户端并被 Sidecar 捕获的流量。如果客户端在网格内,此流量可能会使用 Istio 双向 TLS 加密。默认情况下,Sidecar 将配置为接受 mTLS 和非 mTLS 流量,称为
PERMISSIVE
模式。模式还可以配置为STRICT
,其中流量必须为 mTLS,或者DISABLE
,其中流量必须为明文。mTLS 模式使用PeerAuthentication
资源 进行配置。本地入站流量 这是来自边车的流量,流向您的应用程序服务。此流量将始终按原样转发。请注意,这并不意味着它始终是明文;边车可能会通过 TLS 连接。它只是意味着边车永远不会发起新的 TLS 连接。
本地出站流量 这是从您的应用程序服务发出的被边车拦截的流量。您的应用程序可能会发送明文或 TLS 流量。如果 自动协议选择 已启用,Istio 将自动检测协议。否则,您应该在目标服务中使用端口名称来 手动指定协议.
外部出站流量 这是离开边车到某个外部目的地的流量。流量可以按原样转发,也可以启动 TLS 连接(mTLS 或标准 TLS)。这由
DestinationRule
资源 的trafficPolicy
中的 TLS 模式设置控制。模式设置为DISABLE
将发送明文,而SIMPLE
、MUTUAL
和ISTIO_MUTUAL
将发起 TLS 连接。
关键要点是
PeerAuthentication
用于配置边车将接受的 mTLS 流量类型。DestinationRule
用于配置边车将发送的 TLS 流量类型。- 端口名称或自动协议选择决定边车将解析流量的协议。
自动 mTLS
如上所述,DestinationRule
控制传出流量是否使用 mTLS。但是,为每个工作负载配置此选项可能很繁琐。通常,您希望 Istio 在任何可能的情况下始终使用 mTLS,并且仅向不属于网格的工作负载(即没有边车的工作负载)发送明文。
Istio 通过名为“自动 mTLS”的功能简化了此过程。自动 mTLS 通过执行以下操作来实现这一点。如果在 DestinationRule
中未明确配置 TLS 设置,边车将自动确定是否应该发送 Istio 双向 TLS。这意味着,无需任何配置,所有网格间流量都将使用 mTLS 加密。
网关
任何给定对网关的请求都将有两个连接。
入站请求,由某些客户端(如
curl
或 Web 浏览器)发起。这通常被称为“下游”连接。出站请求,由网关发起到某个后端。这通常被称为“上游”连接。
这两个连接都有独立的 TLS 配置。
请注意,入口和出口网关的配置是相同的。istio-ingress-gateway
和 istio-egress-gateway
只是两个专门的网关部署。区别在于入口网关的客户端运行在网格之外,而出口网关的目的地则在网格之外。
入站
作为入站请求的一部分,网关必须对流量进行解码,以便应用路由规则。这是根据 Gateway
资源 中的服务器配置完成的。例如,如果入站连接是明文 HTTP,则端口协议配置为 HTTP
apiVersion: networking.istio.io/v1
kind: Gateway
...
servers:
- port:
number: 80
name: http
protocol: HTTP
类似地,对于原始 TCP 流量,协议将设置为 TCP
。
对于 TLS 连接,还有更多选项
封装了什么协议?如果连接是 HTTPS,则服务器协议应配置为
HTTPS
。否则,对于使用 TLS 封装的原始 TCP 连接,协议应设置为TLS
。TLS 连接是否被终止或通过?对于直通流量,将 TLS 模式字段配置为
PASSTHROUGH
apiVersion: networking.istio.io/v1 kind: Gateway ... servers: - port: number: 443 name: https protocol: HTTPS tls: mode: PASSTHROUGH
在此模式下,Istio 将根据 SNI 信息进行路由,并将连接按原样转发到目标。
是否应该使用双向 TLS?双向 TLS 可以通过 TLS 模式
MUTUAL
进行配置。当配置此选项时,将请求客户端证书并根据配置的caCertificates
或credentialName
对其进行验证。apiVersion: networking.istio.io/v1 kind: Gateway ... servers: - port: number: 443 name: https protocol: HTTPS tls: mode: MUTUAL caCertificates: ...
出站
入站侧配置了要预期什么样的流量以及如何处理它,而出站配置则控制了网关将发送什么样的流量。这由 DestinationRule
中的 TLS 设置配置,就像来自 边车 的外部出站流量一样,或者默认情况下由 自动 mTLS 配置。
唯一的区别是,在配置此选项时,您应该注意考虑 Gateway
设置。例如,如果 Gateway
配置为使用 TLS PASSTHROUGH
,而 DestinationRule
配置了 TLS 发起,则最终会导致 双重加密。这可以工作,但通常不是预期的行为。
绑定到网关的 VirtualService
也需要谨慎,以 确保它与 Gateway
定义一致。