Для пакетной фильтрации, NAT и изменения пакетов (mangling, манглинг) OpenWrt использует netfilter, такой же как в других Linux системах. UCI — это интерфейс настройки OpenWrt, поэтому мы будем использовать в дальнейшем это сокращение.
Файрвол UCI объединяет один и более интерфейсов в специальные зоны, которые используются для для описания правил по-умолчанию для данного интерфейса, правил пересылки пакетов между интерфейсами, а также дополнительные правила, которые не подпадают под первые два типа. В конфигурационном файле правила по-умолчанию идут первыми, но вступают в силу последними. Система netfilter является системой фильтрации с последовательной обработкой, в которой пакеты последовательно, по цепочке, обрабатываются различными правилами. Первое совпавшее правило выполняется, но оно часто выполняет переход на другую цепочку правил, по которой движется пакет пока не встретит команды ACCEPT или DROP/REJECT. Правила с такими командами выполняются последними в цепочке правил, поэтому правила по-умолчанию вступят в силу последними, а более конкретные правила будут проверяться в первую очередь.
Зоны также используются для конфигурации маскарадинга, также известного как SNAT, а также для конфигурации правил переадресации портов, более известных как редирект (port forwarding , DNAT).
Конфигурация файрвола находится в файле /etc/config/firewall
. При применения настроек в силу роутер перезагружать не надо. Командой ifconfig можно посмотреть названия интерфейсов для использования в конфигурации.
Ключевые понятия файрвола iptables
iptables — это утилита для настройки межсетевого экрана linux, которая предустанавливается по умолчанию во все сборки Linux, начиная с версии 2.4. Есть она и в OpenWrt. Как и все файрволлы, iptables оперирует некими правилами (rules), на основании которых решается судьба пакета, который поступил на интерфейс сетевого устройства (роутера). Каждое правило в iptables состоит из критерия (условие, под которое должны подпадать параметры пакета или текущее соединение, чтобы сработало действие), действия (операция, которую нужно проделать с пакетом или соединением) и счётчика (считает сколько пакетов было подвержено действию правила).
Набор правил формируется в цепочки (chains). Существует 5 базовых цепочек и различаются они в зависимости от того, какое назначение имеет пакет. Имена базовых цепочек записываются в верхнем регистре.
- PREROUTING — правила в этой цепочке применяются ко всем пакетам, которые поступают на сетевой интерфейс извне;
- INPUT — применяются к пакетам, которые предназначаются для самого хоста или для локального процесса, запущенного на данном хосте. То есть не являются транзитными;
- FORWARD — правила, которые применяются к транзитным пакетам, проходящими через хост, не задерживаясь;
- OUTPUT — применяются к пакетам, которые сгенерированы самим хостом;
- POSTROUTING — применяются к пакетам, которые должны покинуть сетевой интерфейс.
В базовых цепочках обязательно устанавливается политика по умолчанию, как правило – принимать (ACCEPT) или сбрасывать (DROP) пакеты. Действует она только в цепочках INPUT, FORWARD и OUTPUT.
Таблицы — это набор базовых и пользовательских цепочек. В зависимости от того, в какой таблице находится цепочка правил, с пакетом или соединением производятся определённые действия. Существует 5 таблиц, основные из которых:
- filter — таблица, выполняющая функции фильтрации пакетов по определённым параметрам. В большинстве случаев вы будете использовать именно её. Содержит следующие встроенные цепочки: FORWARD, INPUT, OUTPUT;
- nat — таблица, предназначенная целиком по функции трансляции сетевых адресов. Содержит следующие встроенные цепочки: PREROUTING, OUTPUT, POSTROUTING;
- mangle — таблица, предназначенная для изменения различных заголовков пакета. Можно, например, изменить TTL, количество hop’ов и другое. Содержит следующие встроенные цепочки: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING;
Этот рисунок дает довольно ясное представление о порядке прохождения пакетов через различные цепочки. В первой точке принятия решения о маршрутизации (routing decision) все пакеты, предназначенные данному хосту направляются в цепочку INPUT, остальные – в цепочку FORWARD.
Обратите внимание также на тот факт, что пакеты, с адресом назначения на брандмауэр, могут претерпеть трансляцию сетевого адреса (DNAT) в цепочке PREROUTING таблицы nat и соответственно дальнейшая маршрутизация в первой точке будет выполняться в зависимости от произведенных изменений.
Наиболее используемые действия:
- ACCEPT — разрешить прохождение пакета;
- DROP — тихо выбросить пакет, не сообщая причин;
- QUEUE — отправляет пакет за пределы логики iptables, в стороннее приложение. Это может понадобиться, когда нужно обработать пакет в рамках другого процесса в другой программе;
- RETURN — остановить обработку правила и вернуться на одно правило назад. Это действие подобно break’у в языке программирования.
Помимо этих четырех, есть ещё масса других действий, которые называются расширенными (extension modules):
- REJECT — выбрасывает пакет и возвращает причину в виде ошибки, например: icmp unreachable;
- LOG — просто делает запись в логе, если пакет соответствует критериям правила;
Есть действия, которые доступны только в определенной цепочке и таблицах, например, только в таблице nat и цепочках OUTPUT и PREROUTING доступно действие DNAT, которое используется в NAT’ировании и меняет Destination IP пакета. В той же таблице, только в цепочке POSTRUNNING доступно действие SNAT, меняющее Source IP пакета.
Отдельно остановимся на действии MASQUERADE, которое делает то же самое что SNAT, только применяется на выходном интерфейсе, когда IP адрес может меняться, например, когда назначается по DHCP.
Реализация iptables в OpenWrt
Ключевое отличие — это добавление понятия зон. Зоны не могут быть использованы для конкретных сетей (подсетей), но генерируемые правила iptables
работают исключительно с пакетами на интерфейсах. Минимальная конфигурация файрвола состоит из одной из секций defaults, в котрой как минимум 2 зоны (lan
и wan
) и одно forwarding , что разрешить трафик из lan
в wan
.
Секция zone
группирует один или несколько интерфейсов, или IP-диапазонов для использования как источник — source, или назначение — destination, для пересылки трафика между интерфейсами — forwardings, создания правил — rules, и перенаправлений — redirects. Трансляция сетей (NAT — masquerading) для исходящего трафика также управляется на основе зон.
Внимание! Маскирование задаётся на интерфейсе, из которого замаскированный трафик будет исходить.
Для зоны также есть правила:
-
правило INPUT для зоны описывает, что произойдёт с трафиком, входящим в роутер через интерфейсы этой зоны.
-
правило OUTPUT для зоны описывает, что произойдёт с трафиком, исходящим от самого роутера через интерфейсы этой зоны.
-
правило FORWARD для зоны описывает, что произойдёт с трафиком, проходящим между различными интерфейсами внутри этой зоны.
Цепочку FORWARD проходят ВСЕ пакеты, которые движутся через наш firewall/роутер. Не используйте цепочку INPUT для фильтрации транзитных пакетов, они туда просто не попадают! Через эту цепочку движутся только те пакеты, которые предназначены данному хосту.
Секция forwarding
контролирует прохождение трафика между зонами и позволяет включить MSS clamping для отдельных адресов назначений (destination). В одном правиле forwarding
можно указать только одно назначение. Чтобы разрешить трафик в обе стороны между зонами необходимо создать два forwardings с src
и dest
в каждом.
Именно поэтому в таблице Filter для зон присутствуют отдельные цепочки. Эти цепочки применяются при передачи трафика между зонами. Иначе говоря, обычный трафик от клиента в Интернет и обратно не попадает в эти цепочки, он виден только в базовой цепочке FORWARD, потому что хостом назначения не является ни интерфейс lan роутера, ни wan. При необходимости, цепочка FORWARD передает обработку в цепочки zone_lan_forward, zone_wan_forward, zone_uplink_forward.
Посмотрим на цепочки зон. Например, для lan имеются: Chain zone_lan_dest_ACCEPT, Chain zone_lan_forward, Chain zone_lan_input, Chain zone_lan_output, Chain zone_lan_src_ACCEPT. Такие же цепочки есть и для других зон, например, для wan. Как видно из скриншота, все, что попадает в цепочку по правилу input_lan_rule, пересылается в цепочку zone_lan_input, где принимается (ACCEPT). А маршрутизируемый трафик из цепочки zone_lan_forward передается в цепочки зон wan и uplink (это моя кастомная зона).
Зона zone_wan_dest — это те пакеты, которые адресованы непосредственно интерфейсу wan (10.54.192.1 в данном случае), а не в интернет.
Как трафик попадает в эти цепочки? Ну допустим, вы обращаетесь к роутеру самому или делаете трассировку трафика, когда на каждом хопе destination’ом у вас являются разные хосты. На скриншоте мы сначала попадаем в lan интерфейс (192.168.2.1) на первом хопе, а потом в wan (10.54.192.1) на втором:
Также в OpenWrt присутствуют и таблицы NAT с цепочками PREROUTING, POSTROUTING и цепочками пре- и построутинга между зонами. маскарадинг осуществляется непосредственно на цепочка построутинга зон.
Настройка файрвола OpenWrt
Общие настройки зон находятся в разделе UCI: Network -> Firewall -> General Settings:
Пересадресация портов (Port forwardings, DNAT) определяются в секции redirect
. Весь входящий трафик в указанной source зоне, который подпадает под правила, будет направлен на указанный внутренний хост. Переадресация портов также известна как маппинг портов, port forwarding и virtual servers в других роутерах.
Настройка маппинга портов выпоняется в UCI в разделе Network -> Firewall -> Port Forward. По умолчанию там пусто.
Дополнительные правила вы можете посмотреть и добавить в Network -> Firewall -> Traffic Rules. Здесь, например, настраиваются правила для ICMP и IPSec трафика.