在虚拟机管理程序上多个公网IP在一个单一网络接口,有两组虚拟机。
- A 组成员的公共 IP 直接通过主机接口(通过设置路由的网桥)路由到他们。 [1]
- B 组成员位于具有 NAT 配置的网桥上,因此他们获得私有 IP,并且他们的连接通过一个特定的公共 IP 进行 NAT。我们称这个共享地址为
IPb
。 [2]
对于IPb
某些端口上的传入连接,将转发到某些 B 组成员。我遇到的问题是 DNAT(端口转发)规则不仅应用于通过 的传入数据包IPb
,还应用于来自任何其他公共 IP 的传入数据包。
如何将 DNAT 规则限制为仅针对定向到 的数据包IPb
?
我试过-dst
IPb
在PREROUTING
规则中,但这实际上导致规则根本没有被触发(端口转发停止)。 [3]
谢谢
[1]
auto eth0
iface eth0 inet static
address <eth0-main-ip>/32
gateway <gateway-ip>
pointopoint <gateway-ip>
#GroupA Bridge:
auto vmbr12
iface vmbr12 inet static
address <eth0-main-ip>/32
bridge-ports none
bridge-stp off
bridge-fd 0
up ip route add <Public-IPa>/32 via <eth0-main-ip> dev vmbr12
down ip route del <Public-IPa>/32 via <eth0-main-ip> dev vmbr12
.
.
.
[2]
#GroupB Bridge:
auto vmbr4
iface vmbr4 inet static
address 10.0.0.1/16
bridge-ports none
bridge-stp off
bridge-fd 0
post-up echo 1 > /proc/sys/net/ipv4/ip_forward
post-up iptables -t nat -A POSTROUTING -s '10.0.0.0/16' -o eth0 -j MASQUERADE
post-up iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 22 -j DNAT --to 10.0.101.1:22
post-up iptables -A FORWARD -p tcp -d 10.0.101.1 --dport 22 -j ACCEPT
post-down iptables -t nat -D POSTROUTING -s '10.0.0.0/16' -o eth0 -j MASQUERADE
post-down iptables -D PREROUTING -t nat -i eth0 -p tcp --dport 22 -j DNAT --to 10.0.101.1:22
post-down iptables -D FORWARD -p tcp -d 10.0.101.1 --dport 22 -j ACCEPT
.
.
.
[3]
#Using IPb in PREROUTING rule
<snip>
post-up iptables -t nat -A POSTROUTING -s '10.0.0.0/16' -o eth0 -j MASQUERADE
post-up iptables -A PREROUTING -t nat -i eth0 -p tcp -dst IPb --dport 22 -j DNAT --to 10.0.101.1:22
post-up iptables -A FORWARD -p tcp -d 10.0.101.1 --dport 22 -j ACCEPT
post-down iptables -t nat -D POSTROUTING -s '10.0.0.0/16' -o eth0 -j MASQUERADE
post-down iptables -D PREROUTING -t nat -i eth0 -p tcp -dst IPb --dport 22 -j DNAT --to 10.0.101.1:22
post-down iptables -D FORWARD -p tcp -d 10.0.101.1 --dport 22 -j ACCEPT
</snip>
答案1
我在 PREROUTING 规则中尝试了 -dst IPb,但这实际上导致规则根本没有被触发(端口转发停止)。 [3]
事实证明这是正确的方法,但是:IPb
必须包括子网长度。在这种情况下,我只是使用了它IPb/32
并且它按预期工作了。