Networking

qemu-kvm 來賓作業系統可以使用網橋訪問主機,但不能訪問同一網路上的其他設備

  • June 20, 2020

我想在 Debian 10 主機上以 Debian 9 作為其作業系統執行 qemu-kvm 來賓。主機連接到本地網路,我希望來賓對本地網路“可見”,就好像它是直接連接到網路的正常設備一樣。為此,我通過如下br0編輯配置了一個在主機上命名的網橋:/etc/network/interfaces

auto lo
iface lo inet loopback

allow-hotplug eth0
auto eth0
iface eth0 inet manual
   up ifconfig eth0 promisc up
   down ifconfig eth0 promisc down

auto br0
iface br0 inet static
   hwaddress ether 08:60:6e:69:4a:b5
   address 192.168.1.11
   netmask 255.255.255.0
   gateway 192.168.1.1

   bridge_ports eth0
   bridge_stp on
   bridge_fd 0

網橋配置的MAC地址和我的eth0介面一樣。

在此更改後,我的主機網路似乎工作正常。

使用sudo virsh edit debian9debian9訪客名稱在哪裡),我編輯了預設網路介面,如下所示:

   <interface type='bridge'>
     <mac address='52:54:00:bc:8c:97'/>
     <source bridge='br0'/>
     <model type='virtio'/>
     <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
   </interface>

在來賓內部,我通過 /etc/network/interfaces如下編輯分配了一個靜態 IP 地址,因為它似乎沒有使用 DHCP 接收 IP 地址:

source /etc/network/interfaces.d/*

auto lo
iface lo inet loopback

allow-hotplug enp1s0
auto enp1s0
iface enp1s0 inet static
   address 192.168.1.13
   netmask 255.255.255.0
   gateway 192.168.1.1

當我這樣做時,客人似乎正確地出現在br0主機的橋上sudo brctl show

bridge name     bridge id               STP enabled     interfaces
br0             8000.08606e694ab5       yes             eth0
                                                       vnet0
docker0         8000.024202321e8f       no              veth7291e29
virbr0          8000.5254005aa541       yes             virbr0-nic

主機現在可以正確連接到訪客(例如,使用 ping 或 ssh),並且訪客可以正確連接到主機,但同一本地網路上的其他設備無法訪問訪客,反之亦然。

我懷疑這一定是由於主機上的某些防火牆/路由問題,但我不確定如何進一步診斷。以下是iptables -S主機上的輸出。我自己並沒有配置任何 iptables 規則:大部分都和 libvirt 的預設 NAT 網路有關,或者是宿主機上的 docker 安裝:

-P INPUT ACCEPT
-P FORWARD DROP
-P OUTPUT ACCEPT
-N DOCKER
-N DOCKER-ISOLATION-STAGE-1
-N DOCKER-ISOLATION-STAGE-2
-N DOCKER-USER
-A INPUT -i virbr0 -p udp -m udp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i virbr0 -p udp -m udp --dport 67 -j ACCEPT
-A INPUT -i virbr0 -p tcp -m tcp --dport 67 -j ACCEPT
-A FORWARD -d 192.168.122.0/24 -o virbr0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -s 192.168.122.0/24 -i virbr0 -j ACCEPT
-A FORWARD -i virbr0 -o virbr0 -j ACCEPT
-A FORWARD -o virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -i virbr0 -j REJECT --reject-with icmp-port-unreachable
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -i docker0 ! -o docker0 -j ACCEPT
-A FORWARD -i docker0 -o docker0 -j ACCEPT
-A OUTPUT -o virbr0 -p udp -m udp --dport 68 -j ACCEPT
-A DOCKER -d 172.17.0.1/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 8050 -j ACCEPT
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN

有人對我如何讓客人在本地網路上“可見”有任何建議嗎?

發生這種情況是因為FORWARD鏈策略是DROP.

你可以使用

iptables -I FORWARD -i br0 -j ACCEPT
iptables -I FORWARD -o br0 -j ACCEPT

接受從/到br0介面的所有轉發流量。

這也是客戶端無法通過 DHCP 獲取地址的原因。來自客戶端的 DHCP 數據包被FORWARD策略丟棄。

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