Networking

在 nat 預路由表中轉發數據包時如何在數據包上設置標記?

  • June 7, 2013

我有一些像這樣的埠轉發規則

iptables -t nat -A PREROUTING -p tcp --dport 46000 -j DNAT --to-destination 172.16.8.2:46000
iptables -A FORWARD -p tcp -d 172.16.8.2 --dport 46000 -j ACCEPT

我想知道是否有一種方法可以在一行而不是兩行中添加新的轉發規則,這樣我就不必兩次輸入相同的數據。我的意思是這樣的規則:

  1. 在 nat PREROUTING 中將數據包轉發到目的地並標記它
  2. 在過濾器 FORWARD 中允許使用規則 1 標記的所有數據包

是否可以?

每個 DNAT 只使用一個命令是不可能做到這一點的——除非……見下文。但也可以只輸入一次數據。

讓我們為獲得 DNAT 和轉發的連接定義標記範圍 1024–2047。

mangle 中每個 DNAT 匹配條件的一行:

iptables -t mangle -A PREROUTING -p tcp --dport 46000 -j MARK --set-mark 0x400
iptables -t mangle -A PREROUTING -p tcp --dport 46001 -j MARK --set-mark 0x401
iptables -t mangle -A PREROUTING -p tcp --dport 46002 -j MARK --set-mark 0x402

nat 中每個命令一個:

iptables -t nat -A PREROUTING -m mark --mark 0x400 -j DNAT \
 --to-destination 172.16.8.2:46000
iptables -t nat -A PREROUTING -m mark --mark 0x401 -j DNAT \
 --to-destination 172.16.8.2:46001
iptables -t nat -A PREROUTING -m mark --mark 0x402 -j DNAT \
 --to-destination 172.16.8.2:46002

過濾器中的所有命令:

iptables -A FORWARD -m mark --mark 0x400/0x400 -j ACCEPT

-j DNATBTW:如果沒有更改,則無需提供目標埠。

編輯1:

如果您在不明確允許連接的情況下這樣做,如果您可以允許所有已進行 DNAT 處理的內容,則可以這樣做。在那種情況下,你會堅持你的

iptables -t nat -A PREROUTING -p tcp --dport 46000 -j DNAT --to-destination 172.16.8.2:46000

但對所有人只有一個 FORWARD 規則:

iptables -A FORWARD -m conntrack --ctstate DNAT -j ACCEPT

引用自:https://serverfault.com/questions/514116