ICMPv6 запросы соседства остаются без ответа в гостевой виртуальной машине.

Вопрос или проблема

У меня следующая настройка:

------------------------------------------------------------------------------------------
|Host                                                                                    |
|                                                                                        |
|    eth0   - inet6 2001:XXX:XXX:a100:000::1/80  (да, сегментирование /64 от ISP         |
|    virbr0 - inet6 2001:XXX:XXX:a100:100::1/80   на два блока)                          |
|      - vnet1                                                                           |
|          |                                                                             |
|     -------------------------------------------------------------------------------|   |
|    | Guest VM                                                                      |   |
|    |    enp1s0 - inet6 2001:XXX:XXX:a100:100:000:0:3/96 (да, дальнейшее сегментирование)|   |
|    |    tun0   - inet6 2001:XXX:XXX:a100:100:310:0:1/96                            |   |
|    |-------------------------------------------------------------------------------|   |
|                                                                                        | 
|-----------------------------------------------------------------------------------------   

теперь я могу достичь IPv6-адреса, назначенного enp1s0 на гостевой машине, из другого места в Интернете. Без проблем. Но попытка достичь адреса, назначенного tun0, не удается:

$ ping 2001:XXX:XXX:a100:100:310:0:1
PING 2001:XXX:XXX:a100:100:310:0:1 (2001:xxx:xxx:a100:100:310:0:1) 56 data bytes
From 2001:XXX:XXX:a100::1 icmp_seq=1 Destination unreachable: Address unreachable

Внутри гостевой машины (сейчас работает Ubuntu 24.04, хотя я также пробовал Debian 12 и Ubuntu 22, если это важно) я вижу следующее с помощью tcpdump:

16:23:04.834512 IP6 fe80::5054:ff:fecd:92d4 > ff02::1:ff00:1: ICMP6, запрос соседства, кто имеет 2001:xxx:xxx:a100:100:310:0:1, длина 32
16:23:05.836337 IP6 fe80::5054:ff:fecd:92d4 > ff02::1:ff00:1: ICMP6, запрос соседства, кто имеет 2001:xxx:xxx:a100:100:310:0:1, длина 32

На них нет ответа. Я, конечно, попробовал, казалось бы, все (изменение настроек sysctl, игра с proxy_ndp и т.д., но чтобы не загромождать пост, могу сказать:

  • конечно, я могу пинговать 2001:xxx:xxx:a100:100:310:0:1 изнутри VM, так что IP корректный и назначен tun0 (и да, это интерфейс туннеля POINTOPOINT, если это важно…)
  • аналогично, я могу пинговать изнутри VM адрес eth0 на хосте и, в общем-то, в любом другом месте в Интернете. Без проблем.
  • пересылка ipv6 включена через sysctl (net.ipv6.conf.all.forwarding = 1)
  • правила ip6table все пустые, все установлено на прием, ничего не должно отбрасываться или что-то еще. На самом деле, другие запросы соседей для локального адреса отвечают нормально.

Худшая часть в том, что эта же VM, развернутая у другого провайдера хостинга, работает нормально. Это не сравнение яблок с яблоками, потому что там это VM, развернутая в их облачном сервисе, тогда как здесь это KVM, развернутая на нашем собственном выделенном сервере, так что невозможно узнать, есть ли какие-то настройки в их образе VM и т.д. по сравнению с нашим и т.д., но в принципе концепция работает нормально в другом месте. Но на этой машине ничего.

Итак, наконец вопрос… почему Linux-машина может не отвечать на ICMPv6 запросы соседей, спрашивающих о заданном адресе, если этот адрес действительно известен и доступен?

Идеи приветствуются. Большое спасибо заранее 🙏

Ответ или решение

Проблема, с которой вы столкнулись, связана с тем, что ICMPv6 neighbor solicitations (NS), отправляемые для интерфейса tun0, остаются без ответа. Давайте рассмотрим это поведение, зарегистрируем возможные причины и предложим решения для устранения проблемы. Для этого мы применим метод TEA (теория, пример, применение).

Теория

При работе с IPv6, протокол ICMPv6 служит важным компонентом для определения соседей и управления адресацией в сетях. Neighbor Solicitation (NS) — это один из ключевых механизмов, используемых устройствами для определения канального адреса другого узла, ассоциируемого с IP-адресом, что является аналогом ARP в IPv4. Когда NS пакеты отправляются, соседний узел должен ответить пакетами Neighbor Advertisement (NA), что подтверждает его присутствие и позволяет другим устройствам успешно маршрутизировать пакеты к нему.

Отсутсвие ответов на NS запросы может возникать по различным причинам, включая проблемы сетевой конфигурации, фильтрацию ICMPv6 пакетов, некорректную настройку сетевых интерфейсов или IPv6 адресации, или проблемы, связанные с маршрутизацией.

Пример

В вашей конфигурации, гостевая виртуальная машина имеет два интерфейса enp1s0 и tun0, оба с IPv6 адресами. Судя по предоставленной информации:

  • Пакеты, направленные на enp1s0, достигают целевой машины и обрабатываются корректно.
  • Однако пакеты на tun0 получают ICMPv6 сообщение "Destination unreachable".

Вот несколько ключевых моментов для анализа:

  1. Сетевой интерфейс: tun0 является туннельным интерфейсом, который отличается от физического интерфейса (enp1s0), что может вызывать специфические особенности в обработке NS/NA сообщений.

  2. Маршрутизация: Важно проверить, правильно ли настроена маршрутизация для IPv6 в вашей гостевой машине и убедиться, что маршруты для 2001:XXX:XXX:a100:100:310:0:1 присутствуют и активны.

  3. Сетевые правила: Отсутствие правил в ip6tables указывает на то, что вероятно нет блокировок сети на уровне правил, но для IPv6 необходимы тщательные проверки пересылки и переводов адресов.

Применение

  1. Проверка конфигурации интерфейсов: Убедитесь, что интерфейсы в гостевой системе сконфигурированы правильно. Попробуйте выполнить следующие команды, чтобы убедиться, что tun0 действительно имеет назначенный IPv6 адрес:

    ip addr show tun0
  2. Включите ведение журнала ICMPv6 пакетов: Проблемы с соседством могут происходить из-за фильтрации определённых ICMPv6 сообщений. Настройте ваш ip6tables для временного логирования всех ICMPv6 сообщений для выяснения, не блокируются ли они случайно. Это можно сделать добавлением следующего правила:

    ip6tables -I INPUT -p icmpv6 -j LOG --log-prefix "ICMPv6 INPUT: "
    ip6tables -I OUTPUT -p icmpv6 -j LOG --log-prefix "ICMPv6 OUTPUT: "
  3. Проверка сетевой маршрутизации: Убедитесь, что маршрутизация пакетов в вашем хосте и гостевой машине сконфигурирована верно:

    ip -6 route show
  4. Настройки конфигурации Kernel: В основном, глобальная пересылка IPv6 уже включена, раз NS пакеты доходят до хоста, но стоит убедиться, что proxy_ndp настроен и работает правильно для tun0.

    Проверьте, включен ли NDP proxy:

    sysctl net.ipv6.conf.all.proxy_ndp
  5. Трассировка маршрута пакетов: Используйте traceroute или аналогичные инструменты для IPv6, чтобы понять, на каком этапе теряются пакеты.

  6. Сравнительный анализ: Поскольку аналогичная конфигурация работает на другом провайдере, полезно сравнить все аспекты сетевой конфигурации, системы и настройку виртуализации, чтобы найти скрытые отличия.

Следуя вышеуказанным шагам, вы сможете диагностировать и решить проблему, связанную с отсутствием откликов на ICMPv6 neighbor solicitation для tun0 на вашей гостевой машине. Это систематический подход поможет идентифицировать ошибки конфигурации и лучше понять работу сетевых протоколов, что усилит общую поддержку сетевой инфраструктуры в вашем окружении.

Оцените материал
Добавить комментарий

Капча загружается...