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

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

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

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

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

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

-вуди

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

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

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

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