Связь между двумя компьютерами без открытия портов с использованием третьего компьютера для настройки соединения - PullRequest
2 голосов
/ 07 сентября 2011

Допустим, у меня есть сервер и два клиента, подключенные к нему. (через TCP, но это не важно)

Моя цель - разрешить прямую связь между этими двумя клиентами. Это должно позволить прямой голосовой контакт между двумя игроками, например, или любым другим клиентским плагином, который они, возможно, установили, который не нуждается во взаимодействии с сервером (например, играет в какую-то случайную игру между ними). Сервер может помочь настроить соединение.

Из ответа сумрака я получил несколько отведений:

http://en.wikipedia.org/wiki/STUN, который описывает алгоритм для этого, и
http://en.wikipedia.org/wiki/UDP_hole_punching

Из тех, что я получил больше ведет:

http://www.h -online.com / безопасности / особенность / How-Skype-Co-получить круглые брандмауэры-747197.html
http://nutss.gforge.cis.cornell.edu/stunt.php - возможная реализация STUN с TCP

Со временем я наверняка смогу что-нибудь придумать для своей программы. Сейчас я использую C ++ и TCP (сокеты Qt или Boost), но при необходимости я не возражаю против использования UDP в C и его переноса.

Награда предназначена для любого программиста, имеющего опыт работы с программистами на C и C ++, которые могут дать подсказки, чтобы сделать это проще, со ссылкой на примеры программ, обновленные библиотеки или любую другую полезную информацию. Документированная, гибкая и работающая реализация C ++ TCP была бы лучшей, но я возьму то, что получу!

Ответы [ 5 ]

3 голосов
/ 11 сентября 2011

Иногда / часто возможно пробить дыры TCP в NAT (это зависит от поведения NAT). Это не простой предмет для изучения, но прочитайте соответствующую главу об обходе NAT из Practical JXTA II (доступна онлайн на Scribd), чтобы понять природу проблем, которые нужно решить.

Затем прочитайте это . Это от парня, который написал это: http://nutss.gforge.cis.cornell.edu/stunt.php (одна из ссылок в вашем вопросе).

Я не специалист по C / C ++, но проблемы, требующие решения, не зависят от языка. Пока у вас есть доступ к TCP из вашей кодовой базы, этого достаточно. Имейте в виду, что реализовать UDP-обход проще, чем TCP.

Надеюсь, эти советы помогут.

P.S .: Мне неизвестна реализация решения на C / C ++. Код, упомянутый в ссылке Корнелла, НЕ работает, что подтверждается автором. Я пытался реанимировать его сам, но он дал мне знать, что он полностью настроен для исследовательских целей и далек от готовности к производству.

3 голосов
/ 07 сентября 2011

Я не знаю ни одного способа надежного перфорирования через брандмауэры для TCP, но есть аналогичный метод для трафика UDP, который довольно хорошо задокументирован:

1 голос
/ 13 сентября 2011

Вы ищете сервер рандеву для пробивки NAT: общедоступный сервер (не за NAT / firewall или они правильно настроены), чтобы помочь компьютерам за NAT / firewall установить одноранговый сервер. одноранговое соединение.

UDP более популярен в перфорировании NAT, поскольку обеспечивает гораздо лучшие результаты, чем TCP. Ясное и информативное описание дырокола NAT NAT можно найти здесь .

Если вам нужна надежная связь, вы можете использовать надежные протоколы по UDP:

  1. SCTP ( библиотеки ) - стандартизированный или
  2. один из множества пользовательских протоколов, например, RakNet (я использовал эту библиотеку, она достаточно зрелая, многофункциональная и имеет реализацию перфорирования NAT), Enet или многие другие (Q8)
1 голос
/ 09 сентября 2011

Несколько ссылок на проекты, которые могут быть интересны или полезны:

0 голосов
/ 07 сентября 2011

Эфемерные порты волшебным образом не устранят необходимость ретрансляции через сервер, поскольку они действительны только в течение жизни сеанса, открытого через хорошо известный сервисный порт.В основном, временные порты зависят от сеанса сервера.

Вам потребуется использовать сервер для ретрансляции связи между обоими клиентами, то есть выступать в роли прокси-сервера.Одним из вариантов будет настройка туннеля SSH через прокси-сервер SSH с дополнительным преимуществом безопасности.

Тем не менее, это не гарантирует, что брандмауэр не заблокирует соединение.Это зависит от типа и конфигурации брандмауэра.Большинство жилых маршрутизаторов, которые действуют как брандмауэры, по умолчанию блокируют все входящие соединения.Обычно это нормально, потому что большую часть времени компьютеры за брандмауэром действуют только как клиенты, которые инициируют подключения к внешним устройствам.И эта настройка варьируется, потому что некоторые ограничивают инициирующие соединения только с хорошо известными сервисными портами, такими как HTTP, HTTPS, FTP, SFTP, SSH и т. Д., И если ваш прокси-сервер использует порт с не очень известным сервисом, тогда соединение будетзаблокирован.

Но межсетевые экраны могут быть настроены так, чтобы блокировать исходящий трафик, это наиболее часто встречается в корпоративных сетях, которые даже не разрешают прямые подключения к веб-серверам и маршрутизируют все через прокси-серверы, чтобы контролировать ресурсыИспользование.

Вы также можете изучить использование UPnP для динамического открытия портов.

...