NAT

Предпосылки: IP и маршрутизация (IP-адрес, маска, роутер, шлюз по умолчанию).

DHCP | IPv6

В домашней сети пять устройств: ноутбук, телефон, планшет, телевизор, умная колонка. У каждого свой IP из диапазона 192.168.1.x. Но провайдер выдаёт одному домохозяйству один публичный IP-адрес. Как пять устройств с частными адресами выходят в интернет через один публичный?

Частные и публичные адреса

IPv4 предоставляет ~4.3 млрд адресов (2³²). Этого давно не хватает на все устройства в мире. Решение — разделить адреса на публичные (уникальные в интернете) и частные (используются только внутри локальных сетей, не маршрутизируются в интернете):

ДиапазонМаскаКоличество адресов
10.0.0.0 – 10.255.255.255/8~16.7 млн
172.16.0.0 – 172.31.255.255/12~1 млн
192.168.0.0 – 192.168.255.255/16~65 тыс

Тысячи домашних сетей используют один и тот же диапазон 192.168.1.x — и это нормально, потому что эти адреса не выходят за пределы локальной сети.

NAT: трансляция адресов

NAT (Network Address Translation) — механизм на роутере, который подменяет адрес отправителя при выходе пакета в интернет и восстанавливает его при возвращении ответа.

Ноутбук 192.168.1.25:52431 отправляет запрос к 142.250.74.46:443 (Google). Роутер с публичным IP 203.0.113.5 перехватывает пакет, заменяет IP отправителя на свой публичный и заменяет порт на свободный из своего диапазона (например, 203.0.113.5:30001). Роутер записывает соответствие в NAT-таблицу: 192.168.1.25:52431203.0.113.5:30001.

Google видит запрос от 203.0.113.5:30001 и отправляет ответ на этот адрес. Роутер получает ответ, находит запись в NAT-таблице, подменяет адрес получателя обратно на 192.168.1.25:52431 и отправляет пакет в локальную сеть.

Эта конкретная разновидность называется PAT (Port Address Translation) или NAPT — один публичный IP разделяется между множеством устройств через разные порты. Домашний роутер использует именно PAT.

SNAT и DNAT

SNAT (Source NAT) — подмена адреса отправителя. Описанный выше сценарий — это SNAT: устройства из частной сети выходят в интернет через один публичный IP.

DNAT (Destination NAT) — подмена адреса получателя. Используется в обратном направлении: когда нужно направить входящий трафик из интернета на конкретное устройство в частной сети.

В Linux-контейнерах те же SNAT/DNAT используются для публикации портов (docker -p) и связи bridge-сети контейнера с хостом. Практическая сборка этого пути разобрана в контейнерах.

Port Forwarding: входящие соединения

NAT отлично работает для исходящего трафика — устройство инициирует соединение, роутер создаёт запись в таблице, ответы возвращаются по ней. Но что, если нужно принять входящее соединение из интернета? Например, запустить веб-сервер на 192.168.1.100:80.

Внешний клиент отправляет запрос на 203.0.113.5:80. Роутер получает пакет, но в NAT-таблице нет записи — никто из локальной сети не инициировал это соединение. Пакет отбрасывается.

Port forwarding — ручная запись в NAT: “все входящие на порт 80 направляй на 192.168.1.100:80”. Это разновидность DNAT.

CGNAT: NAT за NAT-ом

Публичных IPv4-адресов стало настолько мало, что провайдеры тоже начали использовать NAT — CGNAT (Carrier-Grade NAT). Домашний роутер получает не публичный адрес, а частный (обычно из 100.64.0.0/10), и провайдер выполняет ещё один уровень трансляции на своём оборудовании. Пакет проходит через два NAT: домашний и провайдерский.

Последствия: port forwarding перестаёт работать (входящие соединения невозможны без помощи провайдера), P2P-приложения затрудняются (оба участника за NAT не могут установить прямое соединение), трассировка проблем усложняется.

Проблемы NAT

NAT нарушает принцип прямой связи: устройства за NAT не могут быть адресованы напрямую из интернета — любой узел должен иметь возможность связаться с любым другим, но NAT это блокирует. Протоколы, которые передают IP-адреса внутри данных (например, IP-телефония, FTP в активном режиме), ломаются, если NAT не знает об их специфике.

Hairpin NAT (NAT loopback) — ситуация, когда устройство из локальной сети обращается к публичному IP своего же роутера. Без специальной настройки роутер не понимает, что запрос предназначен для внутреннего устройства.

CGNAT и исчерпание IPv4-адресов — главная мотивация для перехода на IPv6, где огромного адресного пространства хватает без NAT как механизма экономии публичных адресов.


DHCP | IPv6