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)

  1. Перехват: Пакет от внутреннего клиента (192.168.1.10) попадает на шлюз.
  2. Сверка правил: Ядро сети проверяет таблицу NAT (например, POSTROUTING в iptables).
  3. Подмена адресов:
    • Source IP: Меняется с частного на публичный IP шлюза.
    • Source Port: При использовании PAT (Port Address Translation) порт заменяется на свободный ephemeral порт шлюза.
  4. Пересчет контрольных сумм (Checksums): Так как заголовок изменился, CRC-суммы IP и TCP/UDP должны быть пересчитаны. Это создает нагрузку на CPU.
  5. Запись состояния (Conntrack): В таблицу состояний записывается маппинг: 192.168.1.10:54321 <-> 203.0.113.1:12345
  6. Маршрутизация: Пакет уходит во внешнюю сеть.

Алгоритм входящего ответа (Inbound / DNAT)

  1. Поиск в Conntrack: Шлюз получает ответ на 203.0.113.1:12345.
  2. Обратная трансляция: Находит запись в таблице состояний и подменяет Destination IP/Port на внутренние (192.168.1.10:54321).
  3. Доставка: Пакет направляется в локальную сеть.

Типы NAT: От 1:1 до Many:Many

Для начинающих это классификация, для опытных — архитектурные решения.

Схема работы Network Address Translation: преобразование частных IP-адресов в публичные на границе сети
Тип 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:40001
    • 192.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.
Что происходит с пакетом:

  1. Прерывание от сетевой карты.
  2. Поиск в таблице conntrack.
  3. Изменение заголовков.
  4. Пересчет контрольных сумм.
  5. Отправка.

На скоростях 1 Гбит/с это незаметно. На 10 Гбит/с и выше — софтовый NAT может не успевать.
Аппаратные решения:

  • ASIC (Cisco, Juniper): Трансляция происходит «в железе», не нагружая общий процессор.
  • FastPath (MikroTik, Linux): Первый пакет соединения обрабатывается медленно (через CPU), а остальные летят по быстрому пути.

NAT и безопасность: Случайный союзник

Часто считают, что NAT — это файрвол. Это не так. NAT не блокирует трафик, он его преобразует. Однако он дает косвенный эффект безопасности:

  • По умолчанию, если соединение изнутри не было инициировано, то ответ снаружи «не пробьется» — просто потому, что для него нет записи в conntrack.
  • Внутренняя структура сети скрыта.

Но настоящий файрвол должен анализировать трафик, а не просто транслировать его.

Современный контекст: IPv6 и Cloud

IPv6: Адресов хватит на всех. Классический NAT для экономии не нужен. Здесь используется прямое взаимодействие, а безопасность обеспечивается Stateful Firewall’ом.
Однако есть исключения: NAT64 используется, чтобы клиенты в IPv6-сети могли ходить на старые IPv4-серверы.

  1. Cloud NAT (AWS NAT Gateway, Azure NAT): Используется для доступа частных поднетей к интернету без присвоения им публичных IP. Это снижает поверхность атаки.
  2. Kubernetes (kube-proxy): Сервисы типа ClusterIP и NodePort используют механизмы iptables/IPVS для реализации DNAT/SNAT при балансировке трафика между подами.
  3. 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

Итог: Что нужно вынести

  1. Для начинающих: NAT — это механизм подмены адресов, который экономит публичные IP и прячет вашу сеть. Бывает SNAT (мы идем наружу) и DNAT (к нам стучатся).
  2. Для сисадминов: NAT — это stateful-процесс, требующий ресурсов CPU и памяти. Следите за размером таблицы conntrack и помните про ALG для «сломанных» протоколов.
  3. Для архитекторов: В новых системах старайтесь уходить от зависимостей от 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-адрес. Требует специальной поддержки на маршрутизаторе, иначе пакет уйдет во внешнюю сеть и вернется обратно, создавая петлю или отбрасываясь.