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 не нужен вовсе — адресов хватает всем.
Связанные термины
- IP-адрес — то, что NAT подменяет
- Маска подсети и CIDR — приватные диапазоны за NAT
- IPv4 и IPv6 — NAT как следствие дефицита адресов
- iptables / UFW — чем NAT настраивают в Linux
- VPC — облачная сеть, где NAT работает по умолчанию
- Сетевые порты — по ним NAT различает соединения
Готовы запустить GPU-задачу?
Запустить GPU-сервер