ping 是否省略了 iptables / 後路由規則
我有一台安裝了 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
,如果您在其上執行tcpdump
,vmbr0
您可能會看到從 10.1.1.1 到 8.8.8.8 的 ARP 請求不會得到答案。最後一個問題:是的,強制路由不能讓數據包到達正確的目的地。你永遠不會
vmbr0
被偽裝,因為 SNAT/MASQUERADE 是在數據包的 IP上完成的,而不是在介面上完成的,它的應用取決於它們到目的地的路由。