Что это такое?
Это настройка правил NAT (Network Address Translation, преобразование сетевых адресов). Или, точнее говоря, NAPT — Network Address and Port Translation.
Зачем это нужно?
- Для сопряжения сегментов сетей с несогласованными пространствами адресов и номерами портов (например, при интеграции готовой сети в более масштабное решение). Так оно было задумано.
- Для замены маршрутизации в случаях, когда нет возможности указать на вышестоящем шлюзе маршрут в сеть, находящуюся за вашим маршрутизатором. При использовании NAT вся сеть, скрытая за вашим маршрутизатором, представляется одним его внешним адресом (или, максимум, несколькими). Вышестоящему шлюзу достаточно знать только маршрут на этот адрес — а он всегда известен, иначе вы бы вообще не имели доступа к вышестоящим сетям. Так оно получилось.
- Для некоторой эфемерной степени безопасности. NAT скрывает структуру внутренней сети от внешнего мира и тем самым немного осложняет задачу злоумышленника, имеющего своей целью проникнуть в эту сеть. Так оно считается.
- Чтобы откосить от внедрения протокола IPv6. Как известно, IPv4 писался тогда, когда вас, коллега, ещё не было, скорее всего, на этом свете — да и компьютеров тоже столько не было. Поэтому авторы заложили в него смехотворно малое число возможных адресов — всего лишь 232=4294967296 штук. (Но в то время, в начале заключительной четверти XX века н.э., это было
до очень много.) Применение NAT, по существу, заменяет IP-адрес, как уникальный и исчерпывающий идентификатор хоста, уникальной совокупностью IP-адреса и номера порта TCP или UDP. Таким образом, 32-битное поле IP-адреса расширяется ещё на 16 бит (или немного меньше) за счёт поля номера порта, и это позволяет иметь во всём мире до 281474976710656 хостов. На каждый интеллектуальный утюг, каждый оруэлловский телескрин и каждую дистанционно управляемую кормушку для котов, возможно, когда-нибудь не хватит, но пока что человечество вроде бы кое-как обходится... криво, коряво, зато привычно. Так оно применяется на самом деле.
Как это настроить?
Функция NAT в ОС Linux является частным случаем механизма netfilter, работающего в ядре Linux. Настройка этого механизма производится с помощью утилиты iptables. Узлы nat
, filter
, mangle
и raw
конфигурационного дерева NSG являются оболочкой к данной утилите. Подробно обо всех их возможностях и настройках см. первоисточник, т.е. man pages по iptables в оригинале. Настоятельно рекомендуется ознакомиться с этим документом хотя бы по диагонали, чтобы получить представление об общей структуре настроек.
Говоря коротко, настройка iptables производится в виде таблиц с именами nat
, filter
mangle
и raw
, соответственно. Каждая таблица состоит из цепочек последовательно выполняемых правил. На разных этапах обработки пакета в системе используются различные предопределённые цепочки и, кроме того, пользователь может создавать и подключать свои собственные цепочки по своему усмотрению.
ПРИМЕЧАНИЕ. Многие действия (например, уничтожение пакета) могут, вообще говоря, выполняться в схожих цепочках, принадлежащих к разным таблицам. Однако для правильного понимания конфигурации принято разделять их по существу: преобразования адресов и портов — в таблицу nat
, уничтожение или не уничтожение (а также подсчёт) пакетов — в таблицу filter
, всё прочее — в mangle
. Как минимум, это помогает избежать человеческих ошибок. Извращённые ситуации, когда требуется выполнять эти операции в ином порядке, нежели указано на схеме, теоретически возможны, но на практике крайне редки.
Механизм NAT в устройствах NSG включает в себя следующие цепочки:
PREROUTING
- Преобразования, выполняемые до маршрутизации пакета (как входящего локально, так и транзитного). Наиболее частым из таких преобразований является замена адреса и порта назначения — Destination NAT (DNAT), известное также как проброс портов или виртуальные сервера.
POSTROUTING
- Преобразования, выполняемые после маршрутизации транзитного пакета. Наиболее частые преобразования — это замена адреса и порта источника: статическая (Source NAT, SNAT) или динамическая (MASQUERADING). Именно последнее, выполняемое на внешнем интерфейсе, имеется в виду под тем NAT, который на простых бытовых маршрутизаторах включается единственной галочкой безо всяких настроек.
OUTPUT
- Преобразования, выполняемые после маршрутизации исходящего пакета, т.е. сгенерированного локально на данном устройстве. Эти правила могут отличаться от правил для транзитных пакетов, или не требоваться вообще.
UPnP
- Преобразования DNAT, автоматически сформированные при работе службы UPnP. Вызываются из цепочки
PREROUTING
; если пакет не подпадает под эти правила, то он возвращается на обработку обратно в PREROUTING
.
- Пользовательские цепочки
- Эти цепочки подключаются к одной из 3 предопределённых цепочек. Для перехода между цепочками используются правила, в которых в качестве действия указано имя новой цепочки или
RETURN
. Для добавления цепочек используйте команды +
, _new
или _insert
. Данный список является именованным и не упорядочивается автоматически. Для удаления используйте команду -
или _remove
.
При описании узлов nat
, filter
и mangle
в данном справочном руководстве используются следующие понятия:
- Внешняя сеть — Интернет или другая общая сеть, подчиняющаяся глобальным правилам назначения IP-адресов. При этом Интернет всегда использует реальные (публичные, "белые") IP-адреса.
- Внутренняя сеть — частный сегмент сети, адреса в котором не соответствуют общей адресной схеме внешней сети. Пакеты с такими адресами не должны циркулировать в общей сети. Например, одни и те же адреса могут использоваться многократно в разных сегменах, скрытых за NAT на своих выходных маршрутизаторах. Как правило, для этой цели используются адреса из диапазонов 10.0.0.0/8, 172.16.0.0/12 и 192.168.0.0/16, специально выделенных для этой цели (приватные, или "серые" адреса).
- Внешний интерфейс — интерфейс вашего маршрутизатора, подключённый к внешней сети.
- Внутренний интерфейс — интерфейс вашего маршрутизатора, подключённый к внутренней сети.
ВНИМАНИЕ! Механизмы nat
, filter
, mangle
и raw
, как и правила маршрутизации, относятся к самой сущности IP-маршрутизатора как целого и работают в тесной связи друг с другом, а также с процедурами IP-маршрутизации и IPsec. Именно по этой причине они настраиваются на уровне системы в целом, а не на уровне интерфейсов по отдельности. (Последнее возможно только для простейших бытовых маршрутизаторов, у которых заранее жёстко определены как роль каждого интерфейса, так и возможные преобразования.)
Чтобы ограничить действие правила одним интерфейсом, необходимо и достаточно указать этот интерфейс в критериях для анализа пакетов.
Некоторые сложные прикладные протоколы используют одновременно несколько портов TCP или UDP. К таковым относится, например, FTP. Для этих протоколов необходимо включить дополнительные механизмы — HELPERS
, отслеживающие связь между этими портами. Вспомогательные механизмы нужны также для некоторых протоколов, имеющих другие специфические особенности, которые необходимо учитывать в работе алгоритмов NAT. В сложных случаях (например, при работе таких протоколов не на стандарных для них портах) настройку таких механизмов требуется производить вручную в таблице raw
.
Об отдельных аспектах применения NAT см. справку ниже:
Потоки трафика
NAT и резервирование маршрутов
Упрощённая настройка NAT для отдельных типов интерфейсов NSG
Автоматическая настройка NAT с помощью UPnP
NAT и туннели IPsec
NAT и полезная нагрузка туннелей IPsec
ФАК, или Часто Задаваемые Вопросы
Примеры конфигурации
Что делать, если это не работает?
- Смотреть правила NAT, фактически созданные в соответствии с вашей конфигурацией, и статистику их срабатывания.
- Смотреть входящий и исходящий трафик на интерфейсах при помощи утилиты
tcpdump
. Изменены ли их адреса и порты в соответствии с вашими намерениями?
Если интересующие вас пакеты не видны на тех интерфейсах, где они должны быть — смотрите на других, возможно, они NAT-ируются не так и маршрутизируются не туда. А возможно, уничтожаются вашими фильтрами. Обратите внимание на последовательность применения NAT и фильтров (см. схему выше).