我想在 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
。