Linux

具有非對稱路由的 Linux IPTables 目標 NAT?

  • July 26, 2010

當流量離開與到達不同的介面時,處理 DNAT 的正確方法是什麼?發生這種情況時,回复似乎沒有自動替換源地址,就像它離開它到達的相同介面時那樣。

編輯——SNAT 不適合我:

Chain PREROUTING (policy ACCEPT 386 packets, 23372 bytes)
pkts bytes target     prot opt in     out     source               destination         
   0     0 DNAT       all  --  *      *       0.0.0.0/0            12.12.12.5         to:10.7.0.5 

Chain POSTROUTING (policy ACCEPT 288 packets, 18672 bytes)
pkts bytes target     prot opt in     out     source               destination         
   0     0 SNAT       all  --  *      eth0    10.7.0.5             0.0.0.0/0           to:12.12.12.5 
   0     0 SNAT       all  --  *      eth3    10.7.0.5             0.0.0.0/0           to:12.12.12.5 
   8   550 MASQUERADE  all  --  *      eth0    172.16.14.0/30       0.0.0.0/0           
   0     0 MASQUERADE  all  --  *      eth0    10.7.0.0/24          0.0.0.0/0           

Chain OUTPUT (policy ACCEPT 23 packets, 1572 bytes)
pkts bytes target     prot opt in     out     source               destination

所以在上面兩個路由器有相同的表和相同的界面佈局。兩個路由器上的 eth0 都是 Internet 連接,每個路由器上的 eth1 連接到同一個 LAN (10.7.0/24)。eth3 將兩個路由器相互連接起來。

正在發生的事情是從 Internet 上的某個位置 ping 12.12.12.5 地址。回复通過 eth0 進入路由器 B,然後通過 eth1 輸出,目標 nat 工作正常。回复在路由器 A 上進入 eth1,並通過路由器 A 上的 eth0 退出 Internet。但是,源地址沒有被覆蓋,回復將返回到發送 ping 的設備,地址為 10.7.0.5*。

*是的,他們實際上使用私有源 IP 跨越 20 跳,並且不會在任何地方被壓扁——有點神奇)。

更多編輯:

好的,顯然 SNAT(至少從 iptables 手冊中看起來)只有在它是有狀態的情況下才匹配。所以我需要無狀態的nat。這可以使用 iproute2 來完成,但根據http://linux-ip.net/html/nat-dnat.html#ex-nat-dnat-full也可以通過在 SNAT 中使用 –to-destination 來模擬iptables。但是,我的 ubuntu 10.04 只是說未知選項--to-destination

據我所知,只要出站響應數據包由路由/對傳入請求進行 DNAT 處理的同一路由器路由,您所描述的地址重寫行為就會發生。但是,如果高可用性路由器池中的任何其他 N+1 路由器正在處理出站響應數據包,它們將不會在 Netfilter 狀態數據庫中“看到”該連接。

聽起來您想要一個共享 NAT 狀態機資訊的高可用性 Netfilter 路由器。該論文中提到的 ct_sync 工具大部分已被廢棄,但 conntrack-tools 中的conntrackd工具已被開髮用於執行與 ct_sync 相同的一些操作。

如果您計劃進行有狀態數據包過濾(或 NAT,它實際上只是有狀態數據包過濾的超集),那麼您將需要一種方法來分發狀態數據庫(或者,在網路並在每個主機上進行狀態過濾)。

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