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

Проблемы со связью на вторичном интерфейсе tap0

Я использую UDP через ipv6 в качестве стека связи.

У меня есть сетевой клиент, работающий на вторичном виртуальном интерфейсе tap0. Он генерирует сообщения для сервера, который должен работать на том же интерфейсе, но с другим адресом ipv6 в области связи. Я вижу правильные сообщения, созданные клиентом на wirehark.
На данный момент у меня нет готового кода сервера, но я использую netcat в качестве замены для сервера, чтобы проверить получение сообщений, что я сделал следующим образом:

nc -l -6 -vvv -u fe80::d4b2:dcff:fe59:6d2%tap0 61616

fe80 :: d4b2: dcff: fe59: 6d2 - IPv6-адрес области связи на стороне сервера. Трассировки Wireshark на tap0 ясно показывают, что сгенерированные пакеты предназначены для вышеупомянутого адреса и порта ipv6, но netcat НЕ может принимать какие-либо пакеты. ifconfig показывает, что у меня есть указанный выше IP, назначенный для tap0. Более того, если я выполню следующую команду, я смогу получать пакеты на netcat (сервере).

nc -6 -vvv -u fe80::d4b2:dcff:fe59:6d2%tap0 61616 < raw_message_file

Как ни странно, отправка вышеуказанного netcat "raw_message_file" не перехватывается wirehark, запущенным на tap0. Следующие ping также не захватываются wirehark.

ping6 -I tap0 fe80::d4b2:dcff:fe59:6d2

Как могло случиться так, что даже при явном указании интерфейса для netcat и ping пакет не был получен / отправлен на этом интерфейсе?

PS1: Виртуальный интерфейс tap0 открывается кодом клиента. Через некоторое время он отправляет сообщение на сервер, который должен прослушивать этот интерфейс с другим, но фиксированным IPv6.
PS2: Я думаю, что мое описание немного сбивает с толку; пожалуйста, задавайте вопросы, если они у вас есть?

РЕДАКТИРОВАТЬ: tcpdump на localhost показал, что netcat и ping проходят через интерфейс localhost. У меня вопрос, почему?

Похоже, вы немного запутались в том, как работает IPv6.

Давайте сначала проясним несколько вещей: у вас нет клиента или сервера "на«сетевой интерфейс, это сбивает с толку, особенно когда вы говорите об устройствах tun или tap, которые нарушают некоторые из наших соглашений. Кроме того, вы этого не делаете»открыто"устройство касания (за исключением случаев, когда вы пишете помощник tun / tap, что, похоже, здесь не так), вместо этого вы привязать адрес к разъем а операционная система позже определит, как направлять исходящие пакеты к сетевым интерфейсам и как доставлять от них входящие пакеты в ваш локальный процесс. Имейте в виду, что это делает операционная система, а не ваша программа.

Когда ваш процесс связывает сокет с локальным адресом IPv6, он просто сообщает ОС, с какого адреса будут отправляться пакеты, и что пакеты из сети будут захвачены и ретранслированы вашему процессу. В ...%tap0 суффикс локального адреса ссылки является частью адреса, это просто подсказка для ОС, поскольку все локальные адреса ссылки разделяют единое глобальное адресное пространство во всех сетях, это не означает, что процесс каким-либо образом связан или заблокирован для этого конкретного устройства.

Если вы отправляете пакеты на свой компьютер, убедитесь, что они вообще не будут проходить через интерфейс касания. Возможно, это ваш ответ: единственные пакеты, которые должны проходить через интерфейс tap, - это те, которые идут к тому, что находится на другой стороне вашего туннеля, нет смысла отправлять туда что-либо, что идет на вашу собственную машину. Эти пакеты вместо этого доставляются через lo интерфейс. Прикрепите wirehark к lo интерфейс, и вы должны увидеть пакеты, которые вам не хватает.

Когда вы назначаете адрес интерфейсу, операционная система знает, что этот адрес теперь принадлежит вашему компьютеру и что все, что отправлено на этот адрес (включая все, что отправлено из самого локального процесса), должно быть направлено на этот компьютер. Все, что выходит из физических или логических интерфейсов, например eth0 или tap0 действительно отправляются с вашего компьютера, если что-то должно остаться в системе, он должен развернуться на lo интерфейс, так что пакет возвращается в нижнюю часть стека и до процессов-получателей.

Где это отслеживает ОС? В таблице маршрутизации. Попробуй это:

ip -6 route list table all root fe80::/10

Вы должны увидеть один или несколько маршрутов к fe80 :: / 64, по одному для каждого физического или логического сетевого интерфейса с поддержкой IPv6 в вашей системе, а также несколько локальных локальных адресов для каждого из назначенных адресов IPv6. Вы заметите, что локальные адреса настроены на использование dev lo, благодаря чему ОС знает, что все, что идет на эти адреса, не будет отправлено.