将 UDP 流量从一台主机转发到另一台主机

将 UDP 流量从一台主机转发到另一台主机

我有两台主机,每台都有两个网络接口:

主机1:
eth0:172.16.125.5
eth1:172.165.8.55

主机2:
eth0:172.16.125.6
eth1:172.165.8.56

我想将所有到host1:eth1端口1234的UDP流量转发到host2:eth1端口1234,即

172.165.8.55:1234 -> 172.165.8.56:1234

阅读完此处的相关文章后,我启用了 ipv4_forwarding,然后向 iptables 添加了以下规则:

iptables -t nat -A PREROUTING -p udp -d 172.165.8.55 --dport 1234 -j DNAT --to-destination 172.165.8.56:1234
iptables -A FORWARD -p udp -d 172.165.8.56 --dport 1234 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

我发现只有来自 eth1 子网 172.165.8.x 的源 IP 的流量才会被转发。来自其他地方的流量不会被转发。

因此,我尝试使用同一组规则,看看是否可以使用 eth0 从 host1 转发到 host2,即

172.16.125.5:1234-> 172.16.125.6:1234

iptables -t nat -A PREROUTING -p udp -d 172.16.125.5 --dport 1234 -j DNAT --to-destination 172.16.125.6:1234
iptables -A FORWARD -p udp -d 172.16.125.6 --dport 1234 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

在 eth0 接口上,来自任何源 IP 的所有流量都会被转发。为什么在 eth1 上情况会有所不同?

以下是 host1 上的路由表:

172.16.125.0/24 dev eth0  proto kernel  scope link  src 172.16.125.5
172.165.8.0/24 dev eth1  proto kernel  scope link  src 172.165.8.55
default via 172.16.125.1 dev eth0

我注意到默认路由是为 eth0 配置的。这就是为什么转发在 eth0 上有效而不是在 eth1 上有效的原因吗?

我还注意到 eth0 和 eth1 之间没有路由。这就是为什么源 IP 在 eth1 子网之外的流量无法在 eth1 上转发的原因吗?

附加信息:因此,nat 表的 PREROUTING 链中的规则确实有效,但 filter 表的 FORWARD 链中的规则无效。当源 IP 不在该子网中时,我的主机不知道如何将流量路由到新目标 192.20.125.56。我该如何改变这种情况?

答案1

使用 iptables -j LOG 和 tcpdump 来调试问题所在

-j LOG 可用于 NAT 和过滤表

您还可以使用 ip route get XXXX 来根据路由表了解数据包将去往何处

相关内容