vlambda博客
学习文章列表

【IstioCon 2021】如何在Istio中进行源地址保持?

北京时间2月23日,在全球首届社区峰会IstioCon 2021中,华为云原生开源团队核心成员徐中虎发表了《Preserve Original Source Address within Istio》主题演讲。


演讲嘉宾:徐中虎

 

徐中虎,华为云原生开源团队核心成员,Istio社区指导委员会委员(亚洲唯一),Istio Maintainer以及核心贡献者,Kubernetes项目核心贡献者。畅销书《云原生服务网格Istio:原理、实践、架构与源码解析》作者之一,聚焦在Kubernetes、容器、Service Mesh等云原生技术。对于分布式系统高性能、高可靠、大规模扩展性有深入的研究和丰富的经验。


演讲主要包含三部分的内容:



2)用于安全策略控制,常用的黑白名单设置;



常见的源IP保持方式及背景知识


【IstioCon 2021】如何在Istio中进行源地址保持?


我们常用的源IP保持的方式从OSI网络模型L3-L7主要分为:


1. L3

【IstioCon 2021】如何在Istio中进行源地址保持?
(1)当用户请求到达Director Server,此时请求的数据报文会先到内核空间的PREROUTING链。此时报文的源IP为CIP,目标IP为VIP。
(2) PREROUTING检查发现数据包的目标IP是本机,将数据包送至INPUT链, LVS主要工作在INPUT链。
(3) IPVS比对数据包请求的服务是否为集群服务,若是,修改数据包的目标IP地址为后端服务器IP,然后将数据包发至POSTROUTING链。此时报文的源IP为CIP,目标IP为RIP ,在这个过程完成了目标IP的转换(DNAT),而源地址始终没变。
(4) POSTROUTING链通过选路,将数据包发送给Real Server。


【IstioCon 2021】如何在Istio中进行源地址保持?
HAProxy透明传输模式也是一种L3层的源地址保持方式,但是它工作在用户空间,是典型的两次连接模型。
1)用户首先与HAProxy建立一条连接,当用户请求到达HAProxy时,HAProxy获取客户端的IP地址。

2)HAProxy工作在透明传输模式下,根据负载均衡策略选择一个真实的后端服务,然后绑定客户端的IP地址,与后端服务建立新的连接。透明代理依赖socket的IP_TRANSPARENT

3)真实服务器响应数据包必须经过HAProxy代理,因此,透明传输还得依赖个性化路由的配置以及TPROXY。


2. L4



【IstioCon 2021】如何在Istio中进行源地址保持?


3. L7




1)服务网格东西向服务访问时,由于Sidecar的注入,所有进出服务的流量均被Envoy拦截代理,当svcA访问svcB时,svcB的Sidecar Envoy与svcB建立一条连接,源地址是127.0.0.1,目的地址也是127.0.0.1(未来是PodIP)。单纯从TCP通信的角度来看,svcB只能获取到客户端地址是127.0.0.1。


【IstioCon 2021】如何在Istio中进行源地址保持?

集群内服务访问


【IstioCon 2021】如何在Istio中进行源地址保持?

Ingress服务访问





1)源地址过滤器作用在Envoy的Inbound监听器,其工作原理是获取下游连接的客户端地址,并以客户端地址为源地址与上游服务建立新的连接。 本质上是IP_TRANSPARENT透明传输,这一点对TCP源地址的获取非常重要。 前面我们介绍到透明传输还必须解决IP包回程的问题,这一点我们留在后面再讲。
2)代理协议过滤器也作用于监听器,主要职责为解析Proxy Protocol协议,可在服务端获取源地址,特别适合Ingress服务源地址获取。
3)Proxy Protocol Transport Socket,是Envoy与上游通过Proxy Protocol进行源IP保持的一种方式,其主要构造代理协议头,并主动发送给上游支持代理协议的服务。
4)HTTP XFF(x-forwarded-for)自动注入,envoy可以根据LDS HTTP连接管理配置自动添加最近的下游客户端的IP地址到XFF中。


1. HTTP类协议源IP保持

【IstioCon 2021】如何在Istio中进行源地址保持?

那么可以看到,东西向七层HTTP类协议可以非常容易的通过添加XFF的方式,方便服务端获取客户端真实IP。其典型的配置如下:


【IstioCon 2021】如何在Istio中进行源地址保持?


【IstioCon 2021】如何在Istio中进行源地址保持?

Ingress HTTP


【IstioCon 2021】如何在Istio中进行源地址保持?


两种模式下,都需要配置Ingress gateway使其支持XFF自动添加, 另外可以通过xff_num_trusted_hops额外配置Envoy信任的代理跳数,详细参考https://www.envoyproxy.io/docs/envoy/latest/configuration/http/http_conn_man/headers#x-forwarded-for。

【IstioCon 2021】如何在Istio中进行源地址保持?


2. TCP源IP保持

【IstioCon 2021】如何在Istio中进行源地址保持?


2)配置TPROXY和个性化路由,确保svcB发送到10.244.0.20的数据包被Envoy接收。主要是对数据包打标记,然后根据自定义路由,将非本地的数据包通过本地lo路由。

-A PREROUTING -p tcp -m mark --mark 0x539 -j CONNMARK --save-mark --nfmask 0xffffffff --ctmask 0xffffffff
-A OUTPUT -p tcp -m connmark --mark 0x539 -j CONNMARK --restore-mark --nfmask 0xffffffff --ctmask 0xffffffff
ip -f inet rule add fwmark 1337 lookup 133
ip -f inet route add local default dev lo table 133


【IstioCon 2021】如何在Istio中进行源地址保持?


【IstioCon 2021】如何在Istio中进行源地址保持?



在svcB上配置envoy.filters.listener.proxy_protocol,保证Envoy监听器获取原始客户端IP。

【IstioCon 2021】如何在Istio中进行源地址保持?


本文小结



本文根据本人在IstioCon 2021的分享整理而来,相关的案例demo都可以在

https://github.com/hzxuzhonghu/istio-demo 找到,希望对大家有所启发。


【IstioCon 2021】如何在Istio中进行源地址保持?


即可获取演讲PPT



扫描二维码 | 加入 Istio 技术交流群




戳阅读原文,观看演讲视频!