Как два компьютера подключиться к одному и тому же внешнему адресу через NAT?

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

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


person user241146    schedule 30.12.2009    source источник
comment
Если вы спрашиваете, должна ли ваша IP-программа знать о NAT, ответ будет отрицательным, поэтому она так успешна.   -  person Mark Ransom    schedule 30.12.2009
comment
Есть принятый ответ, поэтому я не вижу смысла в награде.   -  person Ron Maupin    schedule 19.08.2017
comment
@RonMaupin он хочет предложить часть своей репутации существующему ответу, потому что он ему нравится или он ему очень помог. См. описание награды. Один или несколько ответов являются образцовыми и достойны дополнительной награды. Вознаградить существующий принятый ответ. Люди здесь делают это довольно часто и вознаграждают за хорошие ответы даже по прошествии многих лет.   -  person Christos Lytras    schedule 19.08.2017


Ответы (6)


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

Наличие нескольких систем, использующих один и тот же модем

Когда вы запускаете веб-браузер и переходите на www.google.com:80, ваш браузер получает/ищет свободный несистемный сопряженный порт из системы для прослушивания. Допустим, сопряженный порт — 10000. Порт прослушивателя предназначен для получения потока http обратно от Google.

Тогда ваш ребенок, сидящий рядом с вами, случайно также просматривает www.google.com:80 и его / ее сеанс Google на игровой станции или xbox - что бы то ни было, также случайно назначается сопряженный порт 10000.

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

Чтобы предотвратить конфликт адресов портов на маршрутизаторе/модеме

Допустим, DHCP вашей кабельной компании назначает вашему модему IP4-адрес 72.72.72.72. Но DHCP вашего беспроводного маршрутизатора назначает 192.168.0.10 вашей системе и 192.168.0.11 системе вашего ребенка.

Когда фрейм, несущий информацию о ваших портах прослушивания, проходит через маршрутизатор NAT, он транслирует либо один, либо оба порта прослушивания. Допустим, порт 15000 для вашей страницы и порт 16000 для страницы вашего ребенка.

Затем ваш беспроводной маршрутизатор отправляет ваши запросы на сервер Google с адреса 72.72.72.72:15000 и 72.72.72.72:16000.

Затем сервер Google отвечает по отдельности на 72.72.72.72:15000 и 72.72.72.72:16000, и когда ваш беспроводной маршрутизатор получает ответ, он обращается к сохраненному сопоставлению и преобразует 72.72.72.72:15000 в 192.168.0.10:10000 в достичь вашей системы, но преобразует 72.72.72.72:16000 в 192.168.0.11:10000 для доступа к системе вашего ребенка.

Запуск веб-/игровых/ftp-серверов и т. д.

Но что, если в вашей системе работает веб-сервер или ftp-сервер. Что, если у вас есть две системы и обе имеют веб-сервер, и оба веб-сервера прослушивают порт 80?

Допустим, локальные IP-адреса, зарегистрированные/назначенные вашим беспроводным маршрутизатором вашей первой системы веб-сервера, — 192.168.0.30, а ваша вторая система веб-сервера — 192.168.0.40.

Беспроводной маршрутизатор будет иметь веб-страницу конфигурации, обычно по умолчанию 192.168.0.1:80, если вы не изменили ее. На странице будет вкладка, где вы можете определить/зарезервировать сопоставления портов приложений.

Вы можете зарегистрироваться на своем беспроводном маршрутизаторе, чтобы зарезервировать сопоставление

192.168.0.30:80 => outgoing port 8080
192.168.0.40:80 => outgoing port 8088

Чтобы вам приходилось звонить своим друзьям, ваши веб-серверы/игровые серверы адресуются через 72.72.72.72:8080 и 72.72.72.72:8088 соответственно, где беспроводной маршрутизатор не позволяет своим портам 8080 и 8088 использовать динамический NAT.

Конечно, 72.72.72.72 хорош только до того, как ваш интернет-провайдер DHCP решит обновить ip4-адрес вашего модема, скажем, 72.72.90.200. После этого вам нужно будет позвонить или написать своим друзьям и сказать: «Привет, адреса серверов изменились на 72.72.90.200:8080 и 72.72.90.200:8088 соответственно. Или вы можете подписаться на службу динамического DNS (ddns), чтобы использовать именованный домен, где службе ddns потребуется установить в вашей системе простую утилиту пульса, чтобы помочь им отслеживать изменение адреса. Трансляция DDNS — это отдельная проблема/стратегия.

модемы NAT

Более новые контракты с провайдерами предоставляют вам модем с NAT. Если это так, вам нужно отключить либо на модеме, либо на беспроводном маршрутизаторе. Вы не должны использовать оба - какой смысл в переводе дважды, потому что NAT просто предотвращает конфликт адресов. Когда вы отключаете NAT на своем беспроводном маршрутизаторе, он может работать как коммутатор-концентратор, а не как маршрутизатор, поэтому вы можете подключить его к модему, используя один из его разъемов LAN, а не через разъем WAN.

person Blessed Geek    schedule 31.12.2009
comment
+1 Какое классное объяснение! Меня всегда расстраивал тот факт, что большинство объяснений NAT так и не прояснили, как ответы на исходящие соединения возвращаются отправителю. - person AaronLS; 01.02.2010
comment
Означает ли это, что количество соединений на IP-адрес назначения ограничено количеством доступных номеров портов. то есть, если в организации работает более 65 тысяч сотрудников, все они пытаются получить доступ к google.com (при условии, что IP-адрес один и тот же) в одно и то же время не будет работать, если все они находятся за одним и тем же IP-адресом? Что происходит в этом случае? Есть ли термин для этого? - person balki; 13.02.2019
comment
Посмотрите: freeccnastudyguide.com/study-guides/ccna/ch10/ - person Blessed Geek; 08.01.2020

Маршрутизатор управляет «исходными» портами, отдельными для каждого компьютера. Хотя вы можете подключаться к порту 80 «назначения», маршрутизатор может назначить исходный порт какому-то порту с большим номером.

Википедия резюмирует это как

Преобразование сетевых адресов включает в себя перезапись IP-адресов источника и/или получателя, а также обычно также номеров портов TCP/UDP IP-пакетов, когда они проходят через NAT. Контрольные суммы (как IP, так и TCP/UDP) также должны быть переписаны с учетом изменений.

person Matt    schedule 30.12.2009
comment
Поправьте меня, если я ошибаюсь: оба компьютера изначально запрашивают подключение к 1.1.1.1 через порт 1000. Маршрутизатор создает новые порты, 40000 и 40001. Маршрутизатор отправляет пакет, продолжая подключаться к порту 1000. Когда сервер отправляет его назад, он отправляет обратно на порт 40000 или 40001. Это имеет смысл, за исключением того, что я думал, что при открытии соединения отправка и получение происходят на одном и том же порту. - person user241146; 30.12.2009
comment
Сокет состоит из четырех частей данных: исходный IP-адрес, исходный порт, целевой IP-адрес и порт назначения. В вашем примере порты 40000 и 40001 — исходные порты, 1000 — порт назначения. - person kdgregory; 31.12.2009

Уже даны хорошие ответы, но вот еще один пример:

    HOST A addr         HOST B addr
    10.1.0.2:4040       10.1.0.3:4040
-----------------------------------------
NAT 200.50.50.28:4040   200.50.50.28:4041 (what external host sees)

200.50.50.28 — это глобальный (интернет) IP-адрес маршрутизатора.

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

person Nick Dandoulakis    schedule 30.12.2009
comment
Итак, если два компьютера используют один и тот же исходный порт, маршрутизатор автоматически переназначает новый порт src для любого из хостов? И тогда сервер, к которому подключаются хост A и хост B, видит другой порт src? Если на портах хоста A и хоста B нет коллизии, маршрутизатор не изменит порт src? Просто хочу подтвердить, правильно ли я понял. Спасибо - person kuchi; 01.12.2017
comment
@kuchi, да, сервер видит разные порты для каждого хоста. Маршрутизаторы обычно разрешают коллизию адресов, т. е. один и тот же порт может использоваться, если два хоста подключаются к двум разным серверам. Кортеж (src_ip, src_port, dest_ip, dest_port) должен быть различен. - person Nick Dandoulakis; 01.12.2017

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

person Charles Bretana    schedule 30.12.2009

RFC3022 предоставляет много информации о том, как это работает.

person Suresh Krishnan    schedule 13.01.2010

Поскольку обсуждался общедоступный или внешний IP-адрес, предоставленный интернет-провайдером (ISP), я хотел бы добавить к этому. Вы можете попросить своего интернет-провайдера не изменять ваш общедоступный IP-адрес. Он станет статическим, так что вам не придется сообщать своим друзьям об изменении IP-адреса, если они хотят получить доступ к вашему серверу внутри вашего транслятора сетевых адресов (NAT). На момент написания этой статьи статический IP-адрес стоил около 100 долларов. Большинство интернет-провайдеров называют это бизнес-аккаунтом. Вы можете определить свой общедоступный IP-адрес, погуглив мой IP-адрес.

person Gibo    schedule 28.06.2020