[Istio] 不解密加密流量即可路由的秘诀:SNI与PASSTHROUGH模式 🔒🚦

大家好!今天我想和大家聊聊在处理Istio时会遇到的一种稍微特殊的路由方式。

通常,当我们提到入口网关(Gateway)时,它主要负责解密(Terminating)外部传入的HTTPS加密,检查内容,然后将其发送到内部服务。

但是,问题来了…🤔 如果网关声明“我不想解密!我只会原样转发!”(PASSTHROUGH),那么网关将完全无法看到数据包中的URL路径或头部信息。

如果看不到内容,它怎么知道并找到目标服务(booking-service)呢?这时,主角SNI就登场了。


1. SNI (Server Name Indication) 是什么? 📨

SNI是Server Name Indication的缩写,简单来说,它就像是“贴在加密保险箱(数据包)表面上的‘收件人姓名’便签”。

💡 为什么会诞生?

HTTPS通信为了安全会加密数据。过去,在加密连接(TLS Handshake)建立之前,服务器无法知道“客户端想要连接哪个域名”。当一个服务器IP连接了多个域名(例如:[可疑链接已删除], b.com)时,这就成了一个问题。

因此,SNI就是一项约定好的技术,它允许在“开始加密通信的问候(Client Hello)阶段,以明文形式悄悄告知服务器要连接的域名地址(Hostname)!”


2. 代码解析:PASSTHROUGH与SNI的协作 🤝

您展示的YAML代码很好地说明了Istio如何利用SNI信息。让我们逐一分析。

1️⃣ Gateway 配置:“我不会查看内容(直通)”

apiVersion: networking.istio.io/v1alpha3
kind: Gateway
metadata:
  name: booking-gateway
spec:
  servers:
  - port:
      number: 443
      protocol: HTTPS
    hosts:
    - booking.example.com
    tls:
      mode: PASSTHROUGH  # 👈 这是关键!
  • mode: PASSTHROUGH: 指示网关“不要在此处终止TLS加密”。
  • 由于网关直接传递加密数据,它完全无法读取HTTP头部或URL路径(如/login, /pay等)。

2️⃣ VirtualService 配置:“根据表面写明的名称(SNI)进行投递!”

apiVersion: networking.istio.io/v1beta1
kind: VirtualService
spec:
  hosts:
  - booking.example.com
  tls:                # 👈 使用tls规则,而不是http!
  - match:
    - port: 443
      sniHosts:       # 👈 检查加密数据包表面的标签
      - booking.example.com
    route:
    - destination:
        host: booking-service
        port:
          number: 443
  • tls: 由于无法查看HTTP内容,因此我们使用tls(TCP级别)路由规则,而不是http路由规则。
  • sniHosts: 网关无法查看内容,但会检查客户端在TLS握手时发送的SNI字段(booking.example.com)。
  • 它会判断:“虽然不知道内容,但表面写着booking,那就发送到booking-service吧!”

3. 整体操作流程总结 🚀

当此配置应用后,流量将按以下方式传输:

  1. 客户端(浏览器) 💻: 尝试连接 。此时,它会在SNI中写入“我要连接booking”并发送。
  2. Istio 网关 🛡️: 流量到达!由于是PASSTHROUGH模式,不解密。而是悄悄检查SNI。
  3. 路由决策 🔀: 查看VirtualService,发现“如果SNI是booking,则发送到booking-service”。
  4. 转发 (Forwarding) 📦: 加密的数据包原样转发到booking-service Pod。
  5. Booking Service (Pod) 🔓: 最终目标Pod直接解密请求并处理。

4. 何时使用这种方式? (Use Cases)

通常情况下,网关会解密流量,但在以下情况下,这种方式(SNI路由)是必不可少的:

  1. 端到端安全 (零信任) 🔐: 当甚至不信任网关,并且流量在到达Pod之前绝不能被解密时。
  2. 按服务管理证书 📜: 当每个服务(Pod)而不是网关需要直接管理自己的唯一证书时。

🏁 总结

总而言之,SNI就像是加密世界中帮助我们不迷路的导航地址。

在Istio中使用PASSTHROUGH意味着将网关变成一个“简单的快递员”,而此时,帮助快递员找到家的唯一线索就是sniHosts设置。请务必记住这一点!😉

如果这有帮助,请点赞!



Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注