Iptables

如何將 DNAT 限制為僅一個公共 IP?

  • February 13, 2022

在單個網路介面上具有多個公共 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>

我在 PREROUTING 規則中嘗試了 -dst IPb,但這實際上導致該規則根本沒有被觸發(埠轉發停止)。

$$ 3 $$

原來這是正確的方法,但是:條目IPb 必須包含子網長度。在這種情況下,我只是使用IPb/32它,它應該可以正常工作。

引用自:https://unix.stackexchange.com/questions/690450