最近有一个需求,修改 TCP 回程数据包的 SRC 和 DST IP 使与去程走不一样的路由。第一反应是使用 iptables 做 SNAT 和 DNAT,但是实测发现 iptables 是基于 Conntrack 实现的,对回程数据包并不生效。因为曾经用 XDP 实现过 LB,准备再次使用 XDP 写个小程序实现。
随后突然想起 ebpf 的 XDP Hook 是对 ingress 生效的,如果想做 egress 则得使用 TC Hook。既然如此, Linux 的 TC 工具是不是已经原生支持了我的小需求呢,之前对 TC 工具的使用局限在 netem 和 tbf 模块,也就是弱网模拟和流控。查阅文档发现 TC 的 Pedit 模块可以很轻松的提供我需要的无状态(Stateless)NAT 能力。