KVM/QEMU 가상 머신이 동일한 트렁크 브리지에 연결된 호스트에 도달할 수 있도록 하이퍼바이저를 구성하는 방법은 무엇입니까?

KVM/QEMU 가상 머신이 동일한 트렁크 브리지에 연결된 호스트에 도달할 수 있도록 하이퍼바이저를 구성하는 방법은 무엇입니까?

1 문제

나의 목표는 모든 LAN 트래픽이 라우터와 방화벽 역할을 하는 가상 머신(VM)을 통해 라우팅되는 것입니다. 동일한 하이퍼바이저에 있는 다른 VM도 방화벽 VM을 통해 라우팅되어야 합니다. 다음을 참조하세요네트워크 스케치. 트렁크 브리지에 연결된 물리적 호스트는 서로 성공적으로 핑할 수 있지만 아직 VM에 연결할 수 없습니다.

2 세부정보

하이퍼바이저의 네트워크 구성:

# =======
# Bridges
# =======
# ---------------------
# VLAN bridge br-vlan-3
# ---------------------
ip link add name br-vlan-3 type bridge
ip addr add 10.66.3.11/24 dev br-vlan-3
ip link set dev br-vlan-3 up

# ---------------------
# Trunk bridge Upstream
# ---------------------
ip link add name br-trunk-up type bridge vlan_filtering 1 vlan_default_pvid 0
ip link set br-trunk-up up

# ---------------
# Trunk bridge VM
# ---------------
ip link add name br-trunk-vm type bridge vlan_filtering 1 vlan_default_pvid 0
ip link set br-trunk-vm up

# =====
# Hosts
# =====

# Set physical devices up
ip link set enp5s0 up
ip link set enp9s0f0 up
ip link set enp9s0f1 up
ip link set enp9s0f2 up
ip link set enp9s0f3 up


# ----------------------
# desktop.3 br-vlan-3
# ----------------------
ip link add link enp9s0f1 name enp9s0f1.3 type vlan id 3
ip link set dev enp9s0f1.3 master br-vlan-3
ip link set enp9s0f1.3 up

# --------------------------
# desktop.100 br-trunk-vm
# --------------------------
ip link add link enp9s0f1 name enp9s0f1.100 type vlan id 100
ip link set enp9s0f1.100 master br-trunk-vm
ip link set enp9s0f1.100 up
bridge vlan add vid 100 dev enp9s0f1.100 master
bridge vlan add vid 100 dev br-trunk-vm self

bridge vlan add vid 100 dev fw.100 pvid 100

네트워크 맵

=======
DESKTOP
=======
localhost:user ~ $  ip a
2: enp34s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:d8:61:c4:b1:af brd ff:ff:ff:ff:ff:ff
4: br-vlan-100: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 1a:b1:36:43:f0:e4 brd ff:ff:ff:ff:ff:ff
    inet 10.66.100.44/24 scope global br-vlan-100
       valid_lft forever preferred_lft forever
7: enp.100@enp34s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-vlan-100 state UP group default qlen 1000
    link/ether 00:d8:61:c4:b1:af brd ff:ff:ff:ff:ff:ff
    
localhost:~ # cat /proc/net/vlan/enp.100 
enp.100  VID: 100        REORDER_HDR: 1  dev->priv_flags: 1221
         total frames received            0
          total bytes received            0
      Broadcast/Multicast Rcvd            0

      total frames transmitted          287
       total bytes transmitted        53964
Device: enp34s0
INGRESS priority mappings: 0:0  1:0  2:0  3:0  4:0  5:0  6:0 7:0
 EGRESS priority mappings: 


==========
HYPERVISOR
==========
bridge name     bridge id               STP enabled     interfaces
br-vlan-100             8000.1ab13643f0e4       no              enp.100

[root@fedora system]# ip a  
4: enp9s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether a0:36:9f:5d:09:19 brd ff:ff:ff:ff:ff:ff
13: br-trunk-vm: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 56:7e:22:6a:23:2d brd ff:ff:ff:ff:ff:ff
16: enp9s0f1.100@enp9s0f1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-trunk-vm state UP group default qlen 1000
    link/ether a0:36:9f:5d:09:19 brd ff:ff:ff:ff:ff:ff
21: fw.100: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-trunk-vm state UNKNOWN group default qlen 1000
    link/ether fe:54:00:3e:97:72 brd ff:ff:ff:ff:ff:ff
    
    
[root@fedora system]# brctl show dev br-trunk-vm
bridge name     bridge id               STP enabled     interfaces
br-trunk-vm             8000.567e226a232d       no              enp9s0f1.100
                                                        fw.100
                                                        fw.103
                                                        fw.3


===============
VIRTUAL MACHINE 
===============                                                                    
[root@fedora system]# bridge vlan show
port              vlan-id  
br-trunk-vm       100
enp9s0f1.100      100
virbr0            1 PVID Egress Untagged
fw.100            100 PVID Egress Untagged


2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:3e:97:72 brd ff:ff:ff:ff:ff:ff
    inet 10.66.100.10/24 scope global enp1s0
       valid_lft forever preferred_lft forever

방화벽 VM의 Libvirt XML 네트워크 구성:

<interface type='bridge'>
  <mac address='52:54:00:3e:97:72'/>
  <source bridge='br-trunk-vm'/>
  <target dev='fw.100'/>
  <model type='virtio'/>
  <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
</interface>

3회 시도

방화벽 VM에서 태그가 지정된 NIC와 태그가 지정되지 않은 NIC를 모두 구성해 보았습니다. 태그가 지정된 NIC의 경우 방화벽 VM에 VLAN 브리지를 생성하고 fw.100VLAN 100을 사용하여 가상 탭에서 가상 탭 장치를 생성했습니다 [email protected]. 그런 다음 트렁크 포트를 [email protected]master: 로 설정했습니다 . 태그 없는 NIC 접근 방식의 경우 방화벽 VM에 VLAN을 구성하지 않고 트렁크 포트를 PVID 100 untagged로 설정했습니다 . 두 경우 모두 데스크톱 호스트와 방화벽 VM 간에 ping을 수행할 수 없었습니다.bridge vlan add vid 100 dev [email protected] masterbridge vlan add vid 100 dev fw.100 pvid 100 untagged

이 문제는 libvirt KVM/QEMU 가상 머신에서만 발생합니다. 마스터로서 하이퍼바이저의 트렁크 브리지에 연결된 두 개의 물리적 VLAN 태그 호스트는 서로 ping할 수 있습니다.

4 업데이트

libvirt는 VLAN이 있는 Linux 브리지를 지원하지 않는 것 같습니다. 다음 문서에 따르면 동일한 VLAN을 사용하는 하이퍼바이저에 두 번째 가상 장치가 있는 경우 VM VLAN 작동이 중지됩니다.https://alesnosek.com/blog/2015/09/07/bridging-vlan-trunk-to-the-guest/

대안으로 openvswitch를 사용할 수 있지만 각 VM과 물리적 호스트에 브리지를 사용하는 것이 더 나은 접근 방식입니다. 그런 다음 하이퍼바이저는 VM과 호스트의 브리지를 방화벽 VM의 브리지로 전달하도록 허용하고 나머지 라우팅은 방화벽의 VM 내에서 수행됩니다.

관련 정보