為什麼連接到網橋的物理介面在我的情況下無法通過 Internet 訪問?
我有這樣的網路拓撲:
你看,
em1
(1.1.8.209)是物理介面,我可以通過網際網路進行通信。我創建了兩個 vm 實例:PID 8740
和PID 8817
,都使用網路 IP1.1.8.210/29
和1.1.8.211/29
,都使用公共 IP 地址。現在我可以通過 Internet 與 em1 進行通信了。
但我有一個要求,我想直接訪問這兩個虛擬機,所以我想將 em1 附加到
br0
.然後我執行了這個:
brctl addif br0 em1
拓撲變成這樣:
但是,執行此命令後,出現錯誤,我無法再進行通信
1.1.8.209
。然後我刪除了附件brctl delif br0 em1
,然後我現在可以訪問1.1.8.209
了。為什麼我會遇到這個問題?不明白,請幫忙解釋一下原因。
當介面成為橋接埠時,它不再參與路由。
此部落格中描述了低級別的詳細資訊正確隔離 Linux 網橋:
- 將幀移交給全域或設備特定的協議處理程序(例如 IPv4、ARP、IPv6)。
對於橋接介面,核心已經配置了一個設備特定的接收處理程序,
br_handle_frame()
. 除了 STP 和 LLDP 幀或啟用了“路由”外,此功能不允許在傳入介面的上下文中進行任何額外處理。因此,在這種情況下永遠不會執行協議處理程序。這種橋接埠的 IP 地址與傳入的數據包無關。將其設置在它所在的位置仍然會破壞傳出數據包的正確路由,因為它們仍然可以直接通過橋接埠發送(當它們不再應該發送時)。
必須做的是將IP地址移動到系統(或網路名稱空間,甚至是同一位置的veth對的另一個自由端),其另一端連接到網橋,或網橋的自身埠,即網橋本身. 在此移動期間總會有一個小的時間視窗存在中斷,因此本地更改此配置的操作不得依賴於網路訪問(例如:不得依賴於使用中斷路由通過 shell 遠端鍵入命令)。
我將在下面僅使用具有更新語法的更新工具。
例如:
ip address flush dev em1 ip address add 1.1.8.209/29 dev br0
相反,讓網橋不參與路由並使用額外的veth對的末端(在同一網路命名空間中)參與路由的另一種方法可能是:
ip address flush dev em1 ip link add name em1twin type veth peer name br0portem1twin ip link set br0portem1twin master br0 up ip link set em1twin up ip address add 1.1.8.209/29 dev em1twin
在這兩種情況下,如果預設路由(或其他路由)依賴於該地址的存在,則還必須再次添加該路由,因為它消失了。