Linux

KVM 的 Linux 橋接

  • September 25, 2020

我有一台 Debian Wheezy 機器,我嘗試在其上設置具有橋接網路的 KVM。不幸的是,網橋似乎無法正確轉發流量。

我的設置如下:

物理機有一個eth0連接到 IP 地址為 192.168.0.1 的路由器。

eth0是網橋介面的成員,br0靜態配置為 IP 地址 192.168.0.101。

虛擬機的網路介面位於vnet0物理主機和eth0虛擬機中。在虛擬機中,介面靜態配置為 IP 地址 192.168.0.110。

從物理主機,我可以 ping 虛擬機和路由器:

# ping 192.168.0.1
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
64 bytes from 192.168.0.1: icmp_req=1 ttl=64 time=0.331 ms

# ping 192.168.0.110
PING 192.168.0.110 (192.168.0.110) 56(84) bytes of data.
64 bytes from 192.168.0.110: icmp_req=1 ttl=64 time=0.417 ms

從虛擬機我可以 ping 物理機:

# ping 192.168.0.101:
PING 192.168.0.101 (192.168.0.101) 56(84) bytes of data.
64 bytes from 192.168.0.101: icmp_req=1 ttl=64 time=0.133 ms

但我無法ping通路由器:

# ping 192.168.0.1:
PING 192.168.0.1 (192.168.0.1) 56(84) bytes of data.
From 192.168.0.110 icmp_seq=10 Destination Host Unreachable

據我所知,網橋設置正確,所有連接的埠都處於轉發狀態:

# brctl show
bridge name bridge id           STP enabled interfaces
br0         8000.2cd444acf8ad   no          eth0
                                           vnet0
# brctl showstp br0
br0
bridge id               8000.2cd444acf8ad
designated root         8000.2cd444acf8ad
root port               0                    path cost        0
max age                 20.00                bridge max age           20.00
hello time              2.00                 bridge hello time         2.00
forward delay           0.00                 bridge forward delay      0.00
ageing time             300.01
hello timer             1.20                 tcn timer                 0.00
topology change timer   0.00                 gc timer                 28.95
flags          


eth0 (1)
port id            8001                state            forwarding
designated root    8000.2cd444acf8ad   path cost              4
designated bridge  8000.2cd444acf8ad   message age timer      0.00
designated port    8001                forward delay timer    0.00
designated cost       0                hold timer             0.20
flags          

vnet0 (2)
port id            8002                state            forwarding
designated root    8000.2cd444acf8ad   path cost            100
designated bridge  8000.2cd444acf8ad   message age timer      0.00
designated port    8002                forward delay timer    0.00
designated cost       0                hold timer             0.20
flags          

兩者iptablesebtables都是空的,預設策略為ACCEPT

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination   
# ebtables -L
Bridge table: filter

Bridge chain: INPUT, entries: 0, policy: ACCEPT

Bridge chain: FORWARD, entries: 0, policy: ACCEPT

Bridge chain: OUTPUT, entries: 0, policy: ACCEPT

有誰知道導致這個問題的原因以及我該如何解決?

編輯:

顯然,網橋辨識到有東西連接到它,因為它建構了一個 MAC 表:

# brctl showmacs br0
port no mac addr            is local?   ageing timer
 1     2c:76:8a:ff:88:1d   no            1.28   <- ???
 1     2c:d4:44:ac:f8:ad   yes           0.00   <- MAC of br0 and physical eth0
 2     52:54:00:53:dd:34   no          143.80   <- MAC of VM's eth0
 1     c8:1f:66:ba:83:33   no            0.00   <- MAC of router interface
 2     fe:54:00:53:dd:34   yes           0.00   <- MAC of vnet0

編輯2:

我剛剛創建了第二個虛擬機。這台機器在物理機上有介面vnet1,它的虛擬eth0被分配了IP地址192.168.0.111。這個虛擬機也只能ping物理機,路由器和原始虛擬機都不能。brctl showstp顯示所有埠,包括 vnet1,處於轉發狀態,brctl showmacs除了我上面寫的內容之外,還顯示了 vnet1 的 MAC 和新機器的虛擬 eth0。

檢查核心是否設置為啟用 IP 轉發:

sysctl -a | grep forwarding

您可以啟用:

sudo sysctl net.ipv4.conf.all.forwarding=1
sudo sysctl net.ipv6.conf.all.forwarding=1

ARP 代理也可能存在問題。檢查:

sysctl -a | grep proxy_arp

並使用以下命令設置:

sudo sysctl net.ipv4.conf.eth0.proxy_arp=1

您可以將鍵和值放在下面的文件中,/etc/sysctl.d以便在重新啟動時重置值。

從路由器子網上的另一台設備進行測試可能有助於確定問題。

  • ping 虛擬機可以提供有用的診斷。
  • 檢查是否可以為虛擬機進行 ARP 將指示您是否可以找到伺服器的 MAC 地址。ping通後使用“arp -a”查看MAC地址是否成功。
  • Traceroute 可能會指示問題從哪裡開始。

tcpdump在介面上進行測試eth0也可以指示連接失敗的位置。

  • arp沒有有效響應的重複請求表明存在可達性問題。
  • 失去echoecho reply流量可能表明哪一方有問題。
  • Traceroute 對路由器或其後面的地址的響應可能會提供額外的資訊。

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