我无法从使用 Xen 和 libvirt 运行的虚拟机获取网络访问权限。几天来,我一直在尝试不同的方法,并在网上阅读类似的帖子,但我现在真的陷入困境。如果有人能提供一些见解,我将不胜感激。
我在主机上运行了一台虚拟机,该主机的网桥设置为 br0,接口为 eth0,位于 192.168.60.0/24 子网上。libvirt 配置 xml 的网络部分如下:
<interface type='bridge'>
<mac address='ff:a0:d1:e5:07:de'/>
<source bridge='br0'/>
<script path='/etc/xen/scripts/vif-bridge'/>
<model type='virtio' />
</interface>
当我启动虚拟机时,主机上会创建一个 vif6.0 接口,并且 ifconfig 输出为:
br0 Link encap:Ethernet HWaddr 00:A0:D1:C3:07:DE
inet addr:192.168.60.33 Bcast:192.168.60.255 Mask:255.255.255.0
inet6 addr: fe80::2a0:d1ff:fee5:7de/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:13 errors:0 dropped:0 overruns:0 frame:0
TX packets:40 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:3570 (3.4 KiB) TX bytes:3508 (3.4 KiB)
eth0 Link encap:Ethernet HWaddr 00:A0:D1:C3:07:DE
inet6 addr: fe80::2a0:d1ff:fee5:7de/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:492 (492.0 b)
Interrupt:19 Memory:fe8f0000-fe900000
vif6.0 Link encap:Ethernet HWaddr FE:FF:FF:FF:FF:FF
inet6 addr: fe80::fcff:ffff:feff:ffff/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:80 errors:0 dropped:0 overruns:0 frame:0
TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:500
RX bytes:6660 (6.5 KiB) TX bytes:468 (468.0 b)
virbr0 Link encap:Ethernet HWaddr 00:00:00:00:00:00
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
“brctl show”输出似乎显示网桥配置正确:
br0 8000.00a0d1e507de no eth0
vif6.0
VM中的ifcfg-eth0内容为:
DEVICE=eth0
BOOTPROTO=static
HWADDR=FF:A0:D1:E5:07:DE
IPADDR=192.168.60.133
NETMASK=255.255.255.0
ONBOOT=yes
并且 VM 中 ifconfig 的输出看起来符合我的预期:
eth0 Link encap:Ethernet HWaddr FF:A0:D1:E5:07:DE
inet addr:192.168.60.133 Bcast:192.168.60.255 Mask:255.255.255.0
inet6 addr: fe80::fda0:d1ff:fee5:7de/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:6 errors:0 dropped:0 overruns:0 frame:0
TX packets:80 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:468 (468.0 b) TX bytes:7780 (7.5 KiB)
但是当我尝试 ssh 或 ping 另一台计算机时,我收到“没有到主机的路由”的提示。
我使用主机系统上的 tcpdump 尝试看看是否可以缩小问题范围:
# tcpdump -vv -i vif6.0
tcpdump: WARNING: vif6.0: no IPv4 address assigned
tcpdump: listening on vif6.0, link-type EN10MB (Ethernet), capture size 96 bytes
14:49:40.833997 arp who-has 192.168.60.35 tell 192.168.60.133
14:49:41.833314 arp who-has 192.168.60.35 tell 192.168.60.133
14:49:42.833309 arp who-has 192.168.60.35 tell 192.168.60.133
因此,当我尝试 ssh 到 192.168.60.35 时,VM 会发出 arp who-has 数据包。我认为这意味着 VM 内的设置正常,并且这是主机系统上的问题。如果我使用 br0 接口运行 tcpdump,则看不到这些 arp 数据包。
我的想法是,数据包在进入网桥之前以某种方式被阻止了。我尝试添加一条 iptables 规则来解决这个问题:-A FORWARD -m physdev --physdev-is-bridged -j ACCEPT,但没有奏效。我还尝试了以下方法:
/sbin/sysctl -w net.bridge.bridge-nf-call-ip6tables=0
/sbin/sysctl -w net.bridge.bridge-nf-call-iptables=0
/sbin/sysctl -w net.bridge.bridge-nf-call-arptables=0
/sbin/sysctl -w net.ipv4.ip_forward=1
没有任何影响。
对于比我更有经验的人来说,我在这里遗漏了什么,这显而易见吗?vif6.0 是否应该具有与虚拟机中的 eth0 相同的 MAC 地址?我的 iptables 中是否需要更多规则?感谢您的帮助!
答案1
您应该配置 ip addr onbr0
而不是eth0
。
例如/etc/sysconfig/network-scripts/ifcfg-eth0
:
DEVICE="eth0"
HWADDR="00:1E:37:D4:06:3E"
NM_CONTROLLED="no"
ONBOOT="yes"
BRIDGE=br0
例如/etc/sysconfig/network-scripts/ifcfg-br0
:
DEVICE=br0
TYPE=Bridge
BOOTPROTO=static
BROADCAST=192.168.60.255
IPADDR=192.168.60.133
NETMASK=255.255.255.0
NETWORK=192.168.60.0
ONBOOT=yes
然后执行sudo ifdown eth0;ifdown br0; ifup br0; ifup eth0
您应该看到 IP 地址是br0
通过命令配置的ifconfig
。