23

Это маленький теоретический вопрос, который меня смущал довольно долго.

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

Теперь я совершенно не понимаю, как «ответные» пакеты достигают своего пункта назначения внутри локальной сети, например, когда мы открываем веб-страницу или около того. Не могу найти полезную информацию на эту тему.

Я надеюсь, что кто-то может дать мне пару подсказок или связать меня с информацией, которая могла бы это объяснить. Благодарю.

РЕДАКТИРОВАТЬ: Я думаю, что я должен уточнить. Пример того, что я спрашиваю, будет примерно таким:
1. Компьютер внутри локальной сети с одним внешним IP-адресом пытается загрузить веб-страницу с веб-сервера за пределами этой локальной сети (в основном в Интернете)
2. Веб-сервер отвечает и отправляет веб-страницу обратно на этот компьютер.

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

5 ответов5

52

Хотя вопрос был полностью покрыт. Я чувствую, что этот процесс лучше всего описывать шаг за шагом.

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

Поэтому, когда я запрашиваю страницу superuser.com которая будет генерировать много IP-пакетов. Давайте посмотрим на один.

IP-пакет
Источник: 192.168.1.12 (мой IP)
Пункт назначения: 64.34.119.12 (superuser.com)

Теперь моя система, скорее всего, настроена аналогично той, о которой идет речь. У меня есть собственный IP-адрес (192.168.1.12), маска подсети (255.255.255.0) и шлюз по умолчанию (192.168.1.1). Теперь, поскольку мое поле Destination в моем IP-пакете указывает на сеть, отличную от моей, оно отправляется на мой шлюз по умолчанию (а не на компьютер напрямую).

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

Ethernet

Это легко, потому что мы используем для этого адресацию протокола Ethernet. Мы просто устанавливаем наш IP-адрес назначения в пакете IP и MAC-адрес нашего шлюза по умолчанию в качестве пункта назначения в кадре Ethernet.

Теперь это гарантирует, что наш шлюз по умолчанию получит пакет для superuser.com . Ура!

Теперь шлюз имеет наш пакет и может отправить его прямо на своем пути. Но чтобы убедиться, что он получит ответ, сначала нужно заменить адрес источника пакета (в противном случае superuser.com попытается отправить ответ на какое-то (возможно) несуществующее устройство с моим IP-адресом в их сети. Теперь это было бы не очень приятно.)
Таким образом, мой маршрутизатор разместит свой публичный IP-адрес в поле Source :

IP-пакет
Источник: 92.69.127.243 (мой публичный IP)
Пункт назначения: 64.34.119.12 (superuser.com)

Теперь та же самая игра продолжается со всеми маршрутизаторами в мире, пока пакет наконец не прибудет на superuser.com и не будет получен ответ.

Ответ

Пакет ответа IP
Источник: 64.34.119.12 (superuser.com)
Назначение: 92.69.127.243 (мой публичный IP)

Хорошо, ответ дошел до моего роутера, что теперь? Как теперь мой маршрутизатор узнает, что нужно отправить ответ на 192.168.1.12?

TCP

Ну, на самом деле это работает, потому что мы рассмотрели только IP и Ethernet части коммуникации. То, что делает эту работу, является частью TCP.

Скорее всего, вы знаете, что веб-серверы обычно работают на порту 80 . IP не имеет понятия о портах . Это происходит от TCP . В TCP у нас (как и в IP) есть порт источника и назначения .

Мой TCP пакет на superuser.com
Источник: 192.168.1.12 (мой IP)
Порт источника: 11111 (порт, который сделал мой компьютер)
Пункт назначения: 64.34.119.12 (superuser.com)
Порт назначения: 80

Когда ваш маршрутизатор отправит этот начальный пакет (который адресован superuser.com на порт 80), он установит новый порт источника (например, 12345).
И это важная часть! Он запомнит эту замену!

TCP-пакет моего маршрутизатора к superuser.com
Источник: 92.69.127.243 (мой публичный IP)
Исходный порт: 12345 (порт, который создал мой маршрутизатор)
Пункт назначения: 64.34.119.12 (superuser.com)
Порт назначения: 80

Таким образом, пакет ответа, полученный маршрутизатором, на самом деле выглядит так:
Ответ TCP Packet от superuser.com
Источник: 64.34.119.12 (superuser.com)
Порт источника: 80
Назначение: 92.69.127.243 (мой публичный IP)
Порт назначения: 12345 (порт, который создал мой маршрутизатор)

Поэтому теперь он получает этот пакет и видит, что для порта, который он помнил ранее, был назначен операциям NAT для IP-адреса 192.168.1.12 (мой IP-адрес).

Ответь TCP Packet с моего роутера
Источник: 64.34.119.12 (superuser.com)
Порт источника: 80
Назначение: 192.168.1.12 (мой IP)
Порт назначения: 11111 (порт, составленный моим компьютером)

10

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

0

Когда исходный пакет поступает на внешний интерфейс маршрутизатора, он изменяет IP-адрес назначения пакета в соответствии с конфигурацией переадресации портов и передает модифицированный пакет на внутренний интерфейс маршрутизатора (после обычного ARP, если необходимо).

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

Обратите внимание, что на каждом сетевом уровне существуют разные цели.

0

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

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

Вы можете быть сбиты с толку, если устройство, к которому вы подключаете все компьютеры, имеет несколько портов "LAN" Ethernet, а затем один порт "WAN". Эти типы устройств фактически являются одновременно маршрутизатором и коммутатором в одном шасси.

Таким образом, если внутри вашего ЛВС-сервера есть адрес 192.168.1.55, чтобы получить доступ к нему внутри ЛВС, вам нужно будет ввести « http://192.168.1.55 » в адресной строке браузера. Роутер никогда этого не видит. Чтобы получить доступ к нему за пределами вашей локальной сети, вам нужно будет ввести свой внешний IP-адрес, то есть « http://256.99.88.77:{порт, который вы перенаправили сюда}» или что-то еще. Это действительно влияет на ваш маршрутизатор, на нем работает функция NAT маршрутизатора, а затем маршрутизатор отправляет его на 192.168.1.55.

0

Проще говоря, когда компьютер в частной локальной сети инициирует исходящее соединение, шлюз NAT автоматически создает для него сопоставление портов. Они примерно такие же, как сопоставления портов, которые вы вводили ранее: {общий порт, частный адрес, частный порт}, и используются примерно так же. Самое большое отличие от динамических сопоставлений заключается в том, что шлюзу NAT часто приходится произвольно назначать публичные порты для сопоставлений, когда ожидаемый номер порта уже используется.

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