Механизм NAT: частные адреса, Basic NAT и NAPT/PAT, типы трансляций (Full Cone, Symmetric и др.), ограничения NAT и протоколы обхода (STUN, TURN).
Как NAPT/PAT позволяет множеству внутренних узлов использовать один публичный IP-адрес?
Является ли NAT средством безопасности?
Почему NAT является процессорно-интенсивной операцией?
Какой тип NAT наиболее труден для обхода при установлении прямого соединения?
Почему в IPv6 отсутствует необходимость в NAT?
Для чего используется TURN-сервер?
Концепция NAT: типы трансляций, PAT — одна тема в двух курсах
NAT64/DNS64 и NPTv6 — механизмы трансляции адресов при переходе на IPv6
Перспективы IPv4/IPv6: исчерпание адресов IPv4 напрямую связано с необходимостью NAT
В протоколе IPv4 отправлять пакеты можно только из-под того адреса, который за вами числится. Из-под чужих адресов отправлять данные нельзя. Проблема в том, что эти адреса платные — вы должны будете их покупать. А иногда хочется, чтобы какие-то узлы могли работать в сети, но без покупки этих адресов.
Есть несколько диапазонов, которыми вы можете распоряжаться в свое удовольствие, но из-под таких адресов вы не имеете права выпускать пакеты в интернет. В интернете такие адреса вообще появляться не могут.
Три наиболее известные частные сети (RFC 1918):
| Сеть | Маска |
|---|---|
10.0.0.0 |
/8 |
172.16.0.0 |
/12 |
192.168.0.0 |
/16 |
Изначально все это было классовое: одна сеть класса A, 16 сетей класса B и 256 сетей класса C. Но сейчас в бесклассовом мире это просто три диапазона. Любые адреса из этих сетей вы можете использовать как захотите — назначать на внутренние локальные узлы, которым не требуется выход в интернет, и пользоваться сетью в свое удовольствие. Но без выхода в интернет.
Есть и другие блоки, которые можно использовать без права выхода в интернет:
RFC 5737 — три блока, которые отводятся исключительно для документации. Вы не можете эти адреса использовать на реальных машинах, но можете использовать их в документации для примеров. Они выглядят как публичные, но они не публичные — чисто нарисованные.
100.64.0.0/10 (CGNAT, Carrier-Grade NAT) — сеть для провайдеров. Иногда провайдеры сами делают NAT, предоставляют доступ клиентам, а клиенты тоже делают NAT. Получается двойной NAT. Между провайдерским NAT и пользовательским NAT нужны какие-то адреса. Публичные использовать бессмысленно — зачем тогда провайдерский NAT? Частные адреса 10.0.0.0, 172.16.0.0 и 192.168.0.0 тоже использовать плохо — вдруг у клиента такие адреса? Вот для провайдерского NAT и используется специальный диапазон 100.64.0.0/10. Такие адреса тоже не надо ни с кем согласовывать, но выпускать в интернет их нельзя.
Что делать, если очень хочется в интернет с частным адресом? Придется адреса перебивать. Вы выпускаете IP-пакет из-под частного адреса, и в тот момент, когда этот пакет начинает выходить в интернет, частный адрес перебивается на публичный.
У вас есть IP-пакет, он бежит по сети. Допустим, из-под адреса 192.168.1.1 на внешний адрес 8.8.8.8. Вам нужно, чтобы во внешнем мире никаких 192.168.1.1 не было — это запрещено условиями RFC 1918. И вы перебиваете в IP-пакете адрес источника с 192.168.1.1 на, например, 203.0.113.1.
Этот процесс выполняется на маршрутизаторах параллельно с маршрутизацией. Он не зависит от процесса маршрутизации — это два независимых процесса. Иногда NAT происходит до маршрутизации, иногда после.
У каждого маршрутизатора должна быть таблица трансляции — правило, по которому адреса меняются. Должен быть хорошо известный адрес, на который вы перебиваете, и правило: такой адрес перебиваем на такой, другой — на другой.
Перебивка должна быть двусторонней:
Для приложения все должно пройти прозрачно: оно отправляет из-под своего частного адреса и получает ответы обратно на свой частный адрес. Теоретически все должно пройти гладко, но не факт — многие приложения будут страдать от того, что вы вносите изменения в пакет.
Для работы классического Basic NAT вам потребуется отдельный публичный адрес на каждый частный адрес:
| Частный адрес | Публичный адрес |
|---|---|
192.168.1.1 |
203.0.113.1 |
192.168.1.10 |
203.0.113.2 |
192.168.1.200 |
203.0.113.200 |
Почему нужен отдельный внешний адрес на каждый частный? Потому что пакеты, которые к вам приходят, нужно понимать, на какой частный адрес их перенаправить. Берете входящий пакет, смотрите: он пришел на 203.0.113.1 — ищете в табличке и находите, что этому адресу сопоставлен частный 192.168.1.1.
Сегодня Basic NAT вы увидите достаточно редко. То, что используется в подавляющем большинстве ситуаций — это другой механизм, про него чуть позже.
У Cisco используется следующая терминология. У роутера с NAT есть два адресных пространства:
| Термин | Значение |
|---|---|
| Inside Local | Адрес источника внутри сети, до трансляции |
| Inside Global | Адрес источника после трансляции (публичный) |
| Outside Local | Адрес назначения до трансляции |
| Outside Global | Адрес назначения после трансляции |
Ключевое правило:
В типичном случае (выход внутренних пользователей в интернет) правило NAT меняет Inside Local на Inside Global. Адреса Outside Local и Outside Global при этом не меняются.
Для обратных пакетов: пакет идет из Outside в Inside, адрес назначения Inside Global перебивается обратно на Inside Local.
NAT позволяет создать для внутреннего частного адреса псевдоним, под которым он виден из интернета. Это позволяет:
В Basic NAT каждому внутреннему узлу нужен отдельный внешний публичный адрес. Двум узлам один и тот же псевдоним сделать не получится.
При изменении IP-адресов в пакете возникают каскадные последствия:
Все это занимает время и загружает процессор, поэтому NAT — достаточно процессорно-интенсивная операция.
Знание того, как устроен конкретный протокол, для корректной работы через NAT, называется ALG — Application Layer Gateway. Для каждого протокола ALG свой: отдельно для FTP, отдельно для SIP и так далее.
Если конкретная модель роутера не поддерживает ALG для какого-то протокола (например, SIP), то этот протокол через NAT будет работать некорректно.
Бывают протоколы, которые за NAT вообще не работают. Например, IPsec с цифровой подписью пакетов: подпись считается в том числе от IP-адресов. Если адреса меняются, подпись портится, и восстановить ее на роутере невозможно без закрытого ключа.
NAT нарушает принцип end-to-end connectivity. Протокол IP предполагает, что если у узла есть IP-адрес, на него можно подключиться. Ситуация "у узла есть адрес, но на него нельзя подключиться" в протоколе IP не предусмотрена. ICMP тоже такое не предусматривает — он пришлет сообщение "сеть недоступна", что означает аварию.
В IPv6 NAT отсутствует. NAT — это костыль для экономии IP-адресов. В IPv6 адресов достаточно много, поэтому NAT просто не нужен. Все проблемы с приложениями, с нарушением связности edge-to-edge — в IPv6 их нет.
Чаще всего используется не Basic NAT, а NAPT — Network Address and Port Translation. Другие названия этого механизма:
Смысл один и тот же: подменяется не просто IP-адрес, а сокет — пара IP-адрес + порт.
Допустим, бежит UDP-датаграмма на 53-й порт 8.8.8.8 (DNS Google) из-под порта источника 54321. При прохождении через NAT меняется сокет: IP-адрес на публичный 203.0.113.1 и, возможно, порт на другой (например, 43210).
Главное преимущество: можно использовать один-единственный публичный адрес и пропускать через него трафик многих разных приложений, различая их по номерам портов.
Реализации NAT обычно стремятся сохранить порт источника. Например, Cisco при совпадении порта пытается назначить порт на единицу больше. Для большинства приложений перебивка порта источника не проблема.
Некоторые приложения требуют фиксированный порт источника. Например, NTP требует порт 123 и для источника, и для назначения. Если NAT перебивает порт источника (а он обязан это делать, если несколько узлов подключаются с одного порта), синхронизация времени не пройдет. Это одна из причин, почему штатная синхронизация времени в Windows иногда выдает ошибку — дело не в Microsoft, а в NAT.
Стандартного правила отслеживания активности трансляций нет. В Cisco настройка таймаутов выполняется командой:
ip nat translation timeout
Отдельные таймауты для разных типов трафика:
| Тип трафика | Особенности |
|---|---|
| DNS | Короткий таймаут, вопрос-ответ |
| TCP SYN | Отдельный маленький таймер; если SYN+ACK не пришел — трансляция убивается (около минуты) |
| TCP (установленная сессия) | Длительный таймаут (около суток); после FIN/RST — еще ~30-60 секунд |
| UDP | Сразу большой таймаут, нет понятия сессии |
| ICMP | Около 15 секунд по умолчанию |
Короткий ICMP-таймаут создает неудобство при траблшутинге: вы пингуете, бежите на Cisco смотреть show ip nat translation, а там уже пусто — трансляция истекла.
В ICMP нет номеров портов. Для пинга трансляция создается по sequence number и identification number. Для ответных ICMP-сообщений (например, Port Unreachable) умный роутер свяжет их с трансляцией UDP-датаграммы, которая породила ответ. Тупой — просто прибьет пакет.
На Cisco для обычного NAT:
Эти процессы не связаны друг с другом. Если NAT не может отработать (нет свободных адресов, нет свободных портов), пакет не убивается — он просто проходит дальше с неизмененными адресами. NAT не убивает пакеты, NAT перебивает пакеты.
Маршрутизацию никто не отменял: все маршруты должны быть правильными. Адреса, на которые вы перебиваете, должны быть такими, чтобы пакеты на эти адреса приходили на ваш роутер. Все должно быть согласовано с провайдером.
Если у вас всего один публичный адрес (который может быть даже получен по DHCP), вы можете его использовать и для собственных нужд роутера, и для трансляции клиентов. Разница — в портах. Если пакет приходит на порт, где слушает приложение роутера (например, 23-й порт для Telnet) и нет трансляции — это роутеру. Если есть трансляция на определенный порт — перебиваем.
Самый расслабленный тип. Как только клиент вышел наружу и создалась трансляция, любой внешний узел с любого IP-адреса и порта может подключиться к открытому сокету и попасть на приложение клиента. Сокет внешнего узла не проверяется по таблице трансляций.
Процедура прокусывания (создания pinhole) такого NAT — легкая и приятная.
Трансляцией может воспользоваться только тот внешний узел, IP-адрес которого совпадает с тем, на который изначально подключался клиент. Порт при этом может быть любым.
Трансляцией может воспользоваться только тот внешний узел, у которого совпадает и IP-адрес, и порт с теми, на которые изначально подключался клиент.
Самый жесткий тип. Проверяется все: порт источника, порт назначения, IP-адрес источника, IP-адрес назначения. Если хотя бы одно поле не соответствует — создается новая трансляция. Его очень тяжело прокусывать, его очень не любят телефонисты.
Во всех четырех типах NAT внутренний сокет может пользоваться трансляцией для подключения к любому внешнему узлу. Различия только в том, кто из внешних узлов может воспользоваться уже созданной трансляцией.
Встроенный в Windows Teredo-клиент (предназначен для IPv6) позволяет определить, симметричный у вас NAT или нет:
netsh interface teredo show state
STUN (Session Traversal Utilities for NAT) — протокол для определения типа NAT и прокусывания. Можно использовать публичный STUN-сервер (например, от Ooma/X-Ten: stun.ooma.net). STUN-клиент согласует с сервером параметры NAT и определит его тип.
Если NAT симметричный и прокусить его не удается, используется TURN (Traversal Using Relays around NAT) — фактически UDP-прокси. Голосовые пакеты гоняются через промежуточный сервер в публичном пространстве. Голос от этого страдает, сервер под большой нагрузкой, но за Symmetric NAT по-другому не получится.
NAT — не технология безопасности, это технология перебивки адресов. То, что многие пользуются NAT как механизмом защиты внутренней сети — в корне неправильно.
Никто не мешает злоумышленнику, если у него есть доступ к канальной среде, отправлять пакеты для маршрутизации во внутреннюю сеть. Провайдер тоже может отправить пакеты на 192.168.1.1 — NAT пропустит такие пакеты: у него нет подходящей трансляции, и пакет пройдет внутрь по обычной маршрутизации.
Для защиты лучше использовать специализированные средства — файрвол, а NAT воспринимать как приятное дополнение к системе безопасности.
Параметр Max Entries ограничивает максимальный размер таблицы трансляции. У вас может быть 65 тысяч записей на каждый IP-адрес, а IP-адресов может быть много (например, целая сеть /24).
На практике вы вряд ли упретесь в размер таблицы трансляции. NAT настолько процессорно-интенсивная операция, что упираться вы будете в процессор, который не будет успевать все перебивать. Относительно немощный роутер от достаточно небольших потоков ложится в стопроцентную загрузку.
Спасибо за внимание. Многие из разобранных тем можно дополнительно изучить на курсе ICND1 с примерами и лабораторными работами.