强制通过网络进行 UDP 环回

强制通过网络进行 UDP 环回

我正在尝试用 Python 设置一个小型环回程序,以便将 UDP 数据包从一个接口发送到另一个接口。如果不修改 iptables,内核将直接切断任何通信并将其直接发送到特定接口,而无需通过网络。使用以下内容,我能够让 ping 通过网络传输(从帖子),但我不确定如何让 UDP 做同样的事情。

ifconfig eth2 10.50.0.1/24
ifconfig eth3 10.50.1.1/24

# nat source IP 10.50.0.1 -> 10.60.0.1 when going to 10.60.1.1
iptables -t nat -A POSTROUTING -s 10.50.0.1 -d 10.60.1.1 -j SNAT --to-source 10.60.0.1

# nat inbound 10.60.0.1 -> 10.50.0.1
iptables -t nat -A PREROUTING -d 10.60.0.1 -j DNAT --to-destination 10.50.0.1

# nat source IP 10.50.1.1 -> 10.60.1.1 when going to 10.60.0.1
iptables -t nat -A POSTROUTING -s 10.50.1.1 -d 10.60.0.1 -j SNAT --to-source 10.60.1.1

# nat inbound 10.60.1.1 -> 10.50.1.1
iptables -t nat -A PREROUTING -d 10.60.1.1 -j DNAT --to-destination 10.50.1.1

ip route add 10.60.1.1 dev eth2
arp -i eth2 -s 10.60.1.1 00:1B:21:C1:F6:0F # eth3's mac address

ip route add 10.60.0.1 dev eth3 
arp -i eth3 -s 10.60.0.1 00:1B:21:C1:F6:0E # eth2's mac address

ping 10.60.1.1

我希望能够在 上广播 UDP 消息10.50.0.1,并在 上阅读它10.50.1.1

我该如何做这件事?

答案1

这不是一个完整的答案,因为我目前在用手机,但是这对于评论来说太长了:

默认情况下,所有 NIC 都由 Linux 内核中的单个 IP 堆栈管理,因此内核“知道”从 eth2 上的 IP 地址 10.50.0.1 到 10.50.1.1 的流量不需要发送到 10.50.0.0/24 子网中的路由器,并且将完全绕过该路由并将其直接发送到 eth3。

一般来说,这是明智的做法,因为这几乎不会给您带来延迟,而且带宽比 eth2 和 eth3 以及其间的路由器的实际线速要大得多。

您可以通过设置特定的路由指令来防止这种情况发生,这似乎是您一直在尝试使用 iptables 的方法,但可以说更好的解决方案是利用网络命名空间。通过将每个 NIC 分配给不同的命名空间,Linux 内核将不再将来自 eth2 到 eth3 的流量视为本地流量,并且它们将通过线路发出,而不是简单地将数据包从 10.50.0.1 发送到 10.50.1.1 的内存中。

相关内容