网络流量未通过 Xen + libvirt 的桥接接口从虚拟机转发到网络

网络流量未通过 Xen + libvirt 的桥接接口从虚拟机转发到网络

我无法从使用 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

相关内容