Iptables
為什麼 POSTROUTING 鏈會發生 SNAT,而 PREROUTING 鏈會發生 DNAT?
為什麼
SNAT
(修改源 IP 和/或埠)發生在錶鍊nat
中POSTROUTING
,即在路由之後?為什麼DNAT
(修改目標 IP ant/或埠)會在PREROUTING
鏈中發生?我猜後者是因為 PC 中可能有多個具有不同專用網路的 NIC,並且如果目標 IP 地址仍然是可公開路由的地址,PC 不知道如何路由數據包?但是,因為SNAT
我看不出為什麼這不能發生在PREROUTING
.
通常,SNAT 的主要標準是“從給定介面流出的流量”(即
-o eth0
)。數據包將發出的介面由路由決定,因此要應用該標準,您需要在POSTROUTING
上下文中執行它。DNAT 會重寫數據包的目標地址,這意味著它會影響數據包的去向——例如,看起來像是要發往網關的數據包最終可能會被重寫以轉而發送到網路上的機器。由於您希望路由能夠在做出決定時考慮到重寫的目的地,以便數據包實際到達它需要的地方,因此 DNAT 應該在
PREROUTING
上下文中執行。
我很確定來自本地機器的任何東西都不會通過
PREROUTING
表格,如這個很棒的 ASCII 數字所示。