為什麼在我的情況下,連接到網橋的實體介面無法透過 Internet 存取?

為什麼在我的情況下,連接到網橋的實體介面無法透過 Internet 存取?

我有一個這樣的網路拓撲:

你看,em1(1.1.8.209)是我可以透過網路進行通訊的實體介面。我建立了兩個虛擬機器實例:PID 8740PID 8817,都使用網路 IP 1.1.8.210/29,並且1.1.8.211/29,都是公用 IP 位址。

現在我可以透過網路與em1交流。

但我有一個要求,我想直接訪問兩個虛擬機,所以我想將 em1 附加到br0.

然後我執行了這個:

brctl addif br0 em1

拓樸變成這樣:

在此輸入影像描述

但是,執行此命令後,出現錯誤,無法1.1.8.209再與任何人通訊。然後我刪除了附件brctl delif br0 em1,現在就可以存取了1.1.8.209

為什麼我會遇到這個問題?不太明白,請幫忙解釋一下原因。

答案1

當介面成為橋接連接埠時,它不再參與路由。

此部落格中描述了底層細節Linux 橋的正確隔離

  1. 將訊框移交給全域或裝置特定的協定處理程序(例如 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

相反,另一種方法是讓網橋不參與路由並使用額外的韋斯參與路由的對端(在同一網路命名空間)可以是:

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

在這兩種情況下,如果預設路由(或其他路由)依賴該位址的存在,則必須再次新增該路由,因為它消失了。

相關內容