Я использую модем-маршрутизатор и в некоторых случаях также нахожусь за NAT провайдера. Как работает NAT (NAT маршрутизатора) за NAT (NAT провайдера)?
Насколько мне известно, NAT работает следующим образом: компьютеры A и B получают внутренние IP-адреса internal1
и internal2
. Затем NAT назначает им порты на том же IP-адресе, так что при публичном доступе они оказываются за someIP:1
и someIP:2
.
Но если это сделает маршрутизатор, а затем это сделает провайдер, IP-адреса будут иметь вид someIP:1:100
, someIP:2:101
что невозможно, поскольку порты не имеют портов второго уровня.
Так как же это работает?
решение1
Давайте рассмотрим простой пример.
В "обычной" домашней сети NAT 192.168.1.2:11223
сопоставляется с парой "публичный" адрес:порт 203.0.113.5:22334
. Таким образом, конечный хост назначения думает, что получил пакет 203.0.113.5:22334
и не имеет сведений о "частной" сети за ним.
Теперь давайте расширим это до сети с двойным NAT, с двумя уровнями NAT.
На ближайшем к хосту маршрутизаторе 192.168.1.2:11223
сопоставляется с парой "публичный" адрес:порт 10.0.0.8:22334
. Теперь 10.0.0.8
это все еще частный адрес, просто в другой сети. Что касается этого маршрутизатора, его работа выполнена.
На следующем маршрутизаторе, который служит шлюзом для локальной сети, в которой находится первый маршрутизатор, 10.0.0.8:22334
он сопоставляется с другой парой адрес:порт на своем собственном публичном интерфейсе, 203.0.113.5:12345
.
Конечный хост назначения думает, что получил пакет от 203.0.113.5:12345
. Он, как и весь публичный интернет, не имеет сведений ни о какой из 10.0.0.0/8
или 192.168.0.0/16
подсетей, которые были здесь задействованы. Он отправит ответ обратно на этот адрес, который должен быть транслирован обратно каждым маршрутизатором по очереди.
Different address:port pairs for
thesame endpoint in one connection!
+------------------------+ -----------------------------------
|Host |
|192.168.1.2 |
+------------------------+ 192.168.1.2:11223 <--- Host sees
this pair
+------------------------+ 192.168.1.2:11223 <--- Router 1 sees
|Router 1 | req from this
|internal 192.168.1.1/24 |
|external 10.0.0.8 |
+------------------------+ 10.0.0.8:22334 <------ Router 1 sends
req from this
+------------------------+ 10.0.0.8:22334 <------ Router 2 sees
|Router 2 | req from this
|internal 10.0.0.1/24 |
|external 203.0.113.5 |
+------------------------+ 203.0.113.5:12345 <--- Router 2 sends
req from this
+------------------------+ 203.0.113.5:12345 <--- Public internet
|Public internet | sees this pair
+------------------------+
CGN ("ISP NAT") работает примерно так же. Единственное отличие в том, что он не дает своим внутренним хостам частный адрес RFC1918, поскольку он может конфликтовать с корпоративными сетями. Вместо этого адрес из диапазона 100.64.0.0/10
(RFC6598) распределяется "Маршрутизатором 2" на схеме выше. Насколько видит собственный маршрутизатор клиента, его "публичный" адрес из этого диапазона - но фактически недоступен в публичном Интернете!
решение2
Насколько мне известно, NAT работает следующим образом: компьютеры A и B получают внутренние IP-адреса internal1 и internal2. Затем NAT назначает им порты на том же IP-адресе, так что для публичного просмотра они находятся за someIP:1 и someIP:2.
Количество портовнечасть адреса хоста – на уровне IP нет такого понятия, как порты, независимо от того, используется NAT или нет. IP-адрес хоста всегдатолькоадрес; у него нет портов «второго уровня», и у него также нет портов «первого уровня». [1]
Вместо этого порты принадлежат каждому отдельному TCP/UDP-серверу.связькоторые хост создает поверх IP. (Ну, строго говоря, они являются частью каждого пакета, и все пакеты в одном соединении используют одни и те же порты.)
Итак, когда вы видите адрес, написанный как 12.34.56.78:123
, все дело в том,нетIP-адрес хоста – это конечная точка TCP-соединения для порта 123вхост, IP-адрес которого по-прежнему просто 12.34.56.78
.
Эти портыне добавленыпо NAT – они всегда были там; каждый пакет TCP или UDP имеет ровно два порта (один порт «источника» и один порт «назначения»). Маршрутизатор, который выполняет NAT, просто транслирует их в разные значения. Независимо от того, сколько у вас уровней NAT, этот пакет все равно будет иметь два порта.
[1] Это означает, что когда у вас есть два хоста, NAT-защищенных одним публичным адресом, они фактически неразличимы для уровня IP – когда IP-пакет извне отправляется, someIP
у него нет возможности указать, какой хост ему нужен; маршрутизатор NAT должен вывести это из уровня TCP. Вот почему вам нужно настроить правила «переадресации портов», чтобы принимать входящие соединения.