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

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

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

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

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

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

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

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

2 ответа2

1

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

Как правило, весь интернет-трафик проходит через несколько 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 собирается проверить свои внутренние таблицы на предмет сопоставленных соединений и отбросить пакет, если он не совпадает с тем, что он видел изнутри. Вы не можете рассчитывать на недостатки реализации, чтобы обеспечить надежное решение в том виде, в котором вы его запрашиваете.

0

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .