Назад | Перейти на главную страницу

Маршрутизация IPv6 между хостом и гостем

В настоящее время я столкнулся с проблемой, связанной с моей текущей настройкой. У меня в основном есть выделенный сервер, которому назначена подсеть IPv6 / 64 (2a01: 4f8: 221: 1e81 :: / 64). Связь на хосте работает нормально, так как я могу пинговать оттуда ipv6.google.com.

Также это конфигурация:

root@void ~ # ifconfig vmbr0
vmbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.250.0.1  netmask 255.255.0.0  broadcast 10.250.255.255
        inet6 2a01:4f8:221:1e81:1:ffff:ffff:ffff  prefixlen 80  scopeid 0x0<global>
        inet6 2a01:4f8:221:1e81:212:ffff:ffff:ffff  prefixlen 80  scopeid 0x0<global>
        inet6 2a01:4f8:221:1e81:253:ffff:ffff:ffff  prefixlen 80  scopeid 0x0<global>
        inet6 2a01:4f8:221:1e81:251:ffff:ffff:ffff  prefixlen 80  scopeid 0x0<global>
        inet6 fe80::70a5:a1ff:fed6:8c0  prefixlen 64  scopeid 0x20<link>
        ether 4a:5a:df:ab:a8:bc  txqueuelen 1000  (Ethernet)
        RX packets 949686094  bytes 162428268530 (151.2 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 285868499  bytes 143826674082 (133.9 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

root@void ~ #

Таблица маршрутизации:

root@void ~ # ip -6 route show
2a01:4f8:221:1e81:1::/80 dev vmbr0 proto kernel metric 256 pref medium
2a01:4f8:221:1e81:212::/80 dev vmbr0 proto kernel metric 256 pref medium
2a01:4f8:221:1e81:251::/80 dev vmbr0 proto kernel metric 256 pref medium
2a01:4f8:221:1e81:253::/80 dev vmbr0 proto kernel metric 256 pref medium
2a01:4f8:221:1e81::/64 dev eth0 proto kernel metric 256 pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
fe80::/64 dev vmbr0 proto kernel metric 256 pref medium
default via fe80::1 dev eth0 metric 1024 pref medium
root@void ~ #

Проблема возникает, когда я подключаюсь к виртуальной машине по ssh и настраиваю сеть. В этом примере у меня следующая конфигурация:

hypnotize@irc:~$ cat /etc/network/interfaces | tail -n4
iface eth0 inet6 static
    address 2a01:4f8:101:3172:251::3
    netmask 80
    gateway 2a01:4f8:101.3172:251:ffff:ffff:ffff
hypnotize@irc:~$

Итак, ifconfig выглядит так:

hypnotize@irc:~$ sudo ifconfig
[sudo] password for hypnotize:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.250.3.6  netmask 255.255.0.0  broadcast 10.250.255.255
        inet6 fe80::9474:f1ff:fe6f:4bc3  prefixlen 64  scopeid 0x20<link>
        inet6 2a01:4f8:101:3172:251::3  prefixlen 80  scopeid 0x0<global>
        ether 96:74:f1:6f:4b:c3  txqueuelen 1000  (Ethernet)
        RX packets 177  bytes 16270 (15.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 161  bytes 18477 (18.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

hypnotize@irc:~$

Пока отображается таблица маршрутизации:

hypnotize@irc:~$ ip -6 route show
2a01:4f8:101:3172:251::/80 dev eth0 proto kernel metric 256
fe80::/64 dev eth0 proto kernel metric 256
hypnotize@irc:~$

К сожалению, когда я пытаюсь выполнить команду ping6, появляется сообщение «Подключиться: сеть недоступна». у меня есть net.ipv6.conf.all.forwarding включен.

Вы видите ошибку в моей конфигурации? заранее спасибо


Я исправил опечатку, и теперь там написано:

root@irc:/home/hypnotize# ping6 ipv6.google.com
PING ipv6.google.com(fra16s20-in-x0e.1e100.net (2a00:1450:4001:821::200e)) 56 data bytes
From 2a01:4f8:101:3172:251::3 (2a01:4f8:101:3172:251::3) icmp_seq=1 Destination unreachable: Address unreachable
From 2a01:4f8:101:3172:251::3 (2a01:4f8:101:3172:251::3) icmp_seq=2 Destination unreachable: Address unreachable
From 2a01:4f8:101:3172:251::3 (2a01:4f8:101:3172:251::3) icmp_seq=3 Destination unreachable: Address unreachable
^C
--- ipv6.google.com ping statistics ---
5 packets transmitted, 0 received, +3 errors, 100% packet loss, time 4032ms

root@irc:/home/hypnotize#

Кроме того, таблица маршрутизации теперь выглядит лучше, по крайней мере, в ней есть запись по умолчанию:

root@irc:/home/hypnotize# ip -6 route show
2a01:4f8:101:3172:251::/80 dev eth0 proto kernel metric 256
fe80::/64 dev eth0 proto kernel metric 256
default via 2a01:4f8:101:3172:251:ffff:ffff:ffff dev eth0 metric 1024
root@irc:/home/hypnotize#

Как и многие предприятия, Hetzner обеспечивает безопасность портов коммутаторов на своих сетевых коммутаторах, что означает, что только авторизованные MAC-адреса могут общаться с сетью. Это означает, что аппаратный адрес сетевой карты на вашем сервере может говорить, но виртуальные MAC-адреса ваших виртуальных машин - нет. Таким образом, связать ваши виртуальные машины напрямую с внешним миром не получится. (Если вы заказали дополнительные адреса IPv4, то Hetzner позволит вам сгенерировать виртуальные MAC-адреса для каждого из них, которые вы можете назначить своим виртуальным машинам, что позволит этой настройке работать, но если у вас нет дополнительных адресов IPv4 или Не хочу их покупать, значит, вы не можете этого сделать.)

У меня есть хост виртуальной машины KVM на Hetzner, где виртуальные машины в основном доступны только по IPv6, и я настроил его так.

Вместо прямого подключения к сетевой карте хоста я создаю виртуальные сети для каждой / 80 и назначаю виртуальные машины этим виртуальным сетям. Затем хост будет маршрутизировать между сетевой картой хоста и виртуальными сетями, которые не являются мостовыми (уровень 2), а маршрутизируются (уровень 3).

Итак, хост настроен как:

IPV6ADDR="2a01:4f8:150:43ea::2/64"
IPV6_DEFAULTGW="fe80::1"

Виртуальные сети libvirt настроены как сети / 80. Virt-manager не может обрабатывать создание сетей / 80, поэтому вам нужно будет написать XML самостоятельно. Вот пример:

<network>
  <name>v6net1</name>
  <forward mode='route'/>
  <bridge name='v6net1' stp='on' delay='0'/>
  <domain name='v6net1'/>
  <ip address='192.168.101.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.101.128' end='192.168.101.254'/>
    </dhcp>
  </ip>
  <ip family='ipv6' address='2a01:4f8:150:43ea:1::1' prefix='80'>
    <dhcp>
      <range start='2a01:4f8:150:43ea:1::1000' end='2a01:4f8:150:43ea:1::ffff'/>
    </dhcp>
  </ip>
</network>

Теперь все сетевые карты виртуальных машин добавлены в сеть v6net1 и получают адрес в этом / 80 от DHCPv6. Однако вы можете назначить их вручную, если хотите. Это создает мост v6net1, но сетевая карта хоста не является частью моста. Таким образом, трафик маршрутизируется между виртуальными машинами и внешним миром, и при выходе с хоста трафик имеет MAC-адрес хоста.

Это не распространяется на глобальную связь IPv4, например маскировка или перенаправление портов. Я обрабатываю это отдельно в firewalld, вне libvirt, и не использую функции NAT libvirt. Если вам просто нужен простой NAT, чтобы виртуальные машины могли подключаться к хостам IPv4 и не нуждались во входящем трафике, используйте <forward mode='nat'> вместо. Вы также можете полностью опустить настройку IPv4 для виртуальных машин, поддерживающих только IPv6.