NetLab Academy

Сетевые лаборатории в браузере

Войти Начать бесплатно

Теория: NAT — трансляция сетевых адресов

Static NAT, Dynamic NAT и PAT (NAT Overload), SNAT и DNAT — как приватные адреса выходят в интернет и как снаружи попадают внутрь. Прочитайте материал, а затем пройдите тест — следующий пункт курса откроется после верных ответов.

Зачем нужен NAT

Адресов IPv4 физически не хватает на все устройства мира — их всего около 4.3 миллиарда (32 бита), а одних только смартфонов на планете больше. NAT (Network Address Translation), описанный в RFC 1631 ещё в 1994 году как временная заплатка перед переходом на IPv6, оказался настолько удобным, что пережил все прогнозы и до сих пор остаётся базовым механизмом почти любой сети. Он позволяет многим устройствам с приватными адресами (см. тему про IP-адресацию) делить один или несколько публичных IP-адресов при выходе в интернет. Побочный эффект — внутренняя структура сети не видна снаружи напрямую, что даёт небольшой бонус к безопасности, хотя NAT — не файрвол и не должен восприниматься как полноценная замена ему: NAT просто транслирует адреса, а не анализирует и не блокирует трафик по содержимому.

Static NAT

Static NAT — фиксированное соответствие 1:1 между одним внутренним и одним внешним адресом, прописанное вручную и постоянное: например, 192.168.1.10 всегда транслируется в 203.0.113.5 и никогда иначе. Используется, когда нужно, чтобы конкретный внутренний сервер был всегда доступен снаружи по одному и тому же публичному адресу — например, веб-сервер или почтовый сервер, на которые входящие соединения должны попадать предсказуемо, без необходимости каждый раз заново настраивать правила.

Dynamic NAT

Dynamic NAT — соответствие многих внутренних адресов пулу внешних адресов, но всё ещё 1:1 в каждый конкретный момент времени: первому обратившемуся внутреннему хосту достаётся первый свободный внешний адрес из пула, второму — второй, и так далее. Если пул внешних адресов меньше количества внутренних хостов, которым одновременно нужен выход — кому-то адреса просто не хватит, и соединение не установится, пока кто-то другой не освободит занятый адрес. Сегодня используется редко именно из-за этого ограничения — почти всегда выбирают PAT (см. ниже), который решает проблему нехватки адресов принципиально иначе.

PAT / NAT Overload — самый распространённый вариант

PAT (Port Address Translation), он же NAT Overload — то, что используется в подавляющем большинстве домашних роутеров и офисных сетей. Множество внутренних адресов делят один внешний IP, а различаются они не по IP, а по номеру порта. Конкретный пример: внутренний хост 192.168.1.10 открывает соединение с локального порта 54321 к веб-серверу — на выходе роутер подменяет адрес источника на свой публичный 203.0.113.5 и порт источника на, скажем, 33001 (выбранный роутером из свободных), и записывает в таблицу трансляций пару 192.168.1.10:54321 ↔ 203.0.113.5:33001. Когда ответ приходит на 203.0.113.5:33001, роутер смотрит в таблицу и точно знает, что это предназначено внутреннему хосту 192.168.1.10:54321, и перенаправляет ответ туда. Поскольку номер порта — это 16 бит (0–65535), теоретически на одном публичном IP можно обслужить порядка 64 тысяч одновременных сессий — а на практике обычно немного меньше, потому что часть портов зарезервирована или используется самим устройством.
Таблица трансляций: запись создаётся на выходе и находится на входе
ПК192.168.1.10
РоутерPAT
Веб-сервер93.184.216.34
что написано в заголовке пакета на этом участке
внутренний адрес:портвнешний адрес:порт
Адреса и порты — из текста темы, раздел про PAT. Порт источника роутер выбирает сам из свободных; всего их 65 536, поэтому за одним внешним адресом живут десятки тысяч сессий одновременно.

Терминология: inside/outside, local/global

Классическая (Cisco-style) терминология NAT описывает 4 типа адресов: Inside local — реальный приватный адрес устройства внутри сети (то, что устройство видит само про себя). Inside global — как это устройство выглядит снаружи, уже после трансляции (то, что видит внешний мир). Outside local/global — аналогичная пара адресов, но со стороны внешнего хоста (почти всегда совпадают, если внешний хост не находится за своим собственным NAT — а в случае с CGNAT, разобранным ниже, может и не совпадать). Вся эта связка адресов и портов хранится в NAT translation table (на Linux это знакомо как conntrack — таблица отслеживания соединений), и именно размер этой таблицы и скорость поиска в ней определяют, сколько одновременных сессий способно обслужить конкретное устройство.

SNAT и DNAT — что именно переписывается

Static NAT, Dynamic NAT и PAT отвечают на вопрос «откуда берётся внешний адрес». Есть второй вопрос, независимый от первого: какую часть заголовка роутер переписывает. Ответов ровно два, и у каждого своё имя.

SNAT (Source NAT) — подменяется адрес источника. Пакет идёт изнутри наружу, роутер ставит в поле отправителя свой публичный адрес, и внешний сервер отвечает уже ему. Всё, что разобрано выше — Static NAT для исходящих, Dynamic NAT, PAT — разновидности SNAT, различаются они только тем, как выбирается подставляемый адрес. Частный случай SNAT — masquerade: внешний адрес не задан заранее, а берётся с исходящего интерфейса в момент отправки. Так удобно, когда провайдер выдаёт адрес динамически и прописать его в конфиге заранее просто нечем.

DNAT (Destination NAT) — подменяется адрес назначения. Пакет приходит снаружи на публичный адрес, роутер переписывает поле получателя на внутренний адрес сервера и отправляет пакет в локальную сеть. Port forwarding, о котором речь ниже, — это и есть DNAT: правило «всё, что пришло на 203.0.113.5:80, отдать 192.168.1.10:80». Виртуальный адрес балансировщика нагрузки устроен так же.

Мнемоника простая: SNAT правит того, кто пришёл, DNAT — того, куда пришли. SNAT нужен, чтобы выйти наружу; DNAT — чтобы снаружи попали к вам.

Названия зависят от вендора. Cisco говорит ip nat inside source и ip nat outside source, где слово source указывает на направление трансляции относительно интерфейсов inside и outside. Большинство остальных вендоров и вся линуксовая экосистема называют операции прямо — SNAT и DNAT. Смысл один и тот же, а в документации и на собеседованиях встречаются обе пары слов, поэтому знать нужно обе.

Когда SNAT и DNAT встречаются вместе

Отсюда видна разница между Static NAT и PAT, которая иначе выглядит произвольной. Static NAT (ip nat inside source static 192.168.1.10 203.0.113.5) работает в обе стороны сразу: исходящим пакетам делает SNAT, входящим на 203.0.113.5 — DNAT. PAT даёт только исходящее направление, потому что записи в таблице трансляций рождаются в момент выхода наружу. Поэтому для входящих соединений правило DNAT приходится добавлять руками — это и есть port forwarding.

Бывает и так, что оба вида срабатывают на одном пакете. Классический пример — hairpin NAT (он же NAT loopback): внутренний компьютер обращается к своему же серверу не по внутреннему адресу, а по публичному. Роутер делает DNAT и разворачивает пакет обратно в локальную сеть, но одного DNAT мало: сервер увидит в отправителе соседа по своей же подсети и ответит ему напрямую, минуя роутер. Клиент такой ответ отбросит — он ждал его от 203.0.113.5, а пришёл он от 192.168.1.10. Поэтому роутер добавляет к DNAT ещё и SNAT, подставляя в отправители себя, и ответ возвращается тем же путём, каким пришёл запрос.

Проблемы, которые создаёт NAT

NAT ломает симметрию связи по своей природе: внутренний хост может инициировать соединение наружу совершенно свободно, потому что в момент выхода создаётся запись в таблице трансляций. А вот внешний хост не может сам «достучаться» внутрь без явной настройки — для него снаружи просто не существует никакой записи, на основе которой роутер мог бы понять, какому внутреннему адресу адресован незапрошенный входящий пакет. Решение — port forwarding, то самое правило DNAT из предыдущего раздела: статическое правило «весь входящий трафик на такой-то порт публичного адреса всегда перенаправлять на такой-то внутренний хост и порт», заранее настроенное администратором, а не возникающее динамически.

Отдельная категория проблем — протоколы, которые встраивают IP-адреса и номера портов прямо в данные приложения, а не только в заголовки пакетов: классический пример — активный режим FTP, где клиент сообщает серверу, на какой IP и порт ему открыть обратное соединение для передачи данных, прямо внутри текста команды протокола. NAT-устройство, которое не понимает FTP, просто не сможет правильно подставить актуальный транслированный адрес в эту встроенную информацию — отсюда необходимость в ALG (Application Layer Gateway), специальном модуле NAT-устройства, который разбирает конкретный протокол приложения и подменяет адреса не только в заголовках, но и в самих данных. Для голосовых и видеозвонков (где похожая проблема обмена адресами встроена в сигнальный протокол SIP) задачу NAT traversal решают протоколы STUN (узнать свой публичный адрес и порт со стороны), TURN (релей трафика через промежуточный сервер, если прямое соединение невозможно) и ICE (общая методология, перебирающая разные способы установить прямое соединение, прежде чем прибегать к TURN как к последнему варианту).

CGNAT — когда NAT появляется ещё и у провайдера

CGNAT (Carrier-Grade NAT) — NAT уровня интернет-провайдера, применяемый, когда у самого провайдера не хватает публичных IPv4-адресов на всех своих абонентов. В этом случае получается NAT внутри NAT: домашний роутер транслирует приватные адреса устройств в доме в один «домашний» адрес, который на самом деле тоже приватный (часто из специально зарезервированного для этой цели диапазона 100.64.0.0/10, описанного в RFC 6598) — а затем провайдер транслирует уже этот адрес в настоящий публичный адрес, общий для множества абонентов одновременно.

Практическое следствие для конечного пользователя — входящие соединения (port forwarding, проброс портов для игр или личного сервера) либо не работают вообще, либо работают через дополнительные ограничения провайдера, потому что один и тот же публичный адрес и диапазон портов теперь делят между собой сразу несколько разных абонентов, а не одна домашняя сеть.

Как проверять / частые ошибки

show ip nat translations — посмотреть текущие активные трансляции, включая конкретные пары inside local/global и outside local/global. show ip nat statistics — общую статистику использования, включая число активных трансляций и попаданий в каждое правило. Частые проблемы: исчерпание портов при огромном количестве одновременных сессий через PAT (port exhaustion — особенно заметно на загруженных корпоративных шлюзах с сотнями пользователей за одним публичным адресом); несимметричная маршрутизация, когда трафик уходит через один NAT-узел, а возвращается через другой, и таблица трансляций на возвратном пути просто не содержит нужной записи; забытое правило port forwarding для сервиса, который должен быть доступен снаружи, но почему-то недоступен, хотя внутри сети всё работает прекрасно.

Команды настройки — шпаргалка

# пометить роли интерфейсов: по ним NAT понимает направление
interface GigabitEthernet0/0
 ip nat inside                # смотрит в локальную сеть
interface GigabitEthernet0/1
 ip nat outside               # смотрит к провайдеру

# какой внутренний трафик подлежит трансляции
access-list 1 permit 192.168.1.0 0.0.0.255
                              # 1 — номер списка, на него сошлёмся ниже;
                              #   затем сеть; затем WILDCARD-маска, а не обычная:
                              #   нули значат «бит должен совпасть», единицы —
                              #   «любой». Она зеркальна привычной 255.255.255.0

# PAT (NAT Overload): много хостов за одним адресом
ip nat inside source list 1 interface GigabitEthernet0/1 overload
                              # inside source — подменяем адрес ОТПРАВИТЕЛЯ
                              #   у пакетов изнутри наружу; list 1 — кого именно,
                              #   ссылка на ACL выше; interface Gi0/1 — во что,
                              #   берём адрес прямо с внешнего порта;
                              #   overload — разрешить многим делить этот адрес,
                              #   различая сессии по номерам портов

# Static NAT: жёсткая пара адресов, работает в обе стороны
ip nat inside source static 192.168.1.10 203.0.113.5
                              # static вместо list: сначала внутренний адрес,
                              #   затем внешний

# проброс порта: DNAT для входящих, когда наружу ходят через PAT
ip nat inside source static tcp 192.168.1.10 80 203.0.113.5 80
                              # добавились протокол и по номеру порта к каждому
                              #   адресу: внутренний адрес и его порт, затем
                              #   публичный адрес и порт, видимый снаружи.
                              #   Порты не обязаны совпадать

# проверка
show ip nat translations      # текущая таблица трансляций
show ip nat statistics        # сколько трансляций живёт и сколько попаданий
                              #   в каждое правило
Контрольные вопросы

Дальше — лабораторная работа «NAT: офис выходит в интернет»

Для неё нужен аккаунт: стенд поднимается персонально под вас — свои роутеры, свои конфиги, никто в них не мешает. Регистрация — почта и пароль.

Теория прочитана. Дальше — руками.

Личный стенд из настоящих роутеров разворачивается за секунды. Платформа проверяет не ответы на тесты, а состояние вашей сети: поднялись ли соседства, сошлись ли маршруты, ходит ли ping. Рядом — AI-наставник, который видит ваши конфиги и ведёт к решению, не выдавая готовое.

Начать бесплатно → бета открыта, доступ бесплатный