
我有一個這樣的網路拓撲:
你看,em1
(1.1.8.209)是我可以透過網路進行通訊的實體介面。我建立了兩個虛擬機器實例:PID 8740
和PID 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 橋的正確隔離:
將訊框移交給全域或裝置特定的協定處理程序(例如 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
在這兩種情況下,如果預設路由(或其他路由)依賴該位址的存在,則必須再次新增該路由,因為它消失了。