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

Туннельный сервер Linux 6in4 не может правильно пересылать пакеты IPv6 из-за сбоя обнаружения соседей

Я пытаюсь настроить туннельный сервер 6in4 на своем VPS. Клиент и сервер могут пинговать IPv6-адреса друг друга, когда я пытаюсь пинговать внешний сервер от клиента, я получаю сообщение об ошибке недоступности адреса ICMP.

Но я могу без проблем пинговать веб-сайт IPv6 с сервера, и после пинга с сервера я могу пинговать с клиента примерно через 30 секунд, после чего я снова получаю ошибку недоступности адреса ICMP.

tcpdump показывает, что при эхо-запросе с сервера он отправит пакет запроса соседа, используя свой общедоступный IPv6-адрес, и правильно получит обратно объявление соседа от шлюза. Но при пинге от клиента сервер отправит пакет запроса соседа, используя свой локальный адрес канала, и не получит ничего обратно. После нескольких попыток сервер откажется и вернет клиенту недоступный ICMP-адрес.

Как я могу это исправить? Я знаю, что могу добавить в шлюз постоянную запись соседа, но это довольно хакерский метод, поэтому я хочу по возможности избегать этого.

Вот дополнительная информация:

tcpdump (при пинге с сервера):

18:14:33.988952 IP6 [server's public IPv6 address] > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has [gateway's IPv6 address], length 32
18:14:33.989410 IP6 [gateway's IPv6 address] > [server's public IPv6 address]: ICMP6, neighbor advertisement, tgt is [gateway's IPv6 address], length 32
18:14:33.989428 IP6 [server's public IPv6 address] > google-public-dns-a.google.com: ICMP6, echo request, seq 1, length 64
18:14:34.038299 IP6 google-public-dns-a.google.com > [server's public IPv6 address]: ICMP6, echo reply, seq 1, length 64

tcpdump (при пинге от клиента обратите внимание, что fe80 :: 5054: ff: fe3b: 3836 - это локальный адрес ссылки сервера):

18:12:35.284184 IP [client's IPv4 address] > server: IP6 [sit tunnel address (client)] > google-public-dns-a.google.com: ICMP6, echo request, seq 1, length 64
18:12:35.284263 IP6 fe80::5054:ff:fe3b:3836 > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has [gateway's IPv6 address], length 32
18:12:36.282458 IP6 fe80::5054:ff:fe3b:3836 > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has [gateway's IPv6 address], length 32
18:12:37.282470 IP6 fe80::5054:ff:fe3b:3836 > ff02::1:ff00:1: ICMP6, neighbor solicitation, who has [gateway's IPv6 address], length 32
18:12:38.282503 IP server > [client's IPv4 address]: IP6 [sit tunnel address (server)] > [sit tunnel address (client)]: ICMP6, destination unreachable, unreachable address google-public-dns-a.google.com, length 112

После пинга от клиента вывод ip neigh на сервере выглядит так (нерелевантные записи удалены):

[gateway's IPv6 address] dev eth0  router FAILED

ip addr и ip -6 route (адреса анонимны):

.. snipped ..
2: eth0: <BROADCAST,MULTICAST,ALLMULTI,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
    link/ether aa:bb:cc:dd:ee:ff brd ff:ff:ff:ff:ff:ff
    inet .. snipped .. scope global eth0
       valid_lft forever preferred_lft forever
    inet6 2001:db8:aa:b::cccc:1/48 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe3b:3836/64 scope link 
       valid_lft forever preferred_lft forever

9: sit: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1472 qdisc noqueue state UNKNOWN 
    link/sit .. snipped .. peer 1.2.3.4
    inet6 2001:db8:aa:b::cccc:8001/120 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::dafb:71de/128 scope link 
       valid_lft forever preferred_lft forever

::1.2.3.4 dev sit  metric 1024 
2001:db8:aa:b::cccc:8000/120 dev sit  proto kernel  metric 256
2001:db8:aa::/48 dev eth0  proto kernel  metric 256 
fe80::/64 dev eth0  proto kernel  metric 256 
default via 2001:db8:aa::1 dev eth0  metric 1024 

Эта установка в корне нарушена. Вам понадобится множество хаков, таких как статические маршруты, прокси-NDP и т. Д., Чтобы заставить его работать. Здесь нет красивых решений ...

Теперь как это должен сделать это:

  • Интернет-провайдер предоставляет вам / 48 адресного пространства IPv6.
  • Каждая локальная сеть - это / 64
  • Ваши серверы на / 64 напрямую подключены к интернет-провайдеру
  • Ваш интернет-провайдер предоставляет вам способ маршрутизации префиксов на ваш сервер (ы)
    • статическая маршрутизация распространена у известных мне интернет-провайдеров
    • DHCPv6-PD с длительной стабильной арендой также может решить эту проблему