가상 머신이 시작되기 전에 추가된 IPv6 경로가 작동하지 않는 이유

가상 머신이 시작되기 전에 추가된 IPv6 경로가 작동하지 않는 이유

Debian 7이 설치된 Hetzner에 외부 서버가 있고 IPv6 라우팅으로 KVM을 설정하려고 합니다(IPv4에서도 동일한 설정이 문제 없이 작동합니다).

두 개의 서로 다른 서브넷에 있는 두 개의 인터페이스가 있는 하나의 Ubuntu Server VM이 있습니다. 첫 번째 인터페이스는 브리지를 통해 호스트에 연결됩니다.

Host-eth0 <-- external bridge --> vnet0-VM-vnet1 <-- internal bridge

첫 번째 VM 인터페이스를 통해 두 번째 서브넷에 고정 경로를 추가하도록 브리지를 구성했습니다.

ip -6 route add 2a01:4f8:X:Y:2::/80 via 2a01:4f8:X:Y:1::3 dev virbr_external

그러면 VM이 시작되기 전에 경로 항목이 추가됩니다. 호스트에서 vnet1 인터페이스(2::2)로 ping6을 사용할 때 다음 오류 메시지가 나타납니다.

ping: sendmsg: Network is down

인터페이스 구성에 경로를 추가하지 않고 VM이 시작된 후 수동으로 호출하면 모든 것이 작동합니다.

그래서 내 질문은 IPv6 주소에 대한 경로 추가가 VM이 시작된 후에만 작동하는 이유는 무엇입니까?

추가 구성 세부정보:

호스트 인터페이스

auto lo
iface lo inet6 loopback

auto eth0
iface eth0 inet6 static
    address 2a01:4f8:X:Y:0::2
    netmask 128
    gateway fe80::1

# Bridge between Host and VM
auto virbr_external
iface virbr_external inet6 static
    bridge_ports none
    bridge_stp off
    bridge_fd 0
    address 2a01:4f8:X:Y:1::2
    netmask 80

up ip -6 route add 2a01:4f8:X:Y:2::/80 via 2a01:4f8:X:Y:1::3 dev virbr_external

# Bridge between VM and other VMs
auto virbr_internal
iface virbr_internal inet6 manual
    bridge_ports none
    bridge_stp off
    bridge_fd 0

VM 인터페이스

auto lo
iface lo inet6 loopback

auto eth0
iface eth0 inet6 static
    address 2a01:4f8:X:Y:1::3
    netmask 80
    gateway 2a01:4f8:X:Y:1::2

auto eth1
iface eth1 inet6 static
    address 2a01:4f8:X:Y:2::2
    netmask 80

로그가 더 필요한 경우(작동 전후) 알려주시면 수집하겠습니다.

답변1

여기에도 같은 문제가 있습니다. 해결책은 경로를 설정한 후 IPV6 경로 캐시를 플러시하는 것입니다.

ip -6 route flush cache

인터페이스 섹션을 다음으로 변경합니다.

...
auto virbr_external
iface virbr_external inet6 static
   bridge_ports none
   bridge_stp off
   bridge_fd 0
   address 2a01:4f8:X:Y:1::2
   netmask 80
   up ip -6 route add 2a01:4f8:X:Y:2::/80 via 2a01:4f8:X:Y:1::3 dev virbr_external
   up ip -6 route flush cache # Flush cache after setting route
   ...

부팅 시 문제를 해결합니다.

답변2

메트릭을 다른 경로보다 낮게 설정하는 논리가 없는 한 VM 시작/경로 추가 순서와 관련이 있는지 잘 모르겠습니다. 여러 인터페이스가 ipv6 트래픽과 커널을 라우팅하려고 할 수 있습니다. 측정항목이 가장 낮은 경로를 선택합니다.

내 시스템에서 내 브리지의 기본 메트릭은 425였으므로 VM이 시작되고 메트릭 256을 사용하여 기본 경로를 설정하면 기본 bridge0 경로보다 우선 적용되며 기본적으로 트래픽이 내 VM으로 전송됩니다. 경로는 다음을 사용하여 인쇄할 수 있습니다.

ip -6 route show

Libvirt는 아마도 해당 인터페이스가 브리지의 일부인 ipv6 주소와 경로를 갖는 것을 허용해서는 안 되지만 그렇게 하기 때문에 해결 방법은 단순히 브리지의 기본 경로를 vmnet 인터페이스보다 낮은 값으로 설정하는 것입니다. 네트워크 관리자 사용:

nmcli connection modify bridge0 ipv6.route-metric 128

이제 libvirt가 vnet0 인터페이스에 경로를 생성하더라도 브리지가 우선순위를 갖기 때문에 사용되지 않습니다.

이것버그 보고서관련이 있는 것 같습니다. 비록 매우 오래되었으므로 제가 보고 있는 새로운 버그일 수도 있습니다...

관련 정보