我有一台 Linux 机器(我想将其用作网关)和另外两台机器 A 和 B。网关机器有 eth0、eth1 和 eth2。 eth1 连接到机器 A,eth2 连接到机器 B。我希望能够从 A ping 到 B,反之亦然。我尝试使用 来做到这一点iptables
,并添加了转发规则:
iptables -A FORWARD -i eth1 -o eth2 -j ACCEPT
iptables -A FORWARD -i eth2 -o eth1 -j ACCEPT
但当我尝试 ping 时,却收到“主机无法访问”的消息。
当我跑步时
iptables -L -n -V
我可以看到转发规则有 0 个数据包和 0 个字节。现在我知道我可能会错过更多东西,但看起来转发链从未到达。根据文档,如果它不是目的地,它将进入转发链。
编辑1:
我清理了 iptables 并使用以下命令从头开始
iptables -A FORWARD -i eth1 -o eth2 -j ACCEPT
iptables -A FORWARD -i eth2 -o eth1 -j ACCEPT
iptables -t nat -A PREROUTING -i eth1 -j DNAT --to-destination y.y.y.y
iptables -t nat -A PREROUTING -i eth2 -j DNAT --to-destination x.x.x.x
iptables -t nat -A POSTROUTING -o eth2 -d y.y.y.y -j SNAT --to-source x.x.x.x
iptables -t nat -A POSTROUTING -o eth1 -d x.x.x.x -j SNAT --to-source y.y.y.y
仍然提示“网络无法访问”
答案1
您的误解是您似乎认为iptables
转发是这样进行的。
您在第一个示例中使用的规则仅允许转发。默认情况下已允许转发,因此这些规则仅作为稍后出现的一般拒绝规则的例外才有意义。
您只需启用数据包转发
echo 1 > /proc/sys/net/ipv4/ip_forward
当然,你的网关应该是A
和的默认网关B
,或者至少必须是互相到达的网关。因此,如果它在启用转发的情况下不起作用,您应该在所有三台计算机上包含路由表。