NAT (Network Address Translation): Полное руководство от ядра Linux до облачных архитектур
Network Address Translation (NAT) — это механизм модификации сетевых заголовков на маршрутизаторе. Если совсем просто: NAT позволяет множеству устройств в квартире (частная сеть) выходить в интернет через одну общую дверь (публичный IP-адрес), а также «прокладывает трубу» обратно к игровой консоли или веб-камере.
Однако для инженера NAT — это не просто «подмена IP». Это stateful-механизм, который изменяет поля L3/L4, пересчитывает контрольные суммы, ведет таблицу соединений (conntrack) и может серьезно нагружать процессор.
Зачем понадобился NAT? (Проблема IPv4)
Интернет построен на протоколе IPv4, который позволяет существовать всего ~4.3 миллиарда уникальных адресов. К 2010-м годам они закончились.
Чтобы не изобретать интернет заново, придумали «костыль», ставший стандартом: NAT.
- Частные IP-адреса (RFC 1918): Внутри офиса или дома используются адреса, которые не маршрутизируются в глобальной сети (например, 192.168.1.0/24).
- Публичный IP: Один или несколько адресов на внешнем интерфейсе роутера.
- Трансляция: Роутер подменяет адреса в пакетах, чтобы ответы с сервера Google знали, как вернуться обратно к вашему ноутбуку.
Ключевые функции NAT в современной сети:
- Экономия адресов: Множество хостов выходят в интернет через один публичный IP.
- Сокрытие топологии: Внутренняя структура сети не видна сканерам портов извне.
- Гибкость миграции: Смена провайдера не требует переадресации всей внутренней сети.
- Контроль трафика: Упрощение политик фильтрации на границе сети.
⚠️ Важно: NAT не является полноценным механизмом безопасности (Firewall). Он скрывает адреса, но без(stateful) фильтрации не защитит от атак на уровне приложений.
Алгоритм исходящего соединения (Outbound / SNAT)
- Перехват: Пакет от внутреннего клиента (
192.168.1.10) попадает на шлюз. - Сверка правил: Ядро сети проверяет таблицу NAT (например,
POSTROUTINGв iptables). - Подмена адресов:
- Source IP: Меняется с частного на публичный IP шлюза.
- Source Port: При использовании PAT (Port Address Translation) порт заменяется на свободный ephemeral порт шлюза.
- Пересчет контрольных сумм (Checksums): Так как заголовок изменился, CRC-суммы IP и TCP/UDP должны быть пересчитаны. Это создает нагрузку на CPU.
- Запись состояния (Conntrack): В таблицу состояний записывается маппинг:
192.168.1.10:54321 <-> 203.0.113.1:12345 - Маршрутизация: Пакет уходит во внешнюю сеть.
Алгоритм входящего ответа (Inbound / DNAT)
- Поиск в Conntrack: Шлюз получает ответ на
203.0.113.1:12345. - Обратная трансляция: Находит запись в таблице состояний и подменяет Destination IP/Port на внутренние (
192.168.1.10:54321). - Доставка: Пакет направляется в локальную сеть.
Типы NAT: От 1:1 до Many:Many
Для начинающих это классификация, для опытных — архитектурные решения.

| Тип NAT | Описание | Сценарий использования |
|---|---|---|
| Static NAT (1:1) | Жесткая привязка одного внутреннего IP к одному внешнему. | Публикация серверов (Web, Mail), требующих постоянного публичного IP. |
| Dynamic NAT (N:1) | Пул публичных адресов распределяется между внутренними хостами по запросу. | Корпоративные сети с запасом публичных IP для сокрытия структуры. |
| PAT / NAPT (Many:1) | Множество внутренних адресов транслируются в один IP через разные порты. | Домашние роутеры, выход сотрудников в интернет (Masquerading). |
| DNAT | Подмена адреса назначения (входящий трафик). | Проброс портов (Port Forwarding) на внутренние сервисы. |
1. SNAT (Source NAT) — «Мы идем наружу»
Меняет адрес отправителя.
- Где применяется: Стандартный выход в интернет.
- Как работает: Хост 192.168.1.10 идет на сайт. Роутер подменяет его IP на свой внешний IP
203.0.113.5. - Нюанс для профи:
SNATв iptables требует статического указания IP. Если внешний IP динамический (DHCP), используютMASQUERADE— он работает чуть медленнее, так как сам определяет IP на интерфейсе.
2. DNAT (Destination NAT) — «Нас вызывают»
Меняет адрес получателя.
- Где применяется: Проброс портов (port forwarding), балансировка входящего трафика.
- Как работает: Пакет стучится на роутер
203.0.113.5:443. Роутер подменяет получателя на192.168.1.10:443.
3. PAT (Port Address Translation) / NAT Overload — «Экономим максимально»
Самый популярный тип. Множество внутренних IP-адресов прячутся за одним внешним. Различают их по номерам портов.
- Как работает:
192.168.1.10:34567->203.0.113.5:40001192.168.1.11:34567->203.0.113.5:40002
- Ограничение: Максимум ~65 535 соединений с одного внешнего IP, но на практике меньше из-за особенностей ОС и таймаутов.
Пример реализации на Linux (iptables)
Для специалистов, работающих с Linux-маршрутизаторами, классический пример настройки Masquerading (PAT):
# Включение форвардинга
echo 1 > /proc/sys/net/ipv4/ip_forward
# Правило SNAT (Masquerade) для интерфейса eth0
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# Правило DNAT (Проброс порта 80 на внутренний веб-сервер)
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.50:80
4. Static NAT (1:1)
Один внутренний IP = один внешний IP.
- Плюсы: Полная прозрачность, порты не трогаем. Идеально для своих серверов или IPsec-туннелей.
- Минусы: Не экономит адреса.
Conntrack: Мозг NAT
NAT — это stateful технология. Он запоминает, кто кудa пошел. За это отвечает подсистема conntrack (Connection Tracking).
В памяти ядра создается таблица, где каждая запись — это «мостик»:
- Было: 192.168.1.10:55050 -> 8.8.8.8:53 (UDP)
- Стало: 203.0.113.5:40001 -> 8.8.8.8:53 (UDP)
Когда приходит ответ от 8.8.8.8, ядро смотрит в таблицу, видит, кому предназначался этот пакет, и проделывает обратную трансформацию адресов.
Важно для админов:
Таблица conntrack имеет ограниченный размер.
nf_conntrack_max— максимальное количество соединений.nf_conntrack_udp_timeout— как долго держится запись о закрытом UDP-соединении.
Если таблица переполнится — ядро начнет отбрасывать новые соединения. На высоких нагрузках это частая проблема.
Почему NAT «ломает» протоколы? (SIP, FTP, IPsec)
NAT меняет заголовки, но он «глуп» и не заглядывает внутрь пакета (в payload). А некоторые протоколы передают IP-адреса внутри, в тексте команды.
SIP (VoIP)
Проблема: Телефон за NAT говорит SIP-серверу: «Звони мне на 192.168.1.10:5060».
Сервер пытается позвонить на этот частный адрес и, естественно, не дозванивается.
Решение: STUN (клиент сам узнает свой внешний IP), TURN (ретрансляция трафика через сервер) или SIP ALG (Application-level gateway на роутере, который умеет править SIP-пакеты).
FTP (Active Mode)
Проблема: Клиент говорит серверу «Подключайся ко мне для передачи данных на IP 192.168.1.10, порт 1025». Сервер не может подключиться к частному IP.
Решение: Использовать Passive Mode (PASV), где соединение устанавливает сам клиент.
IPsec (ESP)
Проблема: Протокол ESP (IP protocol 50) не имеет портов. PAT не может запомнить, какому клиенту принадлежит пакет. Кроме того, изменение IP-адреса ломает криптографическую проверку целостности пакета.
Решение: NAT-T (NAT Traversal). Он упаковывает ESP-пакет в обычный UDP (порт 4500), где есть порты и можно менять IP без нарушения целостности внутреннего содержимого.
Производительность и «Узкие места»
Программный NAT (на Linux или маршрутизаторах) потребляет ресурсы CPU.
Что происходит с пакетом:
- Прерывание от сетевой карты.
- Поиск в таблице
conntrack. - Изменение заголовков.
- Пересчет контрольных сумм.
- Отправка.
На скоростях 1 Гбит/с это незаметно. На 10 Гбит/с и выше — софтовый NAT может не успевать.
Аппаратные решения:
- ASIC (Cisco, Juniper): Трансляция происходит «в железе», не нагружая общий процессор.
- FastPath (MikroTik, Linux): Первый пакет соединения обрабатывается медленно (через CPU), а остальные летят по быстрому пути.
NAT и безопасность: Случайный союзник
Часто считают, что NAT — это файрвол. Это не так. NAT не блокирует трафик, он его преобразует. Однако он дает косвенный эффект безопасности:
- По умолчанию, если соединение изнутри не было инициировано, то ответ снаружи «не пробьется» — просто потому, что для него нет записи в
conntrack. - Внутренняя структура сети скрыта.
Но настоящий файрвол должен анализировать трафик, а не просто транслировать его.
Современный контекст: IPv6 и Cloud
IPv6: Адресов хватит на всех. Классический NAT для экономии не нужен. Здесь используется прямое взаимодействие, а безопасность обеспечивается Stateful Firewall’ом.
Однако есть исключения: NAT64 используется, чтобы клиенты в IPv6-сети могли ходить на старые IPv4-серверы.
- Cloud NAT (AWS NAT Gateway, Azure NAT): Используется для доступа частных поднетей к интернету без присвоения им публичных IP. Это снижает поверхность атаки.
- Kubernetes (kube-proxy): Сервисы типа
ClusterIPиNodePortиспользуют механизмы iptables/IPVS для реализации DNAT/SNAT при балансировке трафика между подами. - IPv6 и Privacy: Даже в IPv6 используется NPTv6 (Network Prefix Translation) для сокрытия внутренней топологии или смены провайдера без ре нумерации сети, хотя это и не рекомендуется стандартами без веских причин.
✅ Чек-лист инженера при настройке NAT
Перед внедрением правил трансляции проверьте следующие пункты:
- Тип трансляции: Достаточно ли PAT или требуется Static 1:1 для сервисов?
- Лимиты Conntrack: Хватит ли памяти под пиковую нагрузку (пиковые соединения)?
- Таймауты: Настроены ли корректные таймауты для UDP/ICMP, чтобы не забивать таблицу «мертвыми» сессиями?
- Протоколы: Используется ли SIP/FTP? Требуется ли включение ALG или переход на пассивный режим?
- Hairpin NAT: Поддерживает ли роутер обращение внутренних клиентов к серверу через его же публичный IP (NAT Loopback)?
- Логирование: Включен ли лог транслированных соединений для расследования инцидентов?
Шпаргалка для диагностики (Linux)
Посмотреть текущие трансляции (conntrack):
bash
# Показать все SNAT/DNAT сессии
conntrack -L
# Посмотреть статистику (сколько соединений, переполнения)
conntrack -S
# Отслеживать новые NAT-соединения в реальном времени
conntrack -E
Посмотреть правила NAT (iptables):
bash
# SNAT (POSTROUTING)
iptables -t nat -L POSTROUTING -n -v
# DNAT (PREROUTING)
iptables -t nat -L PREROUTING -n -v
Итог: Что нужно вынести
- Для начинающих: NAT — это механизм подмены адресов, который экономит публичные IP и прячет вашу сеть. Бывает SNAT (мы идем наружу) и DNAT (к нам стучатся).
- Для сисадминов: NAT — это stateful-процесс, требующий ресурсов CPU и памяти. Следите за размером таблицы
conntrackи помните про ALG для «сломанных» протоколов. - Для архитекторов: В новых системах старайтесь уходить от зависимостей от NAT (используйте IPv6, Service Mesh), но понимайте, что на границе с интернетом он останется стандартом еще минимум 10 лет.
FAQ (Частые вопросы)
В: В чем принципиальная разница между NAT и Firewall? О: NAT изменяет адреса в заголовках пакетов для маршрутизации. Firewall фильтрует пакеты на основе правил доступа (ACL). Часто они объединены в одном устройстве, но выполняют разные функции.
В: Почему падает скорость при включении NAT на старом роутере? О: Программный NAT нагружает центральный процессор пересчетом контрольных сумм и ведением таблицы состояний. Решение — использование роутеров с аппаратным ускорением (NAT Offloading).
В: Можно ли полностью отказаться от NAT? О: В чистых сетях IPv6 — да. Каждое устройство может иметь публичный адрес. Однако для защиты рекомендуется использовать Stateful Firewall, который отслеживает состояния соединений аналогично NAT, но без подмены адресов.
В: Что такое Hairpin NAT (NAT Loopback)? О: Это возможность обращения внутренних клиентов к внутреннему серверу через его публичный IP-адрес. Требует специальной поддержки на маршрутизаторе, иначе пакет уйдет во внешнюю сеть и вернется обратно, создавая петлю или отбрасываясь.