Существует общее заблуждение между NAT ( трансляция сетевых адресов) и PAT (трансляция адресов портов), что мы чаще всего используем в наших домашних маршрутизаторах.
NAT
Предположим, у нас есть сеть со следующей топологией:
Частная сеть <-------> Маршрутизатор <-------> The_Internet
Интерфейс маршрутизатора, который подключен к Private_Network, имеет частный IP-адрес , то есть тот, который не является уникальным в The_Internet . С другой стороны, в случае NAT , маршрутизатор имеет несколько интерфейсов , подключенных к The_Internet . Каждый интерфейс имеет уникальный IP-адрес в The_Internet . Теперь давайте предположим, что Host_A и Host_B находятся в Private_Network, и они оба хотят получить доступ к Website_X в The_Internet одновременно. IP-адреса и порты Host_AПакет будет:
Исходный IP: частный IP- адрес Host_A
: порт на Host_A.
IP- адрес назначения: открытый / уникальный IP- адрес Website_X
: порт, на котором сервер Website_X прослушивает.
и таким же образом для пакета, поступающего от Host_B .
Если исходный IP-адрес оставить без изменений, то Website_X ответит на IP-адрес, который является частным, то есть не уникальным, и поэтому пакет никогда не сможет найти свой путь назад. Чтобы решить эту проблему, Маршрутизатор проверяет, не используется ли один из его уникальных IP-адресов, подключенных к The_Internet . Если это так, он выполняет следующее отображение:
Личный IP-адрес Host_A ======= Router's_unique_IP_K
и теперь пакет, который начался с Host_A и идет на Website_X, а теперь покидает интерфейс маршрутизатора, подключенного к The_Internet, будет иметь вид:
Исходный IP-адрес: Router's_unique_IP_K
Исходный порт: порт на Host_A.
IP- адрес назначения: открытый / уникальный IP- адрес Website_X.
Порт назначения: порт, который прослушивает сервер Website_X.
Таким образом, вы можете понять, что существует прямая связь между частными IP-адресами и публичными IP-адресами. Поэтому, когда пакет приходит от Website_X к маршрутизатору , эта ассоциация проверяется, и IP-адрес назначения возвращается обратно к частному и успешно доставляется на нужный хост.
Как видите, этот метод довольно прост, но у него есть один большой недостаток: каждому частному хосту необходимо иметь зарезервированный уникальный IP-адрес, что является дорогостоящим, поэтому мы выбираем меньшее количество уникальных IP-адресов, чем хостов в частной сети. Поэтому, если все частные хосты пытаются получить доступ к The_Internet одновременно, только их подмножество, равное количеству доступных публичных IP-адресов, которые маршрутизаторимеет, будет иметь доступ, а остальное будет отказано.
Чтобы противостоять этому, мы создали PAT .
PAT
PAT - это то, что использует подавляющее большинство наших домашних маршрутизаторов. Основным ограничением является то, что маршрутизатор имеет один уникальный IP-адрес, с которым он соединяется с The_Internet , но мы все же хотим разрешить нескольким хостам из частной сети доступ к The_Internet одновременно.
То, как мы это делаем, «похоже» на то, как это делает NAT с ключевым отличием: вместо маршрутизатора, содержащего пул IP-адресов, он содержит пул номеров портов. Точнее говоря, пакет, поступающий на маршрутизатор от Host_A в Private_Network, предназначенный для Website_X вThe_Internet будет иметь следующий формат:
Исходный IP: частный IP- адрес Host_A
: порт на Host_A.
IP- адрес назначения: открытый / уникальный IP- адрес Website_X
: порт, на котором сервер Website_X прослушивает.
Теперь маршрутизатор будет выполнять две задачи:
- Это изменит IP-адрес источника на уникальный публичный IP- адрес маршрутизатора И
- Это изменит исходный порт на порт из пула, который поддерживает маршрутизатор и еще не используется, например, Port_Z
и теперь пакет, который начался с Host_A и идет на Website_X, а теперь покидает интерфейс маршрутизатора, подключенного к The_Internet, будет иметь вид:
Исходный IP-адрес: Router's_unique_IP_K
Исходный порт: Port_Z
IP- адрес назначения: общедоступный / уникальный IP- адрес веб - сайта Website_X
: порт, который прослушивает сервер Website_X
и маршрутизатор сохранит следующее отображение:
Личный IP- адрес Host_A И порт Host_A ======= Port_Z
Почему это работает?
Теперь, когда пакет возвращается, маршрутизатор просто проверяет номер порта назначения и изменяет IP-адрес назначения и номер порта назначения в соответствии с вышеупомянутым отображением, и пакет успешно доставляется.
Что делать, если я запускаю несколько приложений на одном хосте?
По определению разные приложения будут иметь разные порты, поэтому они будут привязаны к другому порту маршрутизатора .
Что если несколько хостов попытаются получить доступ к The_Internet одновременно и все они используют одно и то же приложение?
По определению разные хосты будут иметь разные частные IP-адреса, поэтому они будут сопоставлены с другим портом от маршрутизатора .
ПАТ опасно балансирует в сером межслоевом пространстве. Номера портов являются частью транспортного протокола, в то время как маршрутизаторам разрешено работать по Интернет-протоколу. Технически говоря, это то, что запрещено протоколами. Поэтому существуют, по крайней мере теоретически, потенциальные опасности: пул портов ограничен. Поэтому, если моя частная сеть состоит из 1000 хостов, и в каждом из них запущены приложения port_pool / 10, в таблице сопоставления на маршрутизаторе закончатся доступные записи, и доступ к приложениям будет закрыт.
Этот ответ значительно превысил мою предполагаемую длину, но я надеюсь, что он был полезен.