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