qemu-kvm 客户操作系统可以使用网桥访问主机,但无法访问同一网络上的其他设备

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地址和我的接口的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

有人能建议我如何让客人在本地网络上变得“可见”吗?

答案1

发生这种情况是因为FORWARD连锁政策是DROP

你可以使用

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

接受来自/到br0接口的所有转发流量。

这也是客户端无法通过 DHCP 获取地址的原因。来自客户端的 DHCP 数据包被策略丢弃FORWARD

相关内容