背景
ServiceMesh 社区使用 iptables 实现流量劫持,这个机制在百度生产环境使用会遇到一些问题,因此,我们探索了其他的流量劫持方式,如基于服务发现的流量劫持机制、基于 SDK 的流量劫持机制、基于固定 Virutal IP 的流量劫持机制等。
本文主要介绍基于服务发现的流量劫持机制,这个机制是在服务发现步骤 "伪造" 地址来完成流量劫持。
基于 iptables 流量劫持机制
我们先简单的看看社区的流量劫持方案,首先看下 Inbound 流量劫持,如图1 所示:
-
所有入站流量都会经过 iptables;
-
iptables 忽略非 TCP 以及访问 istio 管理端口的流量,将其他入站流量转发给 Envoy;
-
Envoy 处理完后再将流量转发给 App;
-
上述流量又一次经过 iptables 规则匹配,iptables 将具备以下特点的流量当做 Envoy 发出的流量直接转发给目的地:
-
Envoy 发出的;
-
输出设备时 lo;
-
目的地时127.0.0.1。
-
至此 iptables 完成了 Envoy 对 Inbound 流量的劫持和转发。
图1 iptables 流量劫持
接下来咱们再来看看 Outbound 流量劫持,如图2所示:
-
App 给 Server 发送流量;
-
iptables 将满足以下条件的流量转发给 Envoy:
-
不是 Envoy 发出的;
-
输出设备不是 lo;
-
目的地址不是 localhost。
-
-
Envoy 处理完后,选定 Server 的一个 endpoint 转发流量;
-
iptables 将满足以下条件的流量直接发给目的地,也就是 Server:
-
Envoy 发出的;
-
输出设备不是 lo。
-