Как использовать туннель TUN / TAP из пользовательской программы?

9

Недавно я обнаружил существование интерфейсов Linux TUN / TAP и все еще пытаюсь понять их. Я думаю, что понял основную концепцию - создаются псевдоустройства, которые эмулируют сетевой интерфейс, и вместо передачи данных на оборудование они передаются в пользовательскую программу.

Как бы вы указали несвязанной программе использовать этот туннель?

Например, до создания туннеля моя система содержит только eth0 и lo, обычный интерфейс Ethernet (подключенный к моей локальной сети) и интерфейс обратной связи. После того, как программа создает и настраивает туннель, у меня появляется новый интерфейс gr0, которому я дал IP-адрес, который находится в моей локальной сети, но не используется (поэтому мы все в одной подсети). Как бы я заставил несвязанную программу использовать этот «туннель»? Скажем, у меня было простое клиент-серверное приложение для передачи сообщений Python, использующее TCP-соединение, как я могу настроить его для использования туннеля?

Я прошу прощения, если я упустил что-то основное, но, как обычно, мне удалось запутаться в схеме вещей. Опять же, все, что я хочу, это чтобы простая программа TCP использовала этот туннель.

Спасибо!

Мистер Шикаданс
источник

Ответы:

7

Это не всегда "туннель". TUN / TAP - это просто определенные драйверы NIC. С точки зрения сетевого стека они действуют как любые другие сетевые интерфейсы: они могут иметь IP-адреса, могут быть двухточечными или широковещательными интерфейсами. Правила маршрутизации также применяются к ним. Но весь трафик, который записывается в один из этих сетевых интерфейсов, поступает в какую-то пользовательскую программу для обработки, а все данные, записанные пользовательской программой напрямую, /dev/tunXвыглядят как входящие пакеты для сетевого стека.

При обычной настройке туннелирования сервер и клиент имеют устройства TUN с назначенными адресами. Таблицы маршрутизации, настроенные на них обоих, направляют необходимый трафик к этим устройствам TUN. Когда пакет направляется на tun0, ядро ​​отправляет его в пользовательскую программу (клиент), которая отправляет этот пакет другой программе на удаленном компьютере (сервере), например, через TCP-соединение. На удаленной машине другая программа (сервер) получает пакет от клиента и записывает его на свое /dev/tunXустройство, «внедряя» этот пакет в сетевой стек. И туннелируемый пакет обрабатывается как любой другой.

gelraen
источник
1
Таким образом, ответ (для моих целей) заключается в настройке таблицы маршрутизации для направления трафика на эти интерфейсы. Это было то, что я упустил, но теперь я должен быть в состоянии найти решение. Кроме того, я ценю объяснение, поскольку оно проясняет ситуацию. Спасибо!
Мистер Шикаданс
2
В итоге я использовал «route add <TUN IP ADDR> dev gr0». Это позволило мне перенаправить трафик через новый интерфейс. Еще раз спасибо!
Мистер Шикаданс