IPv6 на Linux tun/tap: NDP не работает

Я работаю над старым кодом, который использовался для подключения различных устройств IPv6 по разным сетям (PW, полностью похожий на 802.15.4). Для этого на каждом устройстве (на самом деле Tun, а не Tap) были созданы Linux-интерфейсы tun / tap с кодом C, который может принимать исходящие пакеты от tun и доставлять их в ПЛК, а в другом направлении он может читать входящие пакеты из ПЛК и ввести в интерфейс Tun.

Система работает в основном нормально, но только я обнаружил, что функция NDP, кажется, работает неправильно. Во-первых, я заметил, что с двумя такими устройствами я не могу пропинговать друг друга по их локальному адресу IPv6-ссылки (fe80::.../10). Затем я использовал tcpdump, чтобы отслеживать трафик, и обнаружил, что сообщения "Соседства / реклама соседей" вообще нет. Еще одна странная вещь, которую я обнаружил, заключается в том, что есть реклама маршрута, отправленная с одного устройства сети (главного устройства ПЛК, которое является узлом координатора вызова), но не с любого другого устройства в сети.

Я хочу понять, какое правильное поведение мне следует ожидать от такой сети в соответствии с NDP IPv6 и как это сделать.

Буду признателен, если кто-нибудь дать мне идею.

-woody

1 ответ

Ожидаемое поведение состоит в том, что NDP используется на интерфейсах TAP, но не на интерфейсах TUN.

TAP эмулирует Ethernet, поэтому ядро ​​будет доставлять фреймы Ethernet в ваш код и ожидать фреймы Ethernet от вашего кода. Поэтому он должен сначала выполнить NDP, чтобы узнать, какой MAC-адрес назначения использовать для IP-пакетов, которые он передает вашему коду.

TUN, с другой стороны, делает IP без уровня Ethernet. Ваш код будет получать IP-пакеты без дополнительных заголовков, и он будет ожидать получения IP-пакетов от вашего кода. При желании его можно настроить на наличие небольшого заголовка перед пакетом IP, чтобы различать пакеты IPv4 и IPv6, однако вы также можете использовать поле версии IP для различения (если вы не используете очень устаревшую версию ядра).

Я ожидаю, что локальные адреса будут работать на обоих типах интерфейсов. Как и с другими адресами, NDP будет использоваться на TAP, но не на интерфейсах TUN.

Другие вопросы по тегам