Маршрутизация трафика с интерфейсом TUN/TAP
Я новичок в сетевом программировании и пытаюсь понять управление трафиком через интерфейс TUN/TAP.
Так как у меня практически нет навыков системного программирования, и я чувствую себя уверенно на Java; Я использую OpenVPN Tun / Tap Driver и готовую привязку Java для него. Работает в режиме TAP.
В качестве примера приложения я пытаюсь имитировать без шифрования, без аутентификации клиент-сервер VPN-приложения.
Я могу ловить пакеты Ethernet Frame, но для части маршрутизации я потерпел неудачу. (Я могу изменить таблицы маршрутизации / arp.)
Кто-нибудь знает, как OpenVPN отправляет пакеты от клиента к серверу и от сервера к цели. Открытие сокетов из Java выглядит как альтернатива; но я надеялся, что изменения пакетов (изменение IP-адресов и / или MAC-адресов) и обратной записи в интерфейс виртуального крана будет достаточно. Это так?
Могу ли я внедрить пакеты для отправки в другие местоположения, или по умолчанию полученный пакет перемещается на прикладной уровень?
-- Редактировать:
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 на сервере для каждого клиента, но в вашем приложении вам придется ничего не нужно делать, кроме как пересылать что-либо, поступающее с устройства, одному клиенту, и наоборот.