為什麼每個人都使用 MASQUERADE/SNAT 而不是 NAPT/PAT?
故事
我有一個 VPN 線保護虛擬介面
wg0
(可以是其他任何東西)和一個物理介面eth0
。我想將數據包從 VPN 路由到我的 LAN,或從一個介面路由到另一個介面。幾乎所有的部落格、文章、教程都建議使用
MASQUERADE
或Source NAT
僅使用:iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
而且,
IP masquerade
只是一個SNAT(Source NAT),它不會改變源埠。問題
- 我認為我應該使用NAPT/PAT是不是錯了?
- 為了完整起見,如何使用 iptables 和/或 nftables 添加 NAPT/PAT 規則?
想法
wg0
由主機生成並從(或任何其他虛擬/物理介面)轉發的數據包之間可能存在(源埠)衝突。恕我直言,必須使用 NAPT 來避免這些衝突。
如果目標可以將其流量路由到源,則不需要 NAT 或 PAT。
例如,如果 10.8.0.0/24 中的 VPN 客戶端想要與 192.168.1.0/24 中的 LAN 設備通信,則不需要 NAT/PAT,只要相關設備可以路由到其他網路(通過它們的網關)。
當源在 rfc1918(私有 IP)網路中而目標是公共 IP 時,由於 rfc1918 網路無法通過 Internet 路由,因此需要通過 NAT 將私有 IP 替換為公共 IP。這是源地址轉換。這項工作可以由 SNAT 完成,而不是 PAT。
此外,假設 SNAT/MASQUERADE 不更改源埠是錯誤的。
–to-source 選項用於指定數據包應使用的源。此選項最簡單的方法是採用一個 IP 地址,我們希望將其用作 IP 標頭中的源 IP 地址。如果我們想在多個 IP 地址之間進行平衡,我們可以使用一個 IP 地址範圍,用連字元分隔。例如,–to–source IP 編號可能類似於上述範例:194.236.50.155-194.236.50.160。我們打開的每個流的源 IP 將從這些流中隨機分配,並且單個流將始終對該流中的所有數據包使用相同的 IP 地址。我們還可以指定 SNAT 使用的埠範圍。然後,所有源埠將被限制在指定的埠中。規則的埠位將類似於上面的範例:1024-32000。如果可能,iptables 將始終嘗試避免進行任何埠更改,但如果兩台主機嘗試使用相同的埠,iptables 會將其中一個映射到另一個埠。如果未指定埠範圍,則如果需要,則將所有 512 以下的源埠映射到 512 以下的其他埠。源埠 512 和 1023 之間的埠將映射到 1024 以下的埠。所有其他埠將映射到1024或以上。如前所述,iptables 將始終嘗試維護建立連接的實際工作站使用的源埠。請注意,這與目標埠無關,因此如果客戶端嘗試與防火牆外的 HTTP 伺服器建立聯繫,它將不會映射到 FTP 控制埠。
https://www.frozentux.net/iptables-tutorial/iptables-tutorial.html#SNATTARGET
請注意,如果您的設備想要訪問給定目標埠上的遠端伺服器,則作業系統可能已經分配了超過 1024 的隨機源埠。在埠 443 上訪問遠端 HTTPS 伺服器並不涉及源埠是443.