Ваш вопрос очень широкий, поэтому ответ будет таким же широким. Я надеюсь, что это поможет вам найти некоторые предварительные указания для исследования.
Сначала постарайтесь вообще ничего не писать. Существуют решения для этой задачи (подсказка: ищите "Эмулятор WAN").
Если что-то, что вы находите, недостаточно хорошо, мой следующий шаг - написать что-то с использованием tc и нетем . Linux имеет очень хорошую поддержку как для маршрутизации, так и для мостов. Используя tc + netem, вы можете добавить задержку, потерю, джиттер и почти все остальное сверху. При необходимости создайте утилиту более высокого уровня, возможно на Java, для настройки tc и предоставления более приятного пользовательского интерфейса.
Третий вариант - написать что-то на самом деле. Здесь все становится сложнее, особенно если вы хотите сделать это в Java. Чтобы выполнить мост или маршрутизацию, вам нужно получить кадры в пользовательское пространство (здесь может помочь iptables + nfqueue ), затем обработать их в соответствии с вашей собственной логикой и, наконец, записать их , используясырая розетка . Это довольно много работы.
Реализация HTTP-прокси будет проще, поскольку вам не нужно работать на уровне отдельных пакетов. Вы можете избежать низкоуровневых вещей (iptables / nfqueue / raw sockets) и просто использовать простые и простые сокеты или даже целые реализации HTTP-прокси в Java, такие как это от Jetty .
Есливам понадобится дополнительная информация о некоторых вещах, возможно, вы захотите открыть второй, более сфокусированный вопрос после прочтения.