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