У меня есть машина с Ubuntu, на которой работает демон сервера (в данном случае Unity3d Unet Game Server), который предназначен для взаимодействия с клиентами исключительно через UDP. Клиенты работают на Windows 7 и Windows 10. Из-за требований безопасности сети клиента, я должен сделать все соединения через туннель SSH (который передает только пакеты TCP). Я могу использовать Putty или cygwin OpenSSH на клиентах, но ни один из них, похоже, не поддерживает функцию туннеля openssh -w.
Я успешно настроил socat
для пересылки пакетов UDP через TCP между одним клиентом и сервером. На сервере, следуя слегка измененной версии инструкции внизу этой страницы. Я прежде всего разработчик, и хотя я знаю достаточно сетей Unix, чтобы быть опасными, это выходит за рамки моего типичного навыка.
На сервере я использую $socat tcp4-listen:7776,reuseaddr,fork udp:localhost:7777
На моем клиенте я запускаю $socat -T15 udp-listen:7777,reuseaddr,fork TCP4:localhost:7776
.
Затем я запускаю SSH-туннель с 7776 до localhost:7776.
Это хорошо работает с одним клиентом. Однако, как только я пытаюсь подключить более одного клиента, оба клиента перестают работать. Я подозреваю, что это потому, что socat
действует как прокси, поэтому мой сервер видит несколько соединений с localhost:7777, и ни у сервера, ни у socat нет достаточной информации для маршрутизации пакетов UDP обратно их отправителям.
Это пахнет как идеальный вариант использования для виртуальных интерфейсов или фиктивных интерфейсов - я считаю, что если бы я мог определить виртуальные / фиктивные интерфейсы с уникальными IP-адресами, например: 10.0.0.2, 10.0.0.3 и т.д., Как виртуальные / фиктивные, и связать экземпляр socat
к каждому виртуальному интерфейсу мои клиенты и настройте свои туннели SSH с конечной точкой 10.0.0. х, я должен быть в состоянии принять один клиент на интерфейс. Очевидно, это не масштабируется, но мне нужно всего несколько клиентов для этого варианта использования.
Думаю ли я в разумном направлении? Если да, то как мне направить макеты так, чтобы я мог связать с ними socat и заставить socat создавать пакеты udp с 10.0.0. x:7777 маршрутизируется на локальный хост:7777 (и принимает пакеты от локального хоста:с 7777 по 10.0.0. x)?
Я понимаю, что есть лучшие способы для достижения этой цели (например, VPN или ssf), но из-за требований клиента я ограничен решениями, которые работают через туннель SSH. Я могу предложить установить дополнительное программное обеспечение на сервере, но все общение должно осуществляться через TCP через SSH туннель.
[edit] Похоже, что одной из возможных альтернатив будет запуск openvpn на сервере, а затем туннелирование клиентского соединения openvpn через туннель ssh. Это кажется грязным, но, возможно, более надежным и расширяемым, чем слияние с socat. Любые мысли или мнения по поводу этих двух потенциальных решений, учитывая мои требования?[/ Edit]