NAT
Предпосылки: IP и маршрутизация (IP-адрес, маска, роутер, шлюз по умолчанию).
В домашней сети пять устройств: ноутбук, телефон, планшет, телевизор, умная колонка. У каждого свой 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:52431 ↔ 203.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 как механизма экономии публичных адресов.