Протокол NAT (Network Address Translation) является протоколом сеансового уровня и представляет собой механизм трансляции сетевых адресов, который позволяет реализовать множественный доступ компьютеров локальной (частной) сети (каждый из которых имеет собственный внутренний IP-адрес) в Интернет, используя всего один внешний IP-адрес WAN-порта.
Реализацией протокола NAT является NAT-сервер, который может функционировать как сервис операционной системы выделенного компьютера или поднят на аппаратном маршрутизаторе или некоторых коммутаторах с поддержкой L3.
Все компьютеры внутренней локальной сети извне видятся как один интерфейс с одним IP-адресом, то-есть практически становятся невидимыми извне, но для каждого из них внешняя сеть является доступной. Что очень важно — протокол NAT пропускает в сеть только те данные из Интернета (точнее — из внешней сети), которые поступили в результате запроса от компьютера из локальной сети.
Клиентам сети, находящимся с внутренней стороны NAT, назначаются частные IP-адреса; обычно это делается через службу DHCP (Dynamic Host Configuration Protocol — протокол динамической настройки узлов) или путем статической настройки, выполняемой администратором. Обычно это адреса из диапазона зарезервированных локальных адресов:
- 10.0.0.0/8
- 172.16.0.0/12
- 192.168.0.0/16
При обращении приложения, находящегося на компьютере во внутренней сети к серверу во внешней сети, обычно происходит следующее.
На стороне клиента
Приложение, собирающееся установить связь с сервером, открывает сокет, определяемый IP-адресом источника, портом источника, IP-адресом назначения, портом назначения и сетевым протоколом. Эти параметры идентифицируют обе конечные точки, между которыми будет происходить сеанс связи. Когда приложение передает данные через сокет, частный IP-адрес клиента (IP-адрес источника) и клиентский порт (порт источника) вставляются в пакет в поля параметров источника. Поля параметров пункта назначения будут содержать IP-адрес сервера (IP-адрес назначения — удаленный узел) и порт сервера. Поскольку пункт назначения пакета находится вне частной сети, клиент направляет его в основной шлюз или шлюз по умолчанию. В этом случае в качестве шлюза по умолчанию необходимо указывать IP-адрес внутреннего интерфейса сервера NAT.
Исходящий пакет на сервере NAT
Сервер NAT получает исходящий пакет и сохраняет IP-адрес и порт источника в своей внутренней NAT-таблице. Вместо них он подставляет IP-адрес своего внешнего интерфейса, а вместо номера порта источника подставляет индекс записи в своей таблице. Внешние IP-адрес и порт — это общие IP-адрес и порт, которые будут использоваться в текущем сеансе передачи данных вместо внутренних IP-адреса и порта клиента. Преобразованный пакет пересылается по внешней сети и в итоге попадает на заданный сервер.
На стороне внешнего сервера
Получив пакет, внеший сервер-получатель полагает, что имеет дело с каким-то одним компьютером, IP-адрес которого допускает глобальную маршрутизацию. Сервер будет направлять ответные пакеты на внешние IP-адрес и порт сервера NAT, указывая в полях источника свои собственные IP-адрес и порт.
Входящий пакет на сервере NAT
NAT принимает ответные пакеты от внешнего сервера и анализирует их содержимое на основе своей таблицы сопоставления портов. Если в таблице будет найдено сопоставление порта, для которого IP-адрес источника, порт источника, порт назначения и сетевой протокол из входящего пакета совпадают с IP-адресом удаленного узла, удаленным портом и сетевым протоколом, указанным в сопоставлении портов, NAT выполнит обратное преобразование. NAT заменяет внешний IP-адрес и внешний порт в полях назначения пакета на частный IP-адрес и внутренний порт клиента.Затем NAT отправляет пакет клиенту по внутренней сети. Однако если NAT не находит подходящего сопоставления портов, входящий пакет отвергается и соединение разрывается.
Благодаря устройству NAT клиент получает возможность передавать данные в глобальной среде Интернета, используя лишь частный, внутренний IP-адрес; ни от приложения, ни от клиента не требуется никаких дополнительных усилий. Приложению не приходится обращаться к каким-либо специальным API-интерфейсам, а клиенту не нужно выполнять дополнительную настройку. В данном случае механизм NAT оказывается прозрачным по отношению к клиенту и к серверному приложению.
Таким образом протокол NAT решает две главные задачи:
- помогает справиться с дефицитом IP-адресов, который становится все более острым по мере роста количества компьютеров;
- обеспечивает безопасность внутренней сети — компьютеры локальной сети, защищенные маршрутизатором с активированным NAT-протоколом (устройством NAT), становятся недоступными из внешней сети.
Хотя протокол NAT не заменяет брандмауэр, он все же является важным элементом безопасности.
В некоторых маршрутизаторах возможно отключение NAT-протокола. Однако имеются модели, где NAT-протокол активирован и отключить его невозможно. Это касается бытовых маршрутизаторов, которые еще называются Интернет-шлюзами.
При этом важно, чтобы маршрутизатор мог частично обойти ограничения NAT-протокола. Дело в том, что не все сетевые приложения пользуются протоколами, способными взаимодействовать с NAT. Поэтому все маршрутизаторы имеют функции, позволяющие наложить ограничения на использование протокола NAT.
Сервер, устанавливаемый во внутренней сети и являющийся прозрачным для протокола NAT, называют виртуальным сервером (Virtual Server). Прозрачным для протокола NAT может быть не весь сервер, а лишь определенные сервисы, запускаемые на нем. Для того чтобы реализовать виртуальный сервер во внутренней сети, на маршрутизаторе используется технология перенаправления портов.