AWS VPC: интернет-шлюз против NAT

Это, и это, и это очень связано с моим вопросом. Несмотря на то, что он, похоже, ответил на многие сомнения людей, я все еще пытаюсь понять, относится ли эта настройка к AWS или к общим сетям. Если это последнее, то мне нужно вернуться к моим основам. Я подозреваю, что уже и отсюда вопрос.

Мое понимание

Если частная сеть подключена к Интернету, то ее узлы должны иметь публичные IP-адреса, чтобы их можно было однозначно идентифицировать в Интернете. Весь трафик в Интернет, входящий или исходящий, происходит с этим публичным IP-адресом. Хост из этой сети при подключении к Интернету получает публичный IP. Пакет, исходящий от этого хоста, чтобы сообщить, что www.google.com будет иметь частный адрес хоста в пакете, который в конечном итоге будет заменен его общедоступным IP-адресом устройством NAT (которое установлено на маршрутизаторе / шлюзе по умолчанию), которое является как показано здесь. Так работает большая часть интернета (кроме IPV6).

Теперь в AWS

  • при создании общедоступной подсети и включении автоматического назначения общедоступных IP-адресов вы по существу информируете интернет-шлюз о необходимости переключения частного адреса экземпляра EC2 с общедоступным IP-адресом экземпляра EC2 в пакетах запросов, исходящих из этого экземпляра EC2, во время маршрутизации. его запросы в Интернете и наоборот на пути. Правильно ли мое понимание?
  • когда вы создаете частную подсеть (не подключая ее к интернет-шлюзу), вы сохраняете ее частной. Затем мы сознательно следим за тем, чтобы отключить автоматическое назначение Public IP. Когда мы запускаем экземпляры EC2 внутри этой частной подсети, мы не видим общедоступные IP-адреса на консоли EC2. Это также означает, что экземпляры в этой подсети не видны в Интернете. Теперь, если я подключу эту частную подсеть к устройству NAT (которое, конечно, находится в общедоступной подсети) (пожалуйста, не путайте меня с тем, что в данный момент шлюз NAT делает лучше), тогда я, по сути, ухожу устройство NAT для определения общедоступного IP-адреса, которое необходимо назначить для конкретного хоста X из частной подсети, которая запросила связь с Интернетом, поскольку общедоступный IP-адрес необходим для связи с интернетом.

    Сейчас,

    • Разве это не то, что Router/(Internet) Gateway уже делает, а также делает это в AWS и в общих сетях? Разве назначение общих публичных IP-адресов узлам в сети и постоянная замена частного IP-адреса общедоступным IP-адресом в пакетах (исходящих от узла в этой сети) при их выходе в Интернет - это то, что переносится через роутер?
    • Скажем, устройство NAT определяет IP 1.2.3.4, который будет назначен этому узлу частной подсети. Если "каким-то образом" этот IP-адрес станет известен в Интернете, то этот узел в частной подсети также должен стать доступным из Интернета, если только устройство NAT не использует какой-то трюк (см. Следующий вопрос). Правильно ли мое понимание? Теперь AWS сообщает, что устройство NAT не разрешает входящую связь. Это похоже на противоречие с тем фактом, что даже если общедоступный IP 1.2.3.4 (который устройство NAT назначает узлу этой частной подсети) станет известным, входящие соединения будут принудительно ограничены? Или же устройство NAT просто использует свой собственный IP-адрес от имени хостов из частной сети (это не то, что в идеале должно делать устройство NAT; устройство NAT берет назначенный частный IP-адрес и заменяет его публичным IP-адресом в пакетах).)?
    • Кроме того, AWS позволяет вам также автоматически назначать публичные IP-адреса в частной подсети. И я могу подтвердить, что я вижу экземпляры EC2 в частной подсети с публичным IP. Итак, теперь у вас есть частная подсеть (так как они не подключены к интернет-шлюзу в таблицах маршрутизации) с экземплярами, имеющими публичный IP (так как вы включили автоматическое назначение публичных IP-адресов в частной подсети). Как это должно быть истолковано?

1 ответ

Решение

Я думаю, вы неправильно понимаете функцию шлюза NAT, и это приводит ко всем другим путаницам.

  • NAT не назначает адреса случайным образом внутренним / частным хостам.

  • Устройство NAT обычно имеет два интерфейса - внутренний с частным IP, например 10.0.0.1. И внешний с публичным IP, например 1.2.3.4.

  • Хосты из внутренней сети, которые имеют, например, некоторые 10.0.0.x адрес (и не общедоступный) отправляет весь исходящий трафик на шлюз NAT, и этот шлюз NAT заменяет исходный IP в пакете (например, 10.0.0.123) с собственным публичным IP (т.е. 1.2.3.4). Затем он отправляет пакет в пункт назначения в Интернете, например, в Google.

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

NAT объяснил:

Внутренний хост 10.0.0.123 хочет скачать что-то с google.com по адресу 216.58.203.110 через HTTPS, т.е. порт 443,

  1. Отправляет пакет с источником 10.0.0.123:12345 (адрес: случайный локальный порт) и пункт назначения 216.58.203.110:443 (адрес: порт HTTPS) к шлюзу NAT, потому что это лучший следующий переход для всех адресов, которые не являются10.0.0.x,

  2. Шлюз NAT заменяет источник из 10.0.0.123:12345 на свой публичный IP и какой-то случайный порт 1.2.3.4:54321,

  3. Он записывает, что соединение от 10.0.0.123:12345 в 216.58.203.110:443 был переведен на 1.2.3.4:54321 в его таблице отслеживания соединений.

  4. Когда ответный пакет от Google прибывает на NAT-шлюз с пунктом назначения 1.2.3.4:54321шлюз ищет эту запись (адрес: порт) и видит, что он должен перевести ее обратно 10.0.0.123:12345 и отправить его на этот хост на этом порту.

Если в то же время другой хост из локальной сети (например, 10.0.0.99) пытается что-то скачать с гугла вот что получается:

  1. Шлюз NAT снова переводит исходный IP-адрес в собственный публичный IP-адрес. 1.2.3.4 но порт источника будет чем-то другим, чем раньше, например 56789,

  2. Теперь Google видит два подключения от нашего шлюза NAT

    • 1.2.3.4:54321 - к - 216.58.203.110:443 (где шлюз NAT знает, что исходный источник на самом деле 10.0.0.123:12345)
    • 1.2.3.4:56789 - к - 216.58.203.110:443 (NAT GW знает, что оригинальный источник 10.0.0.99:12345).

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

Это в двух словах.


Теперь пара замечаний:

  • Вы не можете инициировать подключения извне к хосту за NAT. Вы можете отправлять ответы только на пакеты, инициированные изнутри.

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

    Если вы хотите SSH к 10.0.0.123:22 со стороны, как бы вы это сделали? Вы можете отправить пакет SSH на IP-адрес шлюза NAT 1.2.3.4 а какой порт? Видите, нет сопоставления, поэтому невозможно установить соединение извне.

  • Маршрутизаторы, с другой стороны, не меняют никаких IP-адресов или портов (в отличие от шлюзов NAT). Они пропускают пакеты практически без изменений.

  • В контексте AWS Маршрутизатор - это IGW = Интернет-шлюз. NAT может быть либо NAT Gateway, либо NAT Instance, они делают то же самое.

Надеюсь, что это объясняет:)

Это больше (большой) поддерживающий комментарий к ответу @MLu, приведенному выше, со ссылкой на соответствующие фрагменты из официальных документов AWS, которые проливают свет на то, что делают интернет-шлюз и устройства NAT в AWS.

Устройство NAT (экземпляр NAT или шлюз NAT)

Из документации AWS "Amazon VPC" Руководство пользователя "Сетевые компоненты VPC" NAT:

Мы используем термин NAT в этой документации, чтобы следовать общепринятой практике ИТ, хотя фактическая роль устройства NAT - это и трансляция адресов, и трансляция адресов портов (PAT).

Устройство NAT предназначено специально для того, чтобы узлы в частной сети могли получить доступ к внешней сети (Интернет) через устройство NAT, которое выполняет PAT.

Итак, если в частной подсети есть хост с ip 10.0.1.1/32и отправляет запрос на google.com (216.58.211.174/32), устройство NAT запишет сопоставление с 10.0.1.1:SOMESOURCEPORT на 216.58.211.174:SOMEDESTPORT и изменит исходный IP-адрес в запросе (пакете) на это его общедоступный NAT-PUB-IP:SOMERANDOMPORT.

Записанное отображение будет:10.0.1.1:SOMESOURCEPORT --❯ NAT-PUB-IP:SOMERANDOMPORT

Когда он получает ответ обратно NAT-PUB-IP:SOMERANDOMPORT, тогда поиск записанных отображений покажет, что ответ должен вернуться к 10.0.1.1,

Все внутренние IP-адреса преобразуются в один публичный IP-адрес, назначенный устройству NAT. Мультиплексирование соединений зависит от устройства NAT, однозначно идентифицирующего внутренние хосты на основе SOMERANDOMPORT,

Это также подразумевает, что если внутренним хостам действительно назначен общедоступный IP-адрес, для устройства NAT это не имеет значения, поскольку оно выполняет PAT только для внутренних IP-адресов.

Интернет-шлюз (IGW)

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

Internal HOST IP <-> Public IP Assigned to the Internal Host

Обратите внимание, что хост внутри AWS VPC знает только о своем частном IP-адресе внутри VPC. Присвоенный ему публичный IP-адрес используется только интернет-шлюзом.

Для того же запроса, что и выше (внутренний хост на google.com), если

  1. Хост находится в общедоступной подсети (что по определению означает, что общедоступная подсеть связана с таблицей маршрутов, имеющей запись маршрута quad-cidr для перенаправления всего трафика не-VPC в IGW) И,
  2. Ему назначен общедоступный IP-адрес, затем пакет, исходящий от внутреннего хоста с пунктом назначения во что-то за пределами VPC, направляется на IGW, который преобразует IP-адрес источника в пакете в соответствии с картой, которая у него есть:

10.0.1.1 -> Public_IP_Of_Internal_Host

и когда он получает ответ обратно с адресатом Public_IP_Of_Internal_Host это просто переводится обратно 10.0.1.1


С https://docs.aws.amazon.com/vpc/latest/userguide/VPC_Internet_Gateway.html

Интернет-шлюз служит двум целям: предоставить в таблицах маршрутов VPC цель для трафика, маршрутизируемого через Интернет, и выполнить преобразование сетевых адресов (NAT) для экземпляров, которым были назначены публичные адреса IPv4.

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

Другие вопросы по тегам