Как реализовать p2p, когда оба юзера за NAT?

Есть два пользователя и они оба за NAT.
Если бы кто-то один из них имел внешний IP, то можно было бы поднять на нем сервер, а на втором пользователе клиент.
Как быть в случае, когда оба пользователя за NAT?

Понятно, что нужно поставить в сети какой-либо сервер, но гнать через него весь трафик - не вариант. А альтернативного способа я пока не вижу. Понятно, что в рамках одного соединения при ответе этот сервер их отправит на NAT, а тот, зная порт, завернет его на реальный IP клиента. Но как инициировать связь между клиентами?

Как быть?
  • Вопрос задан
  • 3166 просмотров
Решения вопроса 2
robux
@robux
бородат
1. Перфорация NATов:
UDP-pounching
TCP-pounching (SYN-TCP)
Для координации нужен третий узел-посредник, а дальше уже напрямую.

2. IPv6:
Можно эмулировать в IPv4 сервисами Teredo (в Windows) или Miredo (в Linux).

3. Специальные протоколы для роутеров и не только. Гуглить по словам:
IGD (UPnP), NAT-PMP (в рамках Bonjour), STUN, NAT-T (IKE), TURN, RSIP, MIDCOM, ICE, SBC, ALG, ICM (расширение к STUN+TURN).
Ответ написан
poisons
@poisons
В любом случае нужна третья сторона.
В некоторых случаях достаточно STUN сервера для выполнения UDP Hole Punching, но работает не всегда и не везде. Можно словить port restricted cone NAT.
Для обхода этого придумали TURN, но это как раз и означает "гнать траффик через сервер".
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
xmoonlight
@xmoonlight
https://sitecoder.blogspot.com
Как вариант: виртуальная одноранговая сеть с DNS-подобным взаимодействием (обновлением) для синхронизации списков активных клиентов (они же - рандеву-сервера).
Включился клиент (вышел в он-лайн) - сообщил всему своему списку, что он включился.
Ответ от каждого (короткий список свежих): последние 4-5 вышедших в on-line.
Постоянный коннект - к 5-7 другим клиентам для установки связи с нужным IP-шником.
И т.д.
Ответ написан
@sled
Если нужно программно обмениваться сообщениями, то можно использовать соцсети с API.
Сам как-то писал два коннектора на Python через API ВКонтакте, они друг другу кидали сообщения, все отлично работало, не нужно заморачиваться со специализированными серверами и сервисами
Ответ написан
@nic777
Хороший вопрос! Пример программы, где это реализовано - TeamViewer
На практике я использовал UPnP, он позволяет прокидывать порты, не имея админского доступа к роутеру, но запрос приходится регулярно повторять, чтоб роутер не "забыл" наши параметры
Ответ написан
msHack
@msHack
RetroShare с легкостью пробивает NAT

Tox messenger с легкостью пробивает двойной NAT

JAMI пока сыроват но пользоваться можно
Ответ написан
@pfg21
ex-турист
зависит от перегоняемого трафика.
взять дешевый VPS на OpenVZ. стоят от 2 баксов в год (!), но лучше за дешевизной не гнатся. lowendstock.com
настроить на нем взаимодействие между сервисами.
Ответ написан
CityCat4
@CityCat4
Если я чешу в затылке - не беда!
Никак.

Этот вопрос регулярно всплывает и на него столь же регулярно дают один и тот же ответ - никак. Два обычных компа с виндой, подключенных через обычные соховские роутеры, а то и через 3G - не связать друг с другом никак.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы