Networking
qemu-kvm 來賓作業系統可以使用網橋訪問主機,但不能訪問同一網路上的其他設備
我想在 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 debian9
(debian9
訪客名稱在哪裡),我編輯了預設網路介面,如下所示:<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
策略丟棄。