如何将 DNAT 限制为仅一个公共 IP?

如何将 DNAT 限制为仅一个公共 IP?

在虚拟机管理程序上多个公网IP在一个单一网络接口,有两组虚拟机。

  • A 组成员的公共 IP 直接通过主机接口(通过设置路由的网桥)路由到他们。 [1]
  • B 组成员位于具有 NAT 配置的网桥上,因此他们获得私有 IP,并且他们的连接通过一个特定的公共 IP 进行 NAT。我们称这个共享地址为IPb。 [2]

对于IPb某些端口上的传入连接,将转发到某些 B 组成员。我遇到的问题是 DNAT(端口转发)规则不仅应用于通过 的传入数据包IPb,还应用于来自任何其他公共 IP 的传入数据包。

如何将 DNAT 规则限制为仅针对定向到 的数据包IPb

我试过-dstIPbPREROUTING规则中,但这实际上导致规则根本没有被触发(端口转发停止)。 [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并且它按预期工作了。

相关内容