Gymterview
junior

Что такое 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)
  1. PC1 отправляет пакет: src=192.168.1.10:5000, dst=93.184.216.34:80
  2. NAT заменяет src на 203.0.113.5:40001 и записывает соответствие в NAT-таблицу
  3. Сервер отвечает на 203.0.113.5:40001
  4. 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).