Iptables

iptables nat 同一個埠,多個提供商

  • February 10, 2021

我的配置:

# ip route sh zzz.zzz.zzz.0/24 dev eth3 proto kernel scope link src zzz.zzz.zzz.1 yyy.yyy.yyy.0/24 dev eth1 proto kernel scope link src yyy.yyy.yyy.146 xxx.xxx.xx8.0/23 dev eth4 proto kernel scope link src xxx.xxx.xx9.47 169.254.0.0/16 dev eth3 scope link metric 1002 169.254.0.0/16 dev eth4 scope link metric 1003 169.254.0.0/16 dev eth1 scope link metric 1004 default via xxx.xxx.xxx.1 dev eth4

# ip rule sh 0: from all lookup local 217: from xxx.xxx.xx9.47 lookup table1 219: from yyy.yyy.yyy.146 lookup table2 32766: from all lookup main 32767: from all lookup default

# ip ro sh table table2 zzz.zzz.zzz.0/24 dev eth3 proto kernel scope link src zzz.zzz.zzz.1 yyy.yyy.yyy.0/24 dev eth1 proto kernel scope link src yyy.yyy.yyy.146 default via yyy.yyy.yyy.1 dev eth1

# ip ro sh table table1 zzz.zzz.zzz.0/24 dev eth3 proto kernel scope link src zzz.zzz.zzz.1 xxx.xxx.xx8.0/23 dev eth4 proto kernel scope link src xxx.xxx.xx9.47 default via xxx.xxx.xx8.1 dev eth4

iptables -t nat -L POSTROUTING MASQUERADE all -- * eth4 0.0.0.0/0 0.0.0.0/0 MASQUERADE all -- * eth1 0.0.0.0/0 0.0.0.0/0

rp_filter 設置為 0(嘗試使用 2,同樣的事情)

當我嘗試從 Internet 訪問 xxx.xxx.xx9.47 或 yyy.yyy.yyy.146 時,它們與此配置完美配合。從區域網路(zzz.zzz.zzz.0/24)網際網路執行完美,流量通過預設路由出去。

我將埠轉發到 zzz.zzz.zzz.0/24 區域網路中的電腦

# iptables -t nat -L PREROUTING -nv DNAT tcp -- eth4 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:aa to:zzz.zzz.zzz.3:bb DNAT tcp -- eth1 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:aa to:zzz.zzz.zzz.3:bb

從網際網路上,我只能使用預設路由中的 xxx.xxx.xx9.47(來自預設路由的 ip)在埠 aa 上訪問 zzz.zzz.zzz.3。我從 yyy.yyy.yyy.146 獲得連接失敗,這不是預設路由。eth1 上的 tcpdump 僅在我 tcpdump 預設路由介面(本例為 eth4)時顯示傳入流量

如果我將預設路由更改為 eth1,則會發生完全相反的事情。我從埠 aa 上的 yyy.yyy.yyy.146 得到響應,來自 xxx.xxx.xx9.47 的連接失敗 tcpdump eth1 我看到嘗試訪問 xxx 時嘗試使用 xxx.xxx.xx9.47 離開 eth1 的數據包.xxx.xx9.47 在 aa 埠上

用 snat 改變了偽裝 # iptables -t nat -L POSTROUTING SNAT all -- * eth1 0.0.0.0/0 0.0.0.0/0 to:yyy.yyy.yyy.146 SNAT all -- * eth4 0.0.0.0/0 0.0.0.0/0 to:xxx.xxx.xx9.47

並且預設路由上的 tcpdump 仍然顯示帶有源 yyy.yyy.yyy.146 的響應包離開 eth4 所以.. snat 或偽裝工作,contrack 工作。我真的不明白為什麼它只嘗試只在預設介面上響應,即使源 ip 來自另一個介面……以及它為什麼會在一個介面上使用另一個介面。作業系統是centos 6.8。

當數據包通過介面 X 進入,並由同一台機器立即響應時,您的基於源的路由規則可以擷取響應,因為它的源 IP 地址必然與規則匹配。

當這些數據包隨後通過介面 Y 轉發到另一個 IP 時,通信的第一部分將起作用。但是一旦第一個響應數據包從這個其他 IP 到達,它將使用自己的源 IP 地址進入路由規則解析器,而不是這個路由器的。然後它將錯過基於源的路由規則,而是匹配預設查找,這將像往常一樣基於目標。

您需要做的是在數據包到達介面 X 時對其進行標記,該標記在轉發過程中保持不變,然後在路由規則中匹配該標記,以便使用不同的傳出路由表。

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