Цель:
Я хочу выполнить максимально быструю передачу файлов по протоколу TCP между двумя машинами, расположенными за двумя разными NAT, в ситуации, когда общедоступный порт нельзя перенаправить ни на одну из двух машин (локальные политики).
Аппроксимация:
До сих пор я мог: 1) настроить VPN с центральным общедоступным узлом, выполняющим роль ретранслятора (OpenVPN), 2) настроить ячеистую VPN для получения прямой связи между обеими машинами без ретрансляции (tinc). Затем VPN можно беспрепятственно использовать для передачи данных через любой сторонний клиент / сервер передачи файлов (как если бы обе машины находились в одной локальной сети).
Проблема:
Линия между двумя компьютерами довольно нестабильна, и один поток TCP обычно достигает лишь небольшой доли доступной полосы пропускания. Кроме того, инкапсуляция TCP поверх TCP вызывает дополнительные издержки и, как известно, неэффективна для нестабильных линий. Поэтому я хотел бы установить прямой (без ретрансляции) и собственный канал трафика (без инкапсуляции VPN) между двумя машинами. Естественным выбором является среда STUN, но я пришел к выводу, что для взаимодействия с общедоступным сервером STUN и достижения обхода NAT приложение должно быть скомпилировано с использованием специальных библиотек STUN и полагаться на специальные сокеты STUN вместо обычных сокетов. Это в основном означает, что каждый новый набор клиент-серверных приложений с поддержкой STUN должен быть написан с нуля.
Вопрос:
Чтобы упростить этот процесс, мне интересно, можно ли реализовать универсальный клиент STUN, который в основном работал бы как демон на обеих машинах. Клиенты будут подключаться к общедоступному серверу STUN для регистрации и запроса информации о других клиентах. Они также перенаправили бы весь исходящий трафик с локального контролируемого порта на правильный IP/ порт (конфигурация пользователя + информация о сервере STUN) для достижения другой машины. Это может позволить любому стороннему клиентскому / серверному приложению беспрепятственно открывать обычные сокеты TCP (возможно, несколько) и устанавливать соединение с другим компьютером (как если бы он находился в той же локальной сети).