我有两台主机,每台都有两个网络接口:
主机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 来根据路由表了解数据包将去往何处