Вопрос: Установите соединение без переадресации портов


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

Однако есть одна простая ситуация, которую я по-прежнему считаю очень полезной, для чего что-то может быть сделано: соединение происходит между двумя сторонами, которые знают друг друга и уже обмениваются IP-адресами. Конечно, эти IP-адреса могут иногда меняться, но я не считаю это большим препятствием, и в случае необходимости есть много бесплатных услуг DDNS. Они также договорились о номерах портов или о способе прогона номеров портов до тех пор, пока не найдут тот, который работает. Ни одна из сторон не имеет переадресации портов.

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

  1. Один пользователь говорит, что он установил соединение с адресом другого пользователя, указав как используемые локальные, так и внешние порты, и маршрутизатор (или что-то еще) поэтому делает соответствующие действия для направления данных, поступающих от этого другого пользователя к этому. Однако, поскольку первый пользователь знает (но не маршрутизатор), он фактически не подключался, а вместо этого он ждал и слушал запрос от другого пользователя.
  2. Между тем, другой пользователь просто пытается подключиться к первому, поскольку любой клиент будет подключаться к серверу, используя те же порты (хотя и заменяемые), выбранные первым пользователем.
  3. Когда первый получает запрос на создание фактического соединения, он отправляет соответствующий ответ, чтобы принять запрос второго пользователя для соединения.

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

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

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

Поэтому я здесь, чтобы спросить, кто-нибудь знает, как это можно сделать?


0
2018-01-19 02:03


Источник


Вы должны перегонять это до более короткого вопроса - Brian Adkins
То, что вы пытаетесь сделать, это, в основном, прошивка NAT. Для этого уже существует несколько методов, но им всегда нужен сторонний сервер для запуска, так как вам нужно угадать номер порта, который у вас будет, когда вы пересечете (потенциально несколько) слоев NAT. NAT должен решить проблему устаревания IPv4, поэтому после развертывания IPv6 компьютеры должны иметь по крайней мере один глобально маршрутизируемый адрес для установления прямой связи друг с другом. - user2313067
@ user2313067 Это интересно; в моем сценарии я предполагаю, что каждый пользователь знает порты, которые будут выбраны другим, и я знаю, что можно указать как внутренние, так и внешние порты, используемые для нового соединения на уровне приложения. Это что-то меняет? - user11424
И да, ipv6 решит проблему, когда она будет полностью реализована. Это, вероятно, займет еще одно десятилетие, хотя o_O - user11424
Хорошо, я вижу, что «обход NAT» (wikipedia) - это, по сути, то, о чем я спрашивал, и иногда это возможно без стороннего хоста, хотя симметричные NAT могут сделать это невозможным вообще, а также разрушить процедуру, предложенную мной в вопрос. - user11424


Ответы:


Это здорово, но как насчет того, когда кто-то не имеет доступа к физическому маршрутизатору

Как правило, весь интернет-трафик проходит несколько маршрутизаторов ISP и операторского класса, ни один из которых обычно физически не доступен пользователям.

Ваш четвертый абзац немного неясен. Я думаю, вы не понимаете, как работает NAT.

Причина, по которой требуется перенаправление портов, связана с NAT. NAT скрывает несколько систем за 1 IP-адресом. Вы можете говорить только с этим 1 общедоступным IP-адресом. Если вы хотите получить что-либо позади этого IP-адреса, вы должны пройти через этот IP-адрес. У вас нет выбора.  Без переадресации портов маршрутизатор с поддержкой NAT не знает, за какой машиной он отправляет незапрашиваемый входящий трафик, и предположим, что вы пытаетесь поговорить с самим маршрутизатором.

Если вы говорите о программе, которая принимает запросы от имени клиента за ней, имя для этого является «прокси», и вы, безусловно, можете это сделать. Маршрутизатор является логичным, но не обязательно лучшим, местом для работы и доступа. Существуют прокси для многих протоколов, HTTP, SIP и т. Д.

Когда первый получает запрос на создание фактического соединения, он принимает

Это никогда не произойдет. «Первый» находится за NAT-маршрутизатором, NAT-маршрутизатор сначала получает запрос, а не кто-то за маршрутизатором.

IPv6 исправляет это, предоставляя достаточно большое адресное пространство, которое NAT не требуется для сохранения адресов.


В NAT нет специального протокола, это все TCP / IP.

То, что отличается от стандартного маршрутизатора, отличного от NAT, состоит в том, что извне узлы видят и знают только об одном публичном IP-адресе. Насколько они знают с уровня TCP / IP, на этом IP-адресе есть только одна система, которая отправляет множество запросов. Если ничего похожего на Javascript, прокси или другой трафик на уровне приложений не хватит на чей-то частный IP-адрес, он не может знать частный IP-адрес.

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

Я думаю, что была программа, которая пыталась работать так, как вы говорите, отправив NAT-маршрутизатору TCP-пакет из последовательности (последовательность SYN, ACK, SYN-ACK), что может обмануть его. Я также слышал о NAT-маршрутизаторах, которые ошибочно разрешают входящие TCP-соединения в портах, которые отправляют UDP-трафик.

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


1
2018-01-19 04:29



«NAT скрывает несколько систем за 1 IP-адресом». Да, но когда пользователь, стоящий за маршрутизатором, устанавливает соединение с любым внешним сервером, маршрутизатор должен подтвердить это соединение, чтобы отправлять входящий трафик (от конкретного IP-сервера) к нужному пользователю - как еще можно было бы получить любой данные из Интернета, когда вы находитесь за маршрутизатором? Моя мысль заключалась в том, чтобы использовать это нормальное функционирование, чтобы сделать одно соединение. - user11424
«незапрашиваемый входящий трафик» - в основном, делая вид, что соединение уже установлено, идея состоит в том, что запрос на соединение второго пользователя не является незапрашиваемым, но маршрутизатор рассматривает его как трафик обычного соединения между пользователем и некоторым внешний сервер (который фактически является вторым пользователем). - user11424
Некоторые маршрутизаторы NAT могут разрешать произвольным исходным IP-адресам, когда система за NAT делает любой тип исходящего соединения. Вы не можете рассчитывать на это. - LawrenceC
Гектометр Я понимаю, что я пытаюсь сделать, это то, что обычно делают большинство маршрутизаторов. Я не предполагаю, что вы знаете протокол для маршрутизатора, чтобы установить соединение? Я предполагаю, что после того, как пользователь за маршрутизатором отправит запрос, сервер ответит на маршрутизатор, и в этот момент маршрутизатор может принять соединение, а затем данные, поступающие с этого сервера, будут направлены пользователю, учитывая, что соединение установлено , Затем, если я могу заставить маршрутизатор думать, что он получает ответ, несмотря на отсутствие реального сервера на другом конце (второй пользователь вместо этого), это будет первым шагом. - user11424
См. Мое редактирование. Слишком долго для комментария. :) - LawrenceC


Если у вас нет доступа к маршрутизатору, вы не можете запустить программу на нем, чтобы выполнить прямую схему соединения, даже если вы потратили время на создание программы. Если у вас нет маршрутизатора, то либо:
A. Нет необходимости пересылать, поскольку у вас есть прямое соединение.
B. Это не ваша сеть (1/2/3 / 4G), поэтому вам нужно сделать обратное соединение или поговорить с системным администратором.
Я не хочу сказать, что ваша идея плохая, потому что это вызывающе, но это неосуществимо, потому что, если у вас есть доступ к маршрутизатору, работающему openwrt, где вы можете запустить свою программу для этого, тогда вы можете просто переслать порт.


0
2018-01-19 02:27