Linux
KVM 的 Linux 橋接
我有一台 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
兩者
iptables
和ebtables
都是空的,預設策略為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
沒有有效響應的重複請求表明存在可達性問題。- 失去
echo
或echo reply
流量可能表明哪一方有問題。- Traceroute 對路由器或其後面的地址的響應可能會提供額外的資訊。