Linux

ping 是否省略了 iptables / 後路由規則

  • October 23, 2018

我有一台安裝了 proxmox 的伺服器,只有 1 個出站連接 (eth0)。

為了使機器相互連接,我在介面配置中創建了一個網橋(vmbr0),並根據 Proxmox 網路模型(子點 NAT)對其進行了相應的配置。

這座橋擁有 IP 10.1.1.1,在我的理解中充當本地網路和廣闊世界之間的通道。

為此,在伺服器上實施了以下 iptable 策略:

Chain FORWARD (policy DROP)
target     prot opt source               destination
ACCEPT     all  --  10.1.1.0/24          anywhere
ACCEPT     all  --  anywhere             10.1.1.0/24

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
SNAT       all  --  10.1.1.0/24          anywhere             to:x.x.x.x

當我從伺服器上安裝的一個虛擬機 ping Google DNS 伺服器並通過橋連接使用 :ping 8.8.8.8時,虛擬機能夠從Google DNS 伺服器獲得 ping 結果,因此 NAT 似乎正在工作。

(nat 再次適用於整個子網 (10.1.1.0/24) )

如果我這樣做:ping -I vmbr0 8.8.8.8但是,在主機上,ping 命令會失敗。此 ping 命令使用橋接介面來 ping Google DNS 伺服器,我的期望是,POSTROUTING 策略也可以使其能夠與 Google DNS 伺服器通信。

所以簡而言之,當其他客戶端使用網橋作為網關時,他們可以連接到網際網路,但是如果介面本身被選擇為傳出介面,它就找不到路由。

所以這引出了我的問題,是否明確使用介面以某種方式跳過後路由規則,並且真的被視為相關機器上路由的絕對端點?- in a sense: vmbr0 stays vmbr0 and never will be masqueraded to eth0 if you choose to ping over it -

man ping,加粗我的:

-I interface

interface 要麼是地址,要麼是介面名稱。如果 interface 是一個地址,它將源地址設置為指定的介面地址。如果 interface 在interface name中,它將源介面設置為指定的介面。

問題在於強制使用介面ping -I vmbr0而不是讓系統最終選擇正確的介面ping -I 10.1.1.1

此外,即使這與(見下文)沒有什麼不同,您也應該了解在主機上執行命令時nat/POSTROUTING沒有進行filter/FORWARD路由,因此某些鏈(例如:)可能不適用(但nat/POSTROUTING仍然適用,請參閱之後)。請記住,根據您的規則,在主機而不是路由VM 上執行命令時,這可能會產生不同的結果,即使使用正確的 ping 命令並非如此。

Netfilter 和通用網路示意圖中的這個數據包流顯示,在OUTPUT為來自本地程序的數據包遍歷不同的鏈nat/POSTROUTING之後,仍然會被遍歷,所以是的,如果您的數據包通過eth0它出去,它仍然會被 SNATed:那是通過使用ping -I 10.1.1.1 8.8.8.8

相反,當使用 強制介面時ping -I vmbr0 8.8.8.8,如果您在其上執行tcpdumpvmbr0您可能會看到從 10.1.1.1 到 8.8.8.8 的 ARP 請求不會得到答案。

最後一個問題:是的,強制路由不能讓數據包到達正確的目的地。你永遠不會vmbr0被偽裝,因為 SNAT/MASQUERADE 是在數據包的 IP上完成的,而不是在介面上完成的,它的應用取決於它們到目的地的路由。

引用自:https://unix.stackexchange.com/questions/464682