2013-05-02 5 views
1

Мне нужно реализовать простое приложение P2P за NAT. Он должен отправлять данные по надежному и безопасному соединению (зашифрованные данные через TCP). С теоретической точки зрения, я знаю, что существует несколько методов NAT-Traversal (например, Session Traversal Utilities для NAT), описанных в нескольких RFC (5389, 5769 и 5780).Реализация NAT-Traversal для подключения P2P

Хотя на практике я не могу найти необходимые инструменты/библиотеки для реализации такой системы (желательно на языке программирования на С ++). То, что я уже нашел прибегая к помощи вокруг вслепую: ICE, TURN, libnice, libjingle и STUNTMAN

Ниже изображения описывает то, что он должен выглядеть. У меня есть 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 

Network

+0

Я знаю, что я не должен даже спрашивать, но перенаправление портов или поддержка UPnP не могут быть и речи? –

+0

@ AnthonyAccioly Нет, я просто забыл упомянуть. Я совершенно смущен. Невозможно повернуть голову и найти начальную точку ... –

ответ

2

В принципе, если вы можете port forward, то это скорее вопрос инфраструктуры, чем программирование. Вам просто нужно настроить маршрутизаторы для прямого трафика с общего IP/порта на частный IP/порт, например.:

R2: Port 500 - TCP -> Laptop-PT - Port 500 
R3: Ports 16000/16500 - TCP/UDP -> PDA-PT - Port 16000/16500 

Если вы хотите получить фантазии и ваши маршрутизаторы поддерживают UPnP, просто обратиться к библиотеке, который реализует IGD protocol (например, MiniUPnP), для того, чтобы ваше приложение контролировать отображение портов. This article обеспечивает хорошую отправную точку, а также некоторый пример кода (хотя я бы действительно рекомендовал надежную библиотеку).

+0

Нужно ли мне обращаться к конфигурации маршрутизатора? –

+0

Да. Либо вручную (как отметил @chris, настраивая маршрутизатор через интерфейс администрирования), или, если маршрутизатор поддерживает UPnP (и включен) через библиотеку UPnP. Взгляните на статью в своем ответе, я думаю, что все будет ясно. –

+0

Я прочитал эту статью. Теперь я могу думать о переадресации портов с помощью UPnP. Итак, как маршрутизаторы в реальном мире? Должен ли я беспокоиться о отсутствии поддержки UPnP во всех маршрутизаторах пути данных? –

2

Потому что вы в конечном счете хотите ретрансляционный сервер должен быть полностью удален и хотите, чтобы монитор и конечная точка обменивались напрямую - вы действительно пытаетесь решить проблему прямой коммуны между двумя серверами за NAT.

И поэтому существуют две проблемы решить:

1), что позволяет датчику получить открытый IP-адрес системы мониторинга.

2) Разрешить передачу SYN-пакетов для вашего TCP-соединения через NAT на Router-PT R2 на ваш монитор.

Первая проблема, с которой может помочь реле: вы можете использовать TURN для передачи сообщения через сервер для передачи общедоступного IP-адреса монитора на датчик.

Вторая проблема, однако, я не знаю какого-либо обобщенного решения, потому что это действительно сводится к конфигурации на маршрутизаторе. Маршрутизатор должен знать, какая из многих систем за NAT должна пересылать SYN. Он не может передать их всем: они все ответят.

Большинство маршрутизаторов с поддержкой NAT имеют параметры конфигурации, которые позволяют настроить, на какой хост вы хотите направлять входящие пакеты. Посмотрите, как сделать систему мониторинга ноутбуков DMZ или направлять трафик для определенного TCP-порта в нужную вам систему. Однако каждый маршрутизатор будет обрабатывать эту конфигурацию по-разному; нет стандартизации той конфигурации, о которой я знаю.

Надеюсь, что это поможет.

+1

Да, но поскольку соединения TCP являются точными, и вы не хотите, чтобы данные пересылались через сервер ретрансляции, это не может помочь в установлении соединения (за исключением, как я сказал, получения общедоступного IP-адреса монитора) – chris

+1

Поставить другим способом; реле может помочь в передаче параметров для настройки TCP-соединения, но не может помочь в передаче данных для этого фактического TCP-соединения; включая самую сложную часть - первый пакет, который отправляется для TCP-соединения: пакет SYN. – chris

Смежные вопросы