我构建了一个由两台机器组成的私有网络,它们都有两个网络接口,这是网络信息:
机器1:
eth0 10.0.0.11 (private net)
eth1 10.82.80.208 (Campus Network ip)
机器2:
eth0 10.0.0.21 (private net)
eth2 10.82.80.207 (Campus Network ip)
我想通过 iptables dnat 在我的校园网机器(10.82.80.206)上访问 10.0.0.11,而不是使用校园网 IP 地址。例如,我想将数据包的目标从 10.0.0.11 更改为 10.82.80.208。
我正在尝试使用 iptables 命令,例如:
iptables -t nat -A PREROUTING -i eth0 -p tcp -d 10.0.0.11 -j DNAT --to-destination 10.82.80.208
iptables -t nat -A PREROUTING -i eth0 -p icmp -d 10.0.0.11 -j DNAT --to-destination 10.82.80.208
iptables -t nat -A PREROUTING -i eth0 -p udp -d 10.0.0.11 -j DNAT --to-destination 10.82.80.208
但是当我尝试 ping 10.0.0.11 时似乎没用,主机仍然无法访问,我怎样才能将机器中口袋的目的地从 10.0.0.11 更改为 10.82.80.208?
答案1
您犯的第一个错误是使用 PREROUTING 链来处理本地生成的数据包。在您自己的机器上生成的数据包永远不会遍历 PREROUTING,而只会遍历 OUTPUT 和 POSTROUTING 链。您应该在 OUTPUT 链中对本地生成的数据包进行 NAT,因此您的规则应如下所示:
iptables -t nat -A OUTPUT -i eth0 -p tcp -d 10.0.0.11 -j DNAT --to-destination 10.82.80.208
iptables -t nat -A OUTPUT -i eth0 -p icmp -d 10.0.0.11 -j DNAT --to-destination 10.82.80.208
iptables -t nat -A OUTPUT -i eth0 -p udp -d 10.0.0.11 -j DNAT --to-destination 10.82.80.208
仅当您的机器(10.82.80.206)充当校园网络上其他机器的 10.0.0.11/21 网关时,您才应该使用 PREROUTING。