Ubuntu

橋不轉發所有流量(Ubuntu Xenial)

  • October 18, 2017

我對這個橋接世界很陌生。我遇到了一個讓我無法解決的問題,但我失敗了。

我有一台安裝了(Ubuntu xenial 16.04)的機器,它有一個來賓虛擬機。我創建了一個網橋(virbr - 與 vnet1 綁定)來轉發來自主機 - > VM 的所有流量。

似乎並非所有流量都被優雅地轉發。我們錯過了很多交通。例如 Trace-1 到達網橋,但在 vnet1 上沒有看到(沒有轉發) Trace-1 Trace-1 的 流量範例 請提供任何想法?在 Trace-2 的情況下,在 vnet0 上看到的所有數據包(100% 轉發)在此處輸入圖像描述 Trace-2 的流量範例

我沒碰過iptables

root@physc_host:/proc/sys/net/unix# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootps
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:bootps
ACCEPT     all  --  anywhere             anywhere            

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             192.168.122.0/24     ctstate RELATED,ESTABLISHED
ACCEPT     all  --  192.168.122.0/24     anywhere            
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            
ACCEPT     tcp  --  anywhere             anywhere            
Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootpc
root@physc_host:/proc/sys/net/unix# 

我找到了解決我的問題的方法。網橋需要了解哪些電腦連接到哪些 LAN。更正式地說,他們需要了解是否轉發到每個地址。為了了解哪些地址正在使用,哪些埠(網橋上的介面)理論上最接近,網橋會觀察接收到的乙太網幀的報頭。通過檢查每個接收到的幀的 MAC 源地址,並記錄接收到的埠,網橋可以了解哪些地址屬於通過每個埠連接的電腦。這被稱為“學習”。在下圖中,考慮三台電腦 X、Y、Z。假設每個都向其他電腦發送幀。源地址 X,Y 被觀察到在網路 A 上,而電腦 Z 的地址將被觀察到在網路 B 上。

學習到的地址儲存在與每個埠(介面)關聯的介面地址表中。一旦建立了這個表,網橋就會檢查所有接收到的幀的目的地址,然後掃描介面表以查看是否從同一地址接收到幀(即源地址與目前目的地址匹配的數據包) . 存在三種可能性:

  1. 如果未找到地址,則沒有從源接收到任何幀。源可能不存在,或者它可能沒有使用此地址發送任何幀。(該地址也可能已被網橋刪除,因為網橋軟體最近重新啟動,介面表中缺少地址條目,或者因為地址太舊而刪除了地址)。由於網橋不知道使用哪個埠來轉發幀,它將把它發送到所有輸出埠,除了接收它的埠。(顯然沒有必要將它發送回接收它的同一電纜段,因為該電纜上的任何其他電腦/網橋必須已經接收到數據包。)這稱為泛洪。
  2. 如果在介面表中找到該地址並且該地址與接收它的埠相關聯,則丟棄該幀。(它必須已經被目的地接收。)
  3. 如果在介面表中找到該地址,並且該地址與接收地址的埠沒有關聯,則網橋將幀轉發到與該地址關聯的埠。

由於電腦 Y 直接連接到 LAN A,因此源為 X 和目的地為 Y 的數據包被接收並丟棄,而來自 X 的目的地為 Z 的數據包通過網橋轉發到網路 B。

要解決此問題: 通過以下命令將老化時間設置為零 $ brctl setageing br0 0

在此處輸入圖像描述

引用自:https://serverfault.com/questions/878353