為什麼 SNAT 透過在表中設定一條規則來運作,而無需在 PREROUTING 鏈中設定規則?

為什麼 SNAT 透過在表中設定一條規則來運作,而無需在 PREROUTING 鏈中設定規則?

我對 iptables 的 SNAT 有一些疑問。假設有一台路由器充當 DHCP 伺服器來分配我的 LAN 中的私有 IP,並且 NAT 使我的 LAN 中的主機可以存取公共網際網路。

路由器有兩個接口,一個“eth0”具有動態公共 IP,另一個“eth1”具有私有 IP 192.168.0.1,子網路為 192.168.0.0/24。假設該路由器上啟用了 ipv4 封包轉送。我知道我必須在 NAT 表中設定一項規則,用於將封包的來源 IP 從 LAN 中的主機偽裝到公共網際網路。該規則可能類似於下面的規則。

iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

我明白為什麼我需要該規則,因為來自 LAN 的封包需要公共 IP 來進行網路路由。

但我不明白為什麼我不需要在PREROUTING回應資料包鏈中設定另一個規則來修改它們的目標IP位址。

修改這些回應資料包的目標位址是我剛剛設定的 MASQUERADE 規則的預設行為嗎?

另一個問題是iptable如何知道哪些封包應該被修改?

謝謝。

答案1

iptables NAT 是有狀態的。使用“nat”表將自動加載連線系統,它保留活動連接清單並識別哪個資料包屬於哪個連接。 conntrack 系統註冊與 iptables 規則分開工作的內部鉤子,並將自動轉換它識別的資料包。

conntrack -L(您可以使用或透過 /proc/self/net/nf_conntrack查看 conntrack 狀態表。)

使用這個系統,「nat」表中的規則實際上只會匹配最初的屬於每個連接的資料包,而不是每個單獨的資料包。一旦初始資料包匹配,相應的 conntrack 條目就會被標記為需要 NAT(或不需要),並且其他資料包會自動轉換,甚至無需通過“nat”表。

相關內容