根据路由表从环回接口转发数据包

根据路由表从环回接口转发数据包

我遇到一个问题,需要处理一些数据包并发送到多个接口/网络。

我的解决方案是将数据包发送到环回/虚拟接口,然后根据 Linux 路由表将数据包转发到相应的接口/网络。

问题:来自应用程序的数据包被发送到环回/虚拟接口,但并未根据路由表进行转发。

有没有办法根据路由表从环回/虚拟接口转发数据包?

我尝试在 iptables 中的 FORWARD 链中接受数据包,但数据包没有到达这里。我尝试启用 /ipv4/ip_forwarding,但这也没有帮助。

编辑 我的设备是一个中间设备,它从一个接口(WAN)收集数据包,然后处理每个数据包并将其转发到正确的目的地(不同的 LAN)。现在我的问题是我不知道要发送哪个接口,因为有 n 个输出接口。我需要根据传入数据包中的 ip.dst 来定向数据包。

答案1

我认为你想多了。

如果您的应用程序是服务器,那么您只需绑定到0.0.0.0将侦听所有可用本地接口的服务器(这将在添加/删除接口时起作用)。如果您只是在accept()客户端连接时返回的套接字上回复,它将自动选择正确的本地 IP 地址进行回复,并通过正确的接口将其路由出去。

如果您的应用程序正在启动与远程计算机的连接,那么您需要提前知道主机地址以设置正确的目标地址,如果您使用单播,您不能只发送一个数据包并期望操作系统通过所有接口发送该数据包。为此,您将需要跟踪计算机上的所有实时接口,然后根据本地地址/子网得出目标 IP 地址。

答案2

鉴于这些评论,我认为您可能希望考虑扩展 iptables,因为这将允许您动态拦截/修改/重新发送数据包,并让正常路由完成其工作。

例如

答案3

使用 VETH 和命名空间代替虚拟/环回接口的问题已解决。

相关内容