Я работаю над простым решением для туннелирования трафика (Linux).
Клиентская сторона создает интерфейс tun
, маршрутизирует весь трафик на нем, упаковывает все поступившие пакеты и отправляет на серверную сторону через соединение udp
или tcp
.
Ожидается, что сторона сервера будет работать как NAT
. Измените IP-адрес источника, порт источника (для tcp / udp), поместите пакет на внешний сетевой интерфейс через sock_raw
, прослушайте ответ через sock_raw
, сохраните карту исходного-источника-порта <-> replace-source-port и отправьте ответы обратно клиенту.
Вопрос : как выбрать replaced-source-port
? ОС выбирает их из эфемерных портов . Я не могу выбрать это сам, это вызвало бы конфликты. Ядро ОС выбирает порт после того, как я отправляю пакет через sock_raw
, и у меня нет шансов построить карту исходных портов <-> замененных исходных портов. Даже если я сам выберу порт - ядро ОС ответит tcp
rst
на все входящие tcp-пакеты с dst port
, не связанные с конкретным приложением.
P.S. Я не уверен в общем решении для туннелирования тоже. Ваши предложения будут высоко оценены.