Туннелирование UDP трафика между Windows хостом и удаленным Linux сервером из приватной сети

From Genrietta
Jump to: navigation, search

В данной статье описан метод проброса UDP трафика, когда прямое общение невозможно, например, в силу политик брандмауэра. Ситуацию усложняет то, что трафик нужно пробросит из Linux хоста на Windows хост. Для Windows отсутствует такое изобилие сетевых приложений "из коробки", как имеется под Linux.

Конфигурация

Конфигурация показана на схеме:

Linux-windows-tunnel-conf.png

На Linux сервере запущена программа, которая периодически отправляет UDP датаграммы на заданный IP-адрес/порт. На Windows клиенте запущена программа, которая слушает заданный UDP порт. Задача: организовать доставку UDP датаграмм между приложениями.

Windows хост находится в VPN с Linux хостом, т.е. они в одном широковещательном домене. Но напрямую UDP трафик между хостами не идет, потому что политики брандмауэра не позволяет этого. Изменить настройки брандмауэра невозможно, так как он находится под управлением организации.

Основной путь для работы с Linux хостом - это SSH протокол. Т.е. SSH пропускается политиками безопасности.

Идея

OpenSSH и другие реализации позволяют включать TCP port forwarding. И это является стабильным и проверенным решением, а главное - кроссплатформенным.

Но нам необходимо пробросить UDP трафик, вместо TCP. Для этого необходимо завернуть UDP данные в TCP и обратно.

Таким образом, Linux хост отправляет UDP датаграммы на localhost, данные заворачиваются в TCP и отправляются на localhost, где перенаправляются через SSH на Windows хост. На Windows хосте преобразования идут в обратном направлении. Идея схематически показана на изображении:

Linux-windows-tunnel-idea.png

Реализация

На Windows хосте нам понадобится Cygwin с OpenSSH и nc (netcat).

Допустим, программы используют UDP порт 2000 для общения.

Windows хост:

(cygwin)$ ssh linux-hostname -R 5555:127.0.0.1:5555
(cygwin)$ nc -l 127.0.0.1 5555 | nc -u 127.0.0.1 2000

Linux хост:

(linux)$ nc -l -u 0.0.0.0 2000 | nc 127.0.0.1 5555

Где

  • linux-hostname - адрес Linux хоста.
  • 5555 - это вспомогательный TCP порт и может быть любым, главное, больше 1024.

Программа на Linux должна слать UDP датаграммы на 127.0.0.1:2000, которые перенаправляются на Windows хост и Windows-приложение будет получать их на 127.0.0.1:2000.

Анализ компонентов

Проблемы