Настройка файрвола с помощью iptables

iptables — это утилита для настройки файрвола netfilter в дистрибутивах Linux, которая предустанавливается по умолчанию во все сборки Linux, начиная с версии 2.4. Есть она и в операционной системе для роутеров OpenWrt, основанной на ядре Linux. Как и все файрволы, iptables оперирует некими правилами (rules), на основании которых решается судьба пакета, который поступил на интерфейс сетевого устройства (роутера). Каждое правило в iptables состоит из критерия (условие, под которое должны подпадать параметры пакета или текущее соединение, чтобы сработало действие), действия (операция, которую нужно проделать с пакетом или соединением) и счётчика (считает сколько пакетов было подвержено действию правила).

Набор правил формируется в цепочки (chains). Таблицы (tables) — это набор базовых и пользовательских цепочек.

Задача настройки файрвола сводится к тому, чтобы понимать, откуда куда перемещается пакет (что является source и destination), а также понимать, какие цепочки есть в каких таблицах. Для этого обратите внимание на порядок прохождения пакетов.

Таблица 1. Порядок прохождения FORWARD пакетов

ШагТаблицаЦепочкаПримечание
1Кабель (т.е. Интернет)
2Сетевой интерфейс (например, eth0)
3ManglePREROUTINGОбычно эта цепочка используется для внесения изменений в заголовок пакета, например для изменения битов TOS и пр...
4NatPREROUTINGЭта цепочка используется для трансляции сетевых адресов (Destination Network Address Translation). Source Network Address Translation выполняется позднее, в другой цепочке. Любого рода фильтрация в этой цепочке может производиться только в исключительных случаях
5Принятие решения о дальнейшей маршрутизации, т.е. в этой точке решается куда пойдет пакет – локальному приложению или на другой узел сети.
6FilterFORWARDВ цепочку FORWARD попадают только те пакеты, которые идут на другой хост Вся фильтрация транзитного трафика должна выполняться здесь. Не забывайте, что через эту цепочку проходит траффик в обоих направлениях, обязательно учитывайте это обстоятельство при написании правил фильтрации.
7MangleFORWARDДалее пакет попадает в цепочку FORWARD> таблицы mangle, которая должна использоваться только в исключительных случаях, когда необходимо внести некоторые изменения в заголовок пакета между двумя точками принятия решения о маршрутизации.
8Принятие решения о дальнейшей маршрутизации, т.е. в этой точке, к примеру, решается на какой интерфейс пойдет пакет.
9NatPOSTROUTINGЭта цепочка предназначена в первую очередь для Source Network Address Translation. Не используйте ее для фильтрации без особой на то необходимости. Здесь же выполняется и маскировка (Masquerading).
10ManglePOSTROUTINGЭта цепочка предназначена для внесения изменений в заголовок пакета уже после того как принято последнее решение о маршрутизации.
11Выходной сетевой интерфейс (например, eth1).
12Кабель (пусть будет LAN).

Внимание: цепочку FORWARD проходят ВСЕ пакеты, которые движутся через наш firewall/роутер. Не используйте цепочку INPUT для фильтрации транзитных пакетов, они туда просто не попадают! Через эту цепочку движутся только те пакеты, которые предназначены данному хосту (роутеру). В первой точке принятия решения о маршрутизации (routing decision) все пакеты, предназначенные данному хосту направляются в цепочку INPUT, остальные – в цепочку FORWARD.

Таблица 2. Порядок движения INPUT пакетов

ШагТаблицаЦепочкаПримечаниеt
1Кабель (т.е. Интернет)
2Входной сетевой интерфейс (например, eth0)
3ManglePREROUTINGОбычно используется для внесения изменений в заголовок пакета, например для установки битов TOS и пр.
4NatPREROUTINGПреобразование адресов (Destination Network Address Translation). Фильтрация пакетов здесь допускается только в исключительных случаях.
5Принятие решения о маршрутизации.
6MangleINPUTПакет попадает в цепочку INPUT таблицы mangle. Здесь внесятся изменения в заголовок пакета перед тем как он будет передан локальному приложению.
7FilterINPUTЗдесь производится фильтрация входящего трафика. Помните, что все входящие пакеты, адресованные нам, проходят через эту цепочку, независимо от того с какого интерфейса они поступили.
8Локальный процесс/приложение

СИНТАКСИС IPTABLES

В iptables очень богатый синтаксис правил. Полный список ключей и параметров вы можете найти в официальном гайде на iptables.org. Общий синтаксис таков:

iptables -t TABLE_NAME -<chain_action> CHAIN_NAME -i INTERFACE_NAME -p PROTOCOL_NAME -s SOURCE_IP --dport DESTINATION_PORT -j PACKET_ACTION

Если не указывается таблица, то умолчанию таблица - filter. Для явного указания таблицы нужно перед указанием цепочки ввести ключ -t или (--table).

Для удобства, в iptables реализовано очень много сокращений для разных ключей. Например, мы писали ключ -A вместо полного --append-p вместо полного --proto и -s вместо полного --source.

Начнём с команд для редактирования правил и цепочек – добавления, удаления, замены и так далее:

короткосинтаксис правилаприменение
-A--append {цепочка правила}добавить правило к цепочке (в самое начало)
-D--delete {цепочка правила}удалить правило из цепочки
-D--delete {номер правила в цепочке}удалить правило из цепочки по номеру (1 — x)
-I--insert {номер правила вцепочке}вставить правило в цепочку по номеру (1 — x)
-R--replace {номер правила вцепочке}заменить правило в цепочке по номеру (1 — x)
-X--delete-chain {цепочка}удалить цепочку (только для пользовательских)
-E--rename-chain {старое имя цепочки} {новое имя цепочки}переименовать цепочку
-N--new {имя цепочки}создание новой пользовательской цепочки
-C--check {правило цепочки}проверит наличие правила в цепочке
-F--flush {цепочка}удаляет все правила в цепочке, если цепочка не указана – удалятся все правила
-Z--zero {цепочка} {номер правила вцепочке}обнуляет все счётчики пакетов и байтов в цепочке или всех цепочках
-P--policy {цепочка} {номер правила вцепочке}изменяет политику по умолчанию, она должна основываться на встроенном target’e {ACCEPT, DROP, QUEUE}

Продолжим синтаксисом настройки правил – на каком сетевом интерфейсе следить за пакетами, какой протокол проверять, адрес источника, назначения и так далее.

Кстати, перед некоторыми параметрами можно ставить восклицательный знак - !, означающее логическое НЕ. В таблице мы пометим такие параметры таким значком – (!)

короткосинтаксис опцииприменение
-p(!) --proto {протокол}протокол {tcp, udp, udplite, icmp, esp, ah, sctp} или номер протокола {16,7}, all — все протоколы
-4--ipv4указывает версию протокола ipv4
-6--ipv6указывает версию протокола ipv6
-s(!) --source {адрес/маска}указывает ip адрес источника
-d(!) --destination {адрес/маска}указывает ip адрес назначения
-m--matchвключает дополнительные модули, явно задающимися данным ключем. например <code>m limit --limit 3/min</code> — установит лимит на количество пакетов в минуту
-f(!) --fragmentвключает обработку фрагментированных пакетов, в которых нет параметров изначального полного пакета, содержащихся в первом фрагменте пакета
-i(!) --in-interface {имя интерфейса}обрабатывает только входящие пакеты, прилетающие на сетевой интерфейс {имя интерфейса}
-o(!) --out-interface {имя интерфейса}обрабатывает только исходящие пакеты, прилетающие на сетевой интерфейс {имя интерфейса}
--set-counters {пакеты} {байты}включает счётчик для ключей--insert, --append, --replace

Теперь рассмотрим опции для действий, которые должны сработать по совпадению критериев:

короткосинтаксис опцииприменение
-j--jump {действие}применяет одно из действий accept, drop, reject и другие
-g--goto {цепочка}переходит к другой цепочке правил

Просмотр текущих правил в iptables

Теперь рассмотрим какую информацию мы можем вытянуть с помощью iptables и какие опции для этого нужно использовать:

короткосинтаксис командыприменение
-l--list {цепочка} {номер правила}показывает правила в цепочке или всех цепочках. по умолчанию покажет таблицу filter
-s--list-rules{цепочка} {номер правила}показывает текст правила в цепочке или всех цепочках
-n--numericпокажет параметры правила в числовом виде. например не порт будет не http, а 80
-v--verboseвыводит более подробную информацию
-v--versionпокажет версию iptables
-x--exactпокажет точные значения числовых параметров
--line-numbersпокажет номера правил

Для быстрого получения информации о настроенных правилах и о метриках их срабатывания, часто применяется команда, комбинирующая 3 ключа - iptables -nLv.

Пример настройки порт форвардинга 80 порта с интерфейса enp0s3 на виртуальный сервер 192.168.2.19:

iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 80 -j DNAT --to 192.168.2.19:80

Был ли наш пост полезен?

Нажмите на звезду, чтобы оценить мои труды!

Средний рейтинг: 1 / 5. Количество голосов: 1

Пока голосов нет. Проголосуй первым!

Мне жаль, что пост вам не помог 🙁

Позвольте мне исправиться.

Поделитесь, что можно улучшить?

Похожие посты