我有一台 KVM 机器,上面有两个客户机和以下路由:
89.114.150.3 (eth0:0 alias)->192.168.122.1(virbr0)->192.168.122.5(vint0)
到这两台机器中的一台(192.168.122.5 和 192.168.122.6)。我在 iptables 中重写了规则:
iptables -t nat -A PREROUTING -p tcp -d 89.114.150.3 --dport 80 -j DNAT --to 192.168.122.1:80
iptables -t nat -A PREROUTING -p tcp -d 192.168.122.1 --dport 80 -j DNAT --to 192.168.122.5:80
iptables -I FORWARD -d 192.168.122.5/32 -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
iptables -t nat -A POSTROUTING -p tcp -s 192.168.122.5 --sport 80 -j SNAT --to-source 192.168.122.1
iptables -t nat -A POSTROUTING -p tcp -s 192.168.122.1 --sport 80 -j SNAT --to-source 89.114.150.3
但我遇到了一个问题 - 这条路由也不起作用... 80 - 连接被拒绝。为什么?
答案1
让我们在 iptables 中看一下这个:
iptables -t nat -A PREROUTING -p tcp -d 89.114.150.3 --dport 80 -j DNAT --to 192.168.122.1:80
好的,将数据包发送到 192.168.122.1:80。大部分规则iptables
都是终止规则。LOG
作为目的地,其他一些是例外。任何与此匹配的规则,我们都会完成链。
iptables -t nat -A PREROUTING -p tcp -d 192.168.122.1 --dport 80 -j DNAT --to 192.168.122.5:80
除非它确实进入了目的地为 192.168.122.1 的计算机,否则不会留下任何匹配项。这不会影响上面的数据包。我猜这就是你的目标。
使用 iptables 重写最终目的地,而不是尝试多次修改数据包以匹配路由。您的路由表将负责将数据包通过网桥发送到正确的接口。因此,您的第一条规则应为:
iptables -t nat -A PREROUTING -p tcp -d 89.114.150.3 --dport 80 -j DNAT --to 192.168.122.5:80
考虑其他规则。您的 POSTROUTING 规则也需要工作。如果您的 FORWARD 链中有其他描述丢弃或拒绝数据包的规则,请注意您还需要接受 ESTABLISHED、RELATED。