具有两个虚拟网络的 Libvirtd/Qemu 路由网络模式问题

具有两个虚拟网络的 Libvirtd/Qemu 路由网络模式问题

我的虚拟机主机一直存在问题。主机最近重新启动,之后两个虚拟网络之一停止工作。我的网络拓扑是 B 类网络的 /26 切片,地址为 145.120.88.64/26。路由器位于地址 0.126,服务器分配地址为 0.65 服务器计算机在 CentOS 7 linux 上运行。我已经定义了两个带有 /28 掩码的虚拟网络,如下所示:

<network>
  <name>vmpublic</name>
  <uuid>065450c0-0429-48ba-9200-e4712cbe7283</uuid>
  <forward dev='em2' mode='route'>
    <interface dev='em2'/>
  </forward>
  <bridge name='virbr1' stp='on' delay='1'/>
  <mac address='52:54:00:e1:01:2a'/>
  <domain name='vmpublic'/>
  <ip address='145.120.88.81' netmask='255.255.255.240'>
    <dhcp>
      <range start='145.120.88.82' end='145.120.88.94'/>
      <host mac='52:54:00:67:03:83' name='vm1' ip='145.120.88.93'/>
    </dhcp>
  </ip>
</network>

第二个网络定义如下:

<network>
  <name>vmpublicb</name>
  <uuid>05115dea-24a6-4b6d-9c39-38e852d71196</uuid>
  <forward dev='em2' mode='route'>
    <interface dev='em2'/>
  </forward>
  <bridge name='virbr2' stp='on' delay='0'/>
  <mac address='52:54:00:33:4a:81'/>
  <domain name='vmpublicb'/>
  <ip address='145.120.88.97' netmask='255.255.255.240'>
    <dhcp>
      <range start='145.120.88.98' end='145.120.88.110'/>
      <host mac='52:54:00:81:b5:0b' name='vm2' ip='145.120.88.100'/>
    </dhcp>
  </ip>
</network>

那么路由表是这样的:

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         145.120.88.126       0.0.0.0         UG    0      0        0 em2
145.120.88.64        0.0.0.0         255.255.255.192 U     0      0        0 em2
145.120.88.80        0.0.0.0         255.255.255.240 U     0      0        0 virbr1
145.120.88.96        0.0.0.0         255.255.255.240 U     0      0        0 virbr2
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 em2
169.254.0.0     0.0.0.0         255.255.0.0     U     1006   0        0 virbr2
169.254.0.0     0.0.0.0         255.255.0.0     U     1009   0        0 virbr1

防火墙规则如下:

Chain INPUT (policy ACCEPT 842 packets, 76357 bytes)
 pkts bytes target     prot opt in     out     source               destination         
15505 1222K ACCEPT     udp  --  virbr1 any     anywhere             anywhere             udp dpt:domain
    0     0 ACCEPT     tcp  --  virbr1 any     anywhere             anywhere             tcp dpt:domain
    6  1884 ACCEPT     udp  --  virbr1 any     anywhere             anywhere             udp dpt:bootps
    0     0 ACCEPT     tcp  --  virbr1 any     anywhere             anywhere             tcp dpt:bootps
 208K   16M ACCEPT     udp  --  virbr2 any     anywhere             anywhere             udp dpt:domain
    0     0 ACCEPT     tcp  --  virbr2 any     anywhere             anywhere             tcp dpt:domain
   18  5673 ACCEPT     udp  --  virbr2 any     anywhere             anywhere             udp dpt:bootps
    0     0 ACCEPT     tcp  --  virbr2 any     anywhere             anywhere             tcp dpt:bootps

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 ACCEPT     all  --  em2    virbr1  anywhere             145.120.88.80/28   
 2508  191K ACCEPT     all  --  virbr1 em2     145.120.88.80/28          anywhere            
    0     0 ACCEPT     all  --  virbr1 virbr1  anywhere             anywhere            
    0     0 REJECT     all  --  any    virbr1  anywhere             anywhere             reject-with icmp-port-unreachable
    0     0 REJECT     all  --  virbr1 any     anywhere             anywhere             reject-with icmp-port-unreachable
14902 2099K ACCEPT     all  --  em2    virbr2  anywhere             145.120.88.96/28   
14782 2490K ACCEPT     all  --  virbr2 em2     145.120.88.96/28          anywhere            
    0     0 ACCEPT     all  --  virbr2 virbr2  anywhere             anywhere            
    0     0 REJECT     all  --  any    virbr2  anywhere             anywhere             reject-with icmp-port-unreachable
    0     0 REJECT     all  --  virbr2 any     anywhere             anywhere             reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT 206K packets, 14M bytes)
 pkts bytes target     prot opt in     out     source               destination         
    6  2022 ACCEPT     udp  --  any    virbr1  anywhere             anywhere             udp dpt:bootpc
   18  6135 ACCEPT     udp  --  any    virbr2  anywhere             anywhere             udp dpt:bootpc

我不明白为什么只有一个网络可以工作(vmpublicb)。两个网络的定义方式完全相同。从 vm2 可以访问外部网络,并且 vm2 从外部可以访问,但 vm1 则不能。正如您所看到的,数据包从 vm1 发出,但没有任何数据包转发给它。为了验证这一点,我在其他计算机上记录了从 vm1 发送的 ICMP 数据包,果然收到了这些数据包,但没有收到回复数据包。我能发现的唯一一个问题提示与 ARP 表有关:

[root@localhost ~]# arp -a
? (145.120.88.100) at 52:54:00:81:b5:0b [ether] on virbr2
? (145.120.88.93) at 52:54:00:67:03:83 [ether] on virbr1
gateway (145.120.88.126) at e8:eb:34:b0:ad:01 [ether] on em2
localhost.localdomain (145.120.88.81) at <incomplete> on em2

最后一行看起来很奇怪,为什么会有 localhost 的 IP 地址?它也是 vmpublic virbr1 接口 IP 地址,因此可能与此问题有关,但是什么呢?

我不知道如何进一步调试以查明问题,任何建议将不胜感激。

答案1

我能够找到解决该问题的方法。我通过将所有文件 /proc/sys/net/ipv4/conf/em2/ 文件系统与工作安装进行比较来实现这一点(我很幸运有一个可用的文件系统)。在那里我发现 /proc/sys/net/ipv4/conf/em2/proxy_arp 设置为 false(或 0),而在工作系统上它设置为 true(或 1)。因此,通过将其设置为 true 来解决问题:

echo 1 > /proc/sys/net/ipv4/conf/em2/proxy_arp

这当然不是一个持久的解决方案,必须更改网络接口配置才能使其持久。为什么这个问题只出现在一个虚拟网络上,而没有出现在另一个虚拟网络上,这对我来说完全是一个谜,如果有人能够阐明这个问题,那就太好了。我担心,当原因和解决方法没有被彻底理解时,这个或其他问题可能仍然会出现。

相关内容