Маршрутизация трафика с интерфейсом TUN/TAP

Я новичок в сетевом программировании и пытаюсь понять управление трафиком через интерфейс TUN/TAP.

Так как у меня практически нет навыков системного программирования, и я чувствую себя уверенно на Java; Я использую OpenVPN Tun / Tap Driver и готовую привязку Java для него. Работает в режиме TAP.

В качестве примера приложения я пытаюсь имитировать без шифрования, без аутентификации клиент-сервер VPN-приложения.

Я могу ловить пакеты Ethernet Frame, но для части маршрутизации я потерпел неудачу. (Я могу изменить таблицы маршрутизации / arp.)

  1. Кто-нибудь знает, как OpenVPN отправляет пакеты от клиента к серверу и от сервера к цели. Открытие сокетов из Java выглядит как альтернатива; но я надеялся, что изменения пакетов (изменение IP-адресов и / или MAC-адресов) и обратной записи в интерфейс виртуального крана будет достаточно. Это так?

  2. Могу ли я внедрить пакеты для отправки в другие местоположения, или по умолчанию полученный пакет перемещается на прикладной уровень?

-- Редактировать:

Scneario

Client Tap0 _____ Server Tap0 ______ Target
       Eth0              Eth0

Цель: пинговать с клиента, переходить через интерфейсы тапа, цель видеть только ip сервера (анонимизация)

Чего я достиг до сих пор.

  • Поймать трафик на клиентском интерфейсе tap0.

  • Я могу перенаправить трафик на сервер Tap, чтобы связать вещи, которые я использовал для программирования сокетов Java между клиент-сервером.

Теперь я читаю пакеты из сокета на сервере и пытаюсь открыть метод записи драйвера OpenVPN Tap, чтобы двигаться вперед, но я не уверен, где я могу потерпеть неудачу. Я вижу пакеты с tcpdump на сервере tap0, но они не передаются на сервер eth0.

Мой самый важный вопрос: если я изменю пакет (ip, mac адрес) и вызову метод записи, возможно ли, чтобы пакет двигался вперед. (Или он переходит на прикладной уровень, что бы вы ни меняли??)

Любая помощь будет оценена.

1 ответ

1. Маршрутизация является проблемой уровня 3 (IP) и обрабатывается операционной системой. Что касается кадров Ethernet на уровне 2, у вас есть несколько вариантов. В любом случае вам придется анализировать заголовки входящих пакетов и извлекать MAC-адрес, а также определять на основе MAC-адреса, куда следует передавать пакет: конкретному клиенту, всем клиентам (широковещательные сообщения) или локальному интерфейсу доступа.

Вариант 1. На каждом клиенте используйте устройство настройки и позвольте серверу использовать устройство для подключения. Назначьте псевдо MAC-адреса каждому клиенту, ответьте соответственно на запросы ARP от операционной системы сервера и позвольте операционной системе на сервере позаботиться обо всем остальном. Применительно к приложению вам нужно будет только переслать все входящие пакеты на устройство крана и все исходящие пакеты клиенту, которому вы назначили этот MAC.

Вариант 2: разрешить клиентам выбирать собственный MAC-адрес и пересылать ARP-запросы через сеть. Серверное приложение должно решить для входящих пакетов от клиента, следует ли пересылать пакет клиенту или отправлять его на локальное отводное устройство, если адрес совпадает с MAC-адресом локального устройства.

В обоих случаях клиенты передают все пакеты со своего локального устройства настройки / прослушивания на сервер и наоборот.

2. Вы можете сделать почти все, что угодно. Пакет "принимается" только тогда, когда вы решаете записать его на устройство, и вы, конечно, можете закалить любые пакеты или добавить новые,...

В качестве последнего комментария я обнаружил, что игра с устройствами tun концептуально проще, поскольку они работают на уровне 3. Вам придется открывать устройство tun на сервере для каждого клиента, но в вашем приложении вам придется ничего не нужно делать, кроме как пересылать что-либо, поступающее с устройства, одному клиенту, и наоборот.

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