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

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

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

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

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

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

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

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

Шаг Таблица Цепочка Примечаниеt
1 Кабель (т.е. Интернет)
2 Входной сетевой интерфейс (например, eth0)
3 Mangle PREROUTING Обычно используется для внесения изменений в заголовок пакета, например для установки битов TOS и пр.
4 Nat PREROUTING Преобразование адресов (Destination Network Address Translation). Фильтрация пакетов здесь допускается только в исключительных случаях.
5 Принятие решения о маршрутизации.
6 Mangle INPUT Пакет попадает в цепочку INPUT таблицы mangle. Здесь внесятся изменения в заголовок пакета перед тем как он будет передан локальному приложению.
7 Filter INPUT Здесь производится фильтрация входящего трафика. Помните, что все входящие пакеты, адресованные нам, проходят через эту цепочку, независимо от того с какого интерфейса они поступили.
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%

Поделиться в соц. сетях

Опубликовать в Google Buzz
Опубликовать в Google Plus
Опубликовать в LiveJournal
Опубликовать в Мой Мир
Опубликовать в Одноклассники

Обсуждение закрыто.