Вопрос или проблема
У меня следующая настройка:
------------------------------------------------------------------------------------------
|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".
Вот несколько ключевых моментов для анализа:
-
Сетевой интерфейс:
tun0
является туннельным интерфейсом, который отличается от физического интерфейса (enp1s0
), что может вызывать специфические особенности в обработке NS/NA сообщений. -
Маршрутизация: Важно проверить, правильно ли настроена маршрутизация для IPv6 в вашей гостевой машине и убедиться, что маршруты для
2001:XXX:XXX:a100:100:310:0:1
присутствуют и активны. -
Сетевые правила: Отсутствие правил в
ip6tables
указывает на то, что вероятно нет блокировок сети на уровне правил, но для IPv6 необходимы тщательные проверки пересылки и переводов адресов.
Применение
-
Проверка конфигурации интерфейсов: Убедитесь, что интерфейсы в гостевой системе сконфигурированы правильно. Попробуйте выполнить следующие команды, чтобы убедиться, что
tun0
действительно имеет назначенный IPv6 адрес:ip addr show tun0
-
Включите ведение журнала 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: "
-
Проверка сетевой маршрутизации: Убедитесь, что маршрутизация пакетов в вашем хосте и гостевой машине сконфигурирована верно:
ip -6 route show
-
Настройки конфигурации Kernel: В основном, глобальная пересылка IPv6 уже включена, раз NS пакеты доходят до хоста, но стоит убедиться, что
proxy_ndp
настроен и работает правильно дляtun0
.Проверьте, включен ли NDP proxy:
sysctl net.ipv6.conf.all.proxy_ndp
-
Трассировка маршрута пакетов: Используйте
traceroute
или аналогичные инструменты для IPv6, чтобы понять, на каком этапе теряются пакеты. -
Сравнительный анализ: Поскольку аналогичная конфигурация работает на другом провайдере, полезно сравнить все аспекты сетевой конфигурации, системы и настройку виртуализации, чтобы найти скрытые отличия.
Следуя вышеуказанным шагам, вы сможете диагностировать и решить проблему, связанную с отсутствием откликов на ICMPv6 neighbor solicitation для tun0
на вашей гостевой машине. Это систематический подход поможет идентифицировать ошибки конфигурации и лучше понять работу сетевых протоколов, что усилит общую поддержку сетевой инфраструктуры в вашем окружении.