두 개의 가상 네트워크에서 Libvirtd/Qemu 라우팅 네트워크 모드 문제

두 개의 가상 네트워크에서 Libvirtd/Qemu 라우팅 네트워크 모드 문제

가상 머신 호스트에 문제가 발생했습니다. 호스트가 최근 재부팅된 후 두 가상 네트워크 중 하나가 작동을 멈췄습니다. 내 네트워크 토폴로지는 주소가 145.120.88.64/26인 클래스 B 네트워크의 /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로 전달되지 않습니다. 이를 확인하기 위해 다른 컴퓨터의 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

물론 이는 지속 가능한 솔루션이 아니며 이를 지속하려면 네트워크 인터페이스 구성을 변경해야 합니다. 이 문제가 하나의 가상 네트워크에서만 발생하고 다른 가상 네트워크에서는 발생하지 않는 이유는 나에게 완전히 미스터리이며 누군가가 이에 대해 밝힐 수 있다면 좋을 것입니다. 원인과 해결책을 완전히 이해하지 못한 경우 이런 문제나 다른 문제가 계속 발생할 수 있다는 걱정이 듭니다.

관련 정보