ipv6을 사용하는 개인 모드의 KVM(libvirt)

ipv6을 사용하는 개인 모드의 KVM(libvirt)

5개의 네트워크 카드가 있는 서버가 있습니다. 그 중 3개를 가상 머신에 사용하고 싶습니다. 그래서 저는 데비안 호스트에서 다음과 같은 네트워크를 기본 네트워크로 설정했습니다.

<network>
  <name>default</name>
  <forward mode='private'>
    <interface dev='eno2'/>
    <interface dev='eno3'/>
    <interface dev='eno4'/>
  </forward>
</network>

게스트가 통신할 필요가 없고 대부분 하나의 서비스(메일/웹 서버, CTF 테스트 VM, Sage jupyter가 있는 컴퓨팅 서버...)만 실행하기 때문에 비공개로 설정했습니다. 라우터와 ipv6 서브넷에서 ipv4 주소를 올바르게 할당했습니다. 하지만 ipv4만 작동합니다. 어떤 이유로 호스트에는 인터페이스의 ipv6 주소도 할당됩니다(이런 일이 발생해야 하는지 확실하지 않음). 하지만 ipv6로는 아무 것도 접근할 수 없습니다. 게스트에서는 모든 주소가 noprefixroute로 표시됩니다.

예를 들어 다음과 같습니다. 방문자:

─$ ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether ff:23:00:ff:23:ae brd ff:ff:ff:ff:ff:ff
    inet 10.0.7.86/24 brd 10.0.7.255 scope global dynamic noprefixroute eth0
       valid_lft 86236sec preferred_lft 86236sec
    inet6 2a02:5:0:0:0:0:0:1/64 scope global temporary dynamic 
       valid_lft 604637sec preferred_lft 85668sec
    inet6 2a02:5:0:0:0:2:0:1/64 scope global mngtmpaddr noprefixroute 
       valid_lft forever preferred_lft forever
    inet6 fe80::beef:beef:beef:bded/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever

주인:

 ip a s
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
(..)
10: eno3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether ff:fe:cc:dd:bb:e3 brd ff:ff:ff:ff:ff:ff
    altname enp2s0f0
    inet6 2a02:5:0:0:1:2:3:4/64 scope global dynamic mngtmpaddr
       valid_lft forever preferred_lft forever
    inet6 fe80::beef:beef:beef:57e3/64 scope link
       valid_lft forever preferred_lft forever
12: macvtap2@eno3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 500
    link/ether 52:54:00:87:e7:ae brd ff:ff:ff:ff:ff:ff
    inet6 fe80::acab:acab:acab:beef/64 scope link
       valid_lft forever preferred_lft forever

(개인 정보 보호를 위해 예제에서 IP를 변경했지만 이해하실 것입니다.)

이제 libvirt의 네트워킹을 완전히 무시하고 관련 pci ID를 사용하여 NIC를 직접 연결하면 모든 것이 잘 작동합니다. 하지만 이 경우 두 포트가 항상 하나(IOMMU 그룹)를 형성하므로 VM을 1개만 사용할 수 있습니다. 첫 번째 포트는 호스트용이고 다른 포트는 구성 인터페이스용입니다. 이 경우 성능에도 영향을 미치는 것 같습니다. 따라서 이것은 이상적인 솔루션이 아닙니다.

이상적으로는 각 가상 머신이 마치 케이블을 통해 스위치에 물리적으로 연결된 것처럼 작동하고 싶습니다. 각각은 공개적으로 라우팅 가능한 ipv6 네트워크와 할당된 주소(라우터의 nat에서 ipv4도 마찬가지)를 얻어야 합니다. 현재 모든 포트는 동일한 스위치에 연결되어 있으며 연결된 각 장치가 인터넷과만 통신할 수 있도록 스위치를 격리하고 있으며 각 포트에는 서로 다른 IP4 및 IP6 서브넷이 할당되어 있습니다.

이것이 왜 그렇게 혼란스러운 작업인지 조금 혼란 스럽습니다. 3개의 물리적 서버를 동일한 방식으로 스위치에 연결하면 모든 것이 예상대로 작동합니다.

또한 브리지된 네트워크에 대한 구성 예제를 시도했지만 작동하지 않았으며 구성에서 IP를 설정하는 것을 좋아하지 않습니다. IP가 변경될 수 있고 라우터가 IP를 올바르게 할당하는 것이 더 나을 것입니다(dhcpv6 사용).

관련 정보