Что такое NAT и зачем он нужен?
NAT (Network Address Translation) — механизм преобразования IP-адресов в заголовках пакетов при их прохождении через маршрутизатор, позволяющий множеству устройств с приватными IP-адресами выходить в Интернет через один публичный IP-адрес.
Аналогия из жизни: NAT — это секретарь в офисе. Все сотрудники (приватные IP) звонят через один общий телефон компании (публичный IP). Секретарь (маршрутизатор с NAT) запоминает, кто кому звонил, и когда приходит ответный звонок — переключает его на нужного сотрудника.
Зачем нужен NAT
- Экономия IPv4-адресов — организация может иметь один публичный IP на маршрутизаторе, а внутри сети использовать приватные адреса (
192.168.x.x) для сотен устройств - Безопасность — устройства за NAT не видны из Интернета напрямую, что затрудняет прямые атаки на них
- Гибкость — можно менять внутреннюю структуру сети, не меняя внешний IP
Как работает NAT (PAT / NAPT)
Пример
Внутренняя сеть Маршрутизатор (NAT) Интернет
Публичный IP: 203.0.113.5
PC1 (192.168.1.10:5000) ──→ NAT → 203.0.113.5:40001 ────→ Сервер (93.184.216.34:80)
PC2 (192.168.1.20:5000) ──→ NAT → 203.0.113.5:40002 ────→ Сервер (93.184.216.34:80)
- PC1 отправляет пакет:
src=192.168.1.10:5000,dst=93.184.216.34:80 - NAT заменяет
srcна203.0.113.5:40001и записывает соответствие в NAT-таблицу - Сервер отвечает на
203.0.113.5:40001 - NAT смотрит в таблицу, заменяет
dstобратно на192.168.1.10:5000и пересылает PC1
Типы NAT
| Тип | Что делает | Пример использования |
|---|---|---|
| SNAT (Source NAT) | Подмена адреса источника | Внутренние устройства выходят в Интернет через один публичный IP |
| DNAT (Destination NAT) | Подмена адреса назначения | Port forwarding: перенаправление входящих соединений на внутренний сервер |
| PAT / NAPT | NAT с трансляцией портов | Множество устройств за одним IP, различаются портами (самый распространённый) |
| Full Cone NAT | Любой внешний хост может отправить пакет внутреннему через mapped port | P2P-приложения |
| Symmetric NAT | Отдельный mapping для каждой пары (внутренний, внешний) | Корпоративные сети (самый строгий) |
Проблемы NAT
- Некоторые протоколы (FTP active mode, SIP, P2P) плохо работают через NAT — они передают IP-адрес внутри payload
- Невозможно подключиться извне к устройству за NAT без port forwarding или UPnP
- Усложняет P2P-соединения (нужен STUN/TURN для WebRTC)
- Нарушает принцип end-to-end connectivity
- При IPv6 NAT не нужен — адресов достаточно для каждого устройства
Для Java-разработчика
- При развёртывании приложения в Docker-контейнере оно находится за NAT (Docker bridge network). Порт пробрасывается через
-p 8080:8080 - Port forwarding необходим, чтобы внешний трафик достигал серверного приложения за NAT
- В Kubernetes Service (ClusterIP, NodePort, LoadBalancer) реализует NAT-подобную трансляцию для Pod-ов
- При отладке сетевых проблем важно понимать, что
request.getRemoteAddr()за NAT возвращает IP NAT-устройства, а не клиента. Для получения реального IP нужен заголовокX-Forwarded-For
Вывод
NAT — ключевая технология, позволившая Интернету функционировать при ограниченном количестве IPv4-адресов. Он обеспечивает и экономию адресов, и базовый уровень безопасности, но создаёт проблемы для протоколов, требующих прямой связности.
На собеседовании: объясните разницу между SNAT и DNAT, приведите пример port forwarding. Часто спрашивают в контексте Docker: как контейнер общается с внешним миром (через NAT bridge-сети) и как внешний трафик попадает в контейнер (через
-p/ DNAT).