Networking

NAT

Network Address Translation — подмена адресов в пакетах, позволяющая устройствам с приватными IP выходить в интернет через один публичный адрес.

Что такое NAT

NAT (Network Address Translation, трансляция сетевых адресов, в разговоре «нат») — механизм, который на лету подменяет IP-адреса и порты в проходящих пакетах. Классическая задача: выпустить десяток устройств с приватными адресами 192.168.1.x в интернет через один публичный адрес.

Аналогия: NAT — офисный секретарь с одним городским номером. Сотрудники звонят наружу, и все видят номер офиса. Когда приходит ответ, секретарь помнит, кто именно звонил, и переводит звонок на нужный добавочный. Но если позвонить в офис «просто так», секретарь не знает, кому адресовать, — и звонок никуда не попадёт.

Отсюда главное свойство NAT: исходящие соединения работают прозрачно, входящие — нет, пока их не настроили явно.

Что такое NAT в роутере

Именно этим NAT в роутере и занимается. Провайдер выдаёт домашней сети один публичный адрес, а устройств в ней — десятки. Роутер подменяет адрес источника в каждом уходящем пакете на свой публичный и записывает соответствие в таблицу трансляций:

Из локальной сети:  192.168.1.10:51234 → 93.184.216.34:443
Уходит в интернет:  203.0.113.7:60001  → 93.184.216.34:443
                          ↑
        роутер запомнил: 60001 ↔ 192.168.1.10:51234

Ответ пришёл на:    93.184.216.34:443  → 203.0.113.7:60001
Роутер вернул:      93.184.216.34:443  → 192.168.1.10:51234

Различить клиентов помогает порт: у каждого соединения он свой, и по нему роутер находит нужную строку в таблице. Такой вариант точнее называть PAT или NAPT, но на практике словом NAT обозначают именно его.

SNAT и DNAT

Это две стороны одной технологии, различаются тем, какой адрес подменяется.

SNAT DNAT
Что подменяет адрес источника адрес назначения
Направление исходящие пакеты входящие пакеты
Зачем выпустить сеть в интернет пробросить порт на внутренний сервер
Где происходит POSTROUTING PREROUTING
Бытовое название «интернет через роутер» «проброс порта», port forwarding

MASQUERADE — разновидность SNAT, которая берёт адрес прямо с интерфейса, а не из конфига. Нужна там, где публичный адрес динамический.

# SNAT: выпускаем подсеть 10.0.0.0/24 в интернет через eth0
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE

# DNAT: снаружи стучатся на 8080 — уводим на внутренний веб-сервер
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 \
         -j DNAT --to-destination 10.0.0.5:80

# без этого ядро не пересылает пакеты между интерфейсами
sysctl -w net.ipv4.ip_forward=1

Состояние трансляций ядро хранит в conntrack — его же используют правила iptables/UFW:

$ conntrack -L | head -3
tcp 6 431999 ESTABLISHED src=10.0.0.5 dst=93.184.216.34 sport=51234 dport=443 \
    src=93.184.216.34 dst=203.0.113.7 sport=443 dport=60001 mark=0 use=1

Таблица conntrack не бесконечна: на нагруженном шлюзе она переполняется, в логах появляется nf_conntrack: table full, dropping packet, и новые соединения начинают отваливаться. Лечится увеличением net.netfilter.nf_conntrack_max.

Где вы столкнётесь с NAT

  • Облако. Инстанс в VPC почти всегда имеет приватный адрес, а публичный навешивается через NAT «один к одному». Внутри гостевой ОС вы своего белого IP не увидите — ip addr покажет 10.0.x.x.
  • Docker. Мосты и -p 8080:80 — это тот же DNAT: контейнеры сидят в приватной подсети, а платформа пробрасывает порты.
  • CGNAT. Провайдер прячет за одним адресом тысячи абонентов, часто используя диапазон 100.64.0.0/10. Поднять сервер, доступный снаружи, за таким подключением невозможно — нужен белый адрес или VPN до узла с ним.

Что NAT ломает

NAT нарушает сквозную адресацию, и часть протоколов это задевает:

  • Входящие соединения не проходят без явного проброса — отсюда вся возня с port forwarding.
  • Активный FTP и SIP передают адреса внутри тела пакета, и NAT про них не знает — нужны хелперы или пассивный режим.
  • Логи видят один адрес. За NAT все клиенты выглядят одинаково: чтобы различать их, приложение должно читать X-Forwarded-For.

NAT — не средство защиты, хотя его часто так воспринимают. Он лишь скрывает адреса; фильтрацией занимается файрвол. А в IPv6 NAT не нужен вовсе — адресов хватает всем.

Связанные термины

Готовы запустить GPU-задачу?

Запустить GPU-сервер