![libvirt 网络问题:主机无法访问互联网(而客人可以!)](https://linux22.com/image/983472/libvirt%20%E7%BD%91%E7%BB%9C%E9%97%AE%E9%A2%98%EF%BC%9A%E4%B8%BB%E6%9C%BA%E6%97%A0%E6%B3%95%E8%AE%BF%E9%97%AE%E4%BA%92%E8%81%94%E7%BD%91%EF%BC%88%E8%80%8C%E5%AE%A2%E4%BA%BA%E5%8F%AF%E4%BB%A5%EF%BC%81%EF%BC%89.png)
我运行一台 Ubuntu 机器,它通过 libvirt 托管多个客户虚拟机(也是 Ubuntu)。客户虚拟机可以访问互联网,而主机只能访问本地网络,包括网关。这似乎很奇怪,我不知道根本原因是什么。
我不记得这个问题是在哪里第一次发生的,或者哪个变化触发了它。所以我只是根据一些配置和输出来描述当前的情况:
$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 a.b.c.1 0.0.0.0 UG 0 0 0 eth0
a.b.c.0 0.0.0.0 255.255.255.0 U 0 0 0 br0
a.b.c.0 0.0.0.0 255.255.255.0 U 1 0 0 eth0
169.254.0.0 0.0.0.0 255.255.0.0 U 1000 0 0 br0
192.168.122.0 0.0.0.0 255.255.255.0 U 0 0 0 virbr0
这似乎基本表达的是相同的意思:
$ ip route show
default via a.b.c.1 dev eth0 proto static
a.b.c.0/24 dev br0 scope link
a.b.c.0/24 dev eth0 proto kernel scope link src a.b.c.38 metric 1
169.254.0.0/16 dev br0 scope link metric 1000
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
在/etc/网络/接口:
auto lo
iface lo inet loopback
auto br0
iface br0 inet static
address a.b.c.38
netmask 255.255.255.0
network a.b.c.0
broadcast a.b.c.255
gateway a.b.c.1
dns-nameserver XXX.XXX.XXX.XXX XXX.XXX.XXX.XXX XXX.XXX.XXX.XXX
bridge_ports all
bridge_stp yes
bridge_fd 0
post-up /sbin/ethtool -s eth0 wol g
post-down /sbin/ethtool -s eth0 wol g
该命令失败:
$ sudo ifdown eth0 && sudo ifup eth0
ifdown: interface eth0 not configured
Ignoring unknown interface eth0=eth0.
另一个有关桥梁的命令:
$ brctl show
bridge name bridge id STP enabled interfaces
br0 8000.14dae9726e93 no eth0
vnet0
vnet1
vnet2
virbr0 8000.000000000000 yes
这看起来很可疑:
$ arp -n
Address HWtype HWaddress Flags Mask Iface
a.b.c.50 (incomplete) eth0
a.b.c.63 (incomplete) eth0
a.b.c.1 ether 00:00:0c:07:ac:3d C br0
a.b.c.63 ether 4c:72:b9:8f:b8:6c C br0
a.b.c.50 (incomplete) br0
a.b.c.40 ether 52:54:00:2f:79:ac C br0
a.b.c.39 ether 00:25:90:7c:f8:94 C br0
a.b.c.1 (incomplete) eth0
a.b.c.48 ether 3c:07:54:13:7c:55 C br0
a.b.c.2 ether f0:f7:55:2a:15:00 C br0
答案1
首先,/etc/network/interfaces
定义了一个br0
接口,但不是eth0
接口,因此您当然会ifup eth0
失败。您可以尝试。考虑到您的配置,ifdown br0; ifup br0
您会看到系统上的默认路由出去br0
,而不是。eth0
eth0
不应分配任何 IP 地址。
请注意,关闭和打开桥接器可能会中断虚拟机的互联网访问,因此需要重新启动虚拟机(我不确定是否会这样做,但目前我无法测试)。
答案2
似乎有外部原因。交换网络配置为不运行 STP(生成树协议),因此断开了发送 STP 数据包的端口。网络配置bridge_stp yes
导致发送这些数据包。但是,目前尚不清楚 VM 客户机如何仍能与外部 Internet 通信。无论如何,问题现在解决了 - 谢谢!