Как заставить TCP-сервер работать за маршрутизатором (NAT) без необходимости настройки перенаправления

Сценарий следующий. У меня есть две машины A и B: A: клиент (за NAT) B: сервер (за NAT)

Я хочу, чтобы B мог прослушивать любой заданный порт, чтобы A мог отправлять пакеты B через этот конкретный TCP-порт и получать любой ответ. Если обе машины не находятся за NAT, это довольно простой процесс. Однако как мне заставить его работать так, чтобы он работал, даже когда B находится за маршрутизатором, и ему не нужно менять конфигурацию маршрутизатора, включать переадресацию некоторых портов и т. д.

Например, как работают одноранговые программы, такие как торрент-клиенты, если пользователю не нужно ничего настраивать?


person Chetane    schedule 02.10.2009    source источник
comment
Возможно, вам повезет больше на serverfault.com   -  person NotMe    schedule 03.10.2009
comment
Я предполагаю, что этот вопрос заключается в том, как написать сервер для работы за NAT, а не в том, как его настроить.   -  person Douglas Leeder    schedule 03.10.2009


Ответы (4)


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

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

person sean riley    schedule 02.10.2009
comment
Подобная перфорация AFAIK работает только для UDP и только в том случае, если сопоставление портов UDP согласовано на маршрутизаторе. - person Douglas Leeder; 03.10.2009
comment
Я читал о пробивке отверстий, будет ли работать пробивка отверстий TCP? Однако это может быть не так просто реализовать, но я попробую, поскольку это то, что я ищу. Спасибо. - person Chetane; 03.10.2009
comment
Вы можете посмотреть на STUNT. Но я бы не рекомендовал пробивать отверстия TCP, так как это не будет работать надежно. - person tobias; 28.07.2013

Чтобы ответить на примере программ Peer to Peer и в целом: существует технология под названием Universal Plug and Play которые маршрутизаторы NAT могут использовать, чтобы разрешить клиентам за ними открывать порты снаружи. Это то, что могут использовать клиенты bittorrent, чтобы другие клиенты могли напрямую подключаться к ним.

person Douglas Leeder    schedule 02.10.2009
comment
но разве UPnP не просто способ автоматизировать автоматизацию переадресации портов? - person Roman Plášil; 03.10.2009
comment
Ключ в автоматизации — я предполагаю, что «он» в вопросе — это пользователь. Избегание ручной настройки переадресации портов — это и красота, и опасность UPnP. - person Douglas Leeder; 03.10.2009

Вам придется либо:

  1. Настройте переадресацию портов от шлюза nat перед сервером на машину, на которой работает программное обеспечение вашего сервера, и подключите клиента к IP-адресу этого шлюза.

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

person nos    schedule 02.10.2009
comment
Привет, я предусмотрел это решение, единственная проблема с этим решением заключается в том, что нагрузка на прокси будет значительной, а это дорого. - person Chetane; 03.10.2009

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

http://www.brynosaurus.com/pub/net/p2pnat/

person Humoyun Ahmad    schedule 25.11.2015