Реализация IP-шлюза (на Java?) - PullRequest
       46

Реализация IP-шлюза (на Java?)

1 голос
/ 08 октября 2019

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

Как мне написать программу для приема и обработки этого трафика?

Какие инструменты и библиотеки доступны для этого? Например, это можно сделать через iptables в Linux? (Я бы предпочел реализовать его на Java, если это возможно).

Одним из способов может быть реализация такой программы, как прокси (например, HTTP + SOCKS) и настройка маршрутизатора для отправки всего трафика на проксипрозрачно. Другим может быть открытие необработанного сокета и ручная обработка всего трафика, но это может фактически означать повторную реализацию сетевого стека. Есть ли лучший способ?

1 Ответ

0 голосов
/ 08 октября 2019

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

Сначала постарайтесь вообще ничего не писать. Существуют решения для этой задачи (подсказка: ищите "Эмулятор WAN").

Если что-то, что вы находите, недостаточно хорошо, мой следующий шаг - написать что-то с использованием tc и нетем . Linux имеет очень хорошую поддержку как для маршрутизации, так и для мостов. Используя tc + netem, вы можете добавить задержку, потерю, джиттер и почти все остальное сверху. При необходимости создайте утилиту более высокого уровня, возможно на Java, для настройки tc и предоставления более приятного пользовательского интерфейса.

Третий вариант - написать что-то на самом деле. Здесь все становится сложнее, особенно если вы хотите сделать это в Java. Чтобы выполнить мост или маршрутизацию, вам нужно получить кадры в пользовательское пространство (здесь может помочь iptables + nfqueue ), затем обработать их в соответствии с вашей собственной логикой и, наконец, записать их , используясырая розетка . Это довольно много работы.

Реализация HTTP-прокси будет проще, поскольку вам не нужно работать на уровне отдельных пакетов. Вы можете избежать низкоуровневых вещей (iptables / nfqueue / raw sockets) и просто использовать простые и простые сокеты или даже целые реализации HTTP-прокси в Java, такие как это от Jetty .

Есливам понадобится дополнительная информация о некоторых вещах, возможно, вы захотите открыть второй, более сфокусированный вопрос после прочтения.

...