欺骗源 IP 的同时,直接从 IPIP 端点隧道将流量发送回客户端

欺骗源 IP 的同时,直接从 IPIP 端点隧道将流量发送回客户端

我在 Linux(Ubuntu 18.04)上编写了一个 C 程序,该程序通过 IPIP 将流量转发到另一台服务器。当 IPIP 端点发回回复时,程序还会在剥离外部 IP 标头后将数据发回客户端。应用程序和机器上的 IPIP 隧道端点流量被转发到位于网络命名空间内,IPIP 隧道是默认路由。这一切工作正常。但是,我想实现一些东西,使应用程序通过 IPTablesPOSTROUTING中的链将源 IP 地址欺骗为转发机器 IP,从而直接将流量发送回客户端。这将减少转发机器的负载,因为应用程序不需要通过 IPIP 隧道将流量发送回客户端,我相信这会使其更加一致。

为此,我尝试设置一个 veth 对,其中一个 veth 位于默认网络命名空间中,而对等 veth 位于应用程序的自定义网络命名空间中。我还在主网络命名空间上设置了一个网桥,为其分配了一个 IP 地址,并在链中制定了一条 SNAT 规则,POSTROUTING以将流量作为特定 IP 发出。然后,我在主网络命名空间上桥接了 veth 接口。应用程序仍然绑定到 IPIP 隧道,但当它需要发送出站流量时,它会通过默认路由发送流量。因此,我将默认路由设置为网络命名空间内的 veth 接口。

所有这些基本都正常工作。应用程序的流量直接发送回客户端,客户端响应转发服务器。然后,流量被发送回服务器,流量通过 IPIP 转发到服务器。我通过 确认了所有这些tcpdump。但是,我正在运行的应用程序没有处理回复。我相信原因是应用程序期望响应在接口veth(默认路由)上返回,因为它用它向客户端发送回复。不幸的是,该应用程序是闭源的,所以我无法检查代码。但是,我可能会创建一个使用默认路由发送出站连接的测试 C 程序并进行进一步的故障排除。

我只是想知道是否有人对此有什么建议。我读过一些关于通过 IPTables 标记数据包的内容。我不太确定在客户端回复并将其发送到转发服务器后,该标记是否会保留。

我认为 IPIP 隧道上预计会有某些流量,而默认路由上预计会有其他流量。在我的例子中,连接到应用程序的客户端正在向 IPIP 隧道发送流量,而 IPIP 隧道正在等待这些流量。但是,应用程序还会与主干网建立出站连接,我相信这是网络命名空间内默认接口上预计的流量类型。

如果所有流量都预计在默认路由上,是否可以将流量从转发服务器转发到此特定接口,同时删除 IPIP 协议(​​剥离外部 IP 标头等)?我认为这需要在流量到达 IPIP 隧道后发生。

话虽如此,我想使用 IPIP 的原因是我可以在目标机器上执行 NAT(使用内部 IP 标头的目标地址将流量转发到 IPIP 隧道)。因此,我宁愿不放弃 IPIP 隧道。

非常感谢您的帮助,如果您需要更多信息,请告诉我!

答案1

我只是想提供更新。我在发布这个问题大约一周后解决了这个问题,方法是创建一个 TC BPF 程序,该程序会自动将出站 IPIP 数据包直接发送回客户端。有兴趣的人可以随时查看这里

谢谢!

相关内容