Мне нужно реализовать простое P2P-приложение за NAT. Он должен отправлять данные по надежному и безопасному соединению (зашифрованные данные по TCP). Из теоретического фона, который я знаю, есть несколько методов NAT-Traversal (например, Session Traversal Utilities для NAT), описанных в нескольких RFC (5389, 5769 и 5780).
Хотя на практике я не могу найти необходимые инструменты / библиотеки для реализации такой системы (желательно на языке программирования C ++). Что я уже нашел, поглядывая вслепую: ICE,
ОЧЕРЕДЬ,
libnice,
libjingle а также каскадер
Ниже изображение описывает, как это должно выглядеть. У меня есть VPS с действительным IP-адресом, ПК за NAT и датчик за другим NAT. У них есть частные IP-адреса. Я хочу, чтобы мой датчик подключился к серверу, нашел монитор и отправил ему запрос на подключение. После установления соединения сервер ретрансляции не должен использоваться для направления трафика данных. Я хочу, чтобы мой датчик и монитор использовали этот путь для связи:
Sensor <--> AP0 <--> R3 <--> {THE INTERNET} <--> R2 <--> Monitor
В настоящее время все данные передаются через VPS:
Sensor <--> AP0 <--> R3 <--> {THE INTERNET} R1 <-->
VPS <--> R1 <--> {THE INTERNET} <--> R2 <--> Monitor
В принципе, если вы можете порт вперед, тогда это скорее вопрос инфраструктуры, чем программирование. Вам просто нужно настроить маршрутизаторы для направления трафика с общедоступного IP / порта на частный IP / порт, например:
R2: Port 500 - TCP -> Laptop-PT - Port 500
R3: Ports 16000/16500 - TCP/UDP -> PDA-PT - Port 16000/16500
Если вы хотите стать модным и ваши маршрутизаторы поддерживают UPnP, просто прибегнуть к библиотеке, которая реализует Протокол IGD (например., MiniUPnP), чтобы ваше приложение управляло отображением портов. Эта статья обеспечивает хорошую отправную точку, а также пример кода (хотя я действительно рекомендую надежную библиотеку).
Поскольку вы в конечном итоге хотите, чтобы сервер ретрансляции был полностью удален, и хотите, чтобы монитор и конечная точка взаимодействовали напрямую, вы действительно пытаетесь решить проблему прямой связи между двумя серверами за NAT.
И поэтому есть две проблемы, которые нужно решить:
1) Разрешение сенсору получить публичный IP-адрес системы мониторинга.
2) Разрешить ретрансляцию пакетов SYN для вашего TCP-соединения через NAT на Router-PT R2 на ваш монитор.
Первая проблема, с которой может помочь ретранслятор: вы можете использовать TURN для ретрансляции сообщения через сервер, чтобы сообщить публичный IP-адрес монитора сенсору.
Вторая проблема, однако, я не знаю ни одного обобщенного решения, потому что оно действительно сводится к конфигурации на маршрутизаторе. Маршрутизатор должен знать, какой из множества систем за NAT направлять SYN. Он не может передать это всем им: они все ответят.
Большинство маршрутизаторов с поддержкой NAT имеют параметры конфигурации, которые позволяют вам указать, на какой узел будут перенаправляться входящие пакеты. Посмотрите, как сделать систему мониторинга портативного компьютера DMZ или направить трафик для определенного порта TCP на нужную вам систему. Однако каждый маршрутизатор будет обрабатывать эту конфигурацию по-своему; нет никакой стандартизации той конфигурации, о которой я знаю.
Надеюсь, это поможет.