Iptables | Short Manual
iptables — утилита командной строки, которая является стандартным интерфейсом управления работой межсетевого экрана netfilter в системах на базе ядра Linux.
- Доступен на всех дистрибутивах.
- Некоторые дистрибутивы могут использовать другие инструменты в более новых версиях.
- ufw или nftables — у семейства Debian.
- firewalld — у семейства Red Hat.
- На большинстве домашних систем межсетевой экран по умолчанию выключен.
iptables в GNU/Linux выполняет аналогичную роль ACL (Access Control List) на маршрутизирующих устройствах, позволяя фильтровать трафик на входе или выходе и при пересылке между интерфейсами.
- Например, на маршрутизирующем устройстве можно создать список ACL с правилами (permit или deny), разрешающими или запрещающими трафик в определенные сети или из определенных сетей.
- Список доступа привязывается на определенный интерфейс устройства и проверяет входящий в роутер (in) или выходящий из роутера (out) трафик.
iptables используется на отдельных Linux серверах выступающих в качестве маршрутизатора с функцией с межсетевого экрана и позволяет задавать правила, определяющие, какой трафик может проходить на сервер, какие пакеты можно пересылать, а какие блокировать.
- Отдельный сервер брандмауэр, наподобие Cisco ASA.
По умолчанию, все добавленные правила в iptables действуют только до перезагрузки системы.
Чтобы правила можно было удобно хранить и они автоматически подгружались при старте системы, можно установить дополнительный пакет iptables-persistent.
sudo apt install iptables-persistent
sudo iptables-persistent save — сохранить текущие изменения.
- Правила хранятся в директории /etc/iptables.
Параметры
iptables -t \<table> -A chain -p \<protocol> --dport \<port> -j \<action> — шаблон простейшей команды.
-t \<table> — указывает таблицу (по умолчанию выбрана filter).
- Варианты: filter, nat, mangle, raw, security.
- Указывается перед любым действием с правилом.
-P \<chain>— изменить политику цепочки.
-p \<protocol> — правило касается протокола или семейства протоколов.
-s \<source> — фильтрация по исходному IP адресу.
-d \<destination> — фильтрация по целевому IP адресу.
--dport \<port> — фильтрация по целевому порту.
-j \<action> — действие, которое выполняется при совпадении критерия.
-m \<module> — включает дополнительные условия в критерий.
-multiport --dport \<port,port> — задать несколько портов / протоколов.
-conntrack --ctstate \<state> —задать фильтрацию по состоянию соединения
ADIC
-A \<chain> — добавить (append) правило в конец указанной цепочки.
-D \<chain> \<rule>— удалить (delete) совпадающее по критерию правило из указанной цепочки.
-D \<chain> \<n> — можно указать номер строки c правилом.
- Чтобы узнать номер строки, нужно передать параметр --line-numbers при выводе правил таблицы: iptables -t \<table> -L -v -n --line-numbers
-I \<chain> \<rule> [n] — вставить правило в цепочку по указанному номеру строки.
- Если номер строки явно не указан, дефолтное значение равно 1.
-C \<chain> \<rule> — проверить наличие правила в цепочке и таблице
IO интерфейсы
В зависимости от цепочки, могут использоваться один или два интерфейса для фильтрации трафика.
-i \<in-interface> — из какого интерфейса приходит трафик на роутер.
-o \<out-interface> — в какой интерфейс отправляется трафик из роутера.
Структура правила
Правило в iptables состоит из критерия, действия и счетчика.
-
Критерий — логическое выражение в котором указываются свойства пакета или соединения.
-
Действие — действие, которое необходимо предпринять, если пакет или соединение подпадают под критерий правила.
-
Счетчик — ведет подсчет пакетов, подпавших под критерий правила.
Если у правила не указан критерий, правило будет работать для всех видов пакетов.
Совокупность нескольких правил образует цепочку.
Цепочки | Chains
Внутри каждой таблицы есть цепочки, которые обрабатывают пакеты в зависимости от их направления.
Цепочка — упорядоченная последовательность правил.
- Базовая (Basic)— создается по умолчанию при инициализации таблицы.
- Пользовательская (Custom) — цепочка создается пользователем и используется только с таблице этой цепочки.
Каждый пакет проходит через набор базовых цепочек различных таблиц.
Базовая цепочка, в отличие от пользовательской, имеет действие по умолчанию — политику.
Политика цепочки — действие по умолчанию, которое будет выполнено, если пакет не был обработан ни одним правилом текущей цепочки.
- Или правилами других цепочек, вызванных из этой цепочки.
Базовые цепочки
Базовые цепочки рекомендуется писать в верхнем регистре, чтобы отличать от пользовательских цепочек и других действия.
INPUT — обрабатывает входящие пакеты, предназначенные для хостовой системы.
- Цепочка INPUT срабатывает, когда destination address пакета — это адрес хостовой машины.
- Если сервер получает пакет из интернета или локальной сети, но destination address пакета — это IP-адрес сервера, пакет попадает в цепочку INPUT.
FORWARD — обрабатывает пакеты, пересылаемые через хост (маршрутизация).
- Пакет приходит на сервер-роутер, но destination address другой.
- Работает, когда сервер является маршрутизатором.
OUTPUT — обрабатывает пакеты, отправленные хостовой системой.
- Цепочка OUTPUT срабатывает, когда пакет исходит из хостовой машины — source address пакета должен быть адресом хостовой машины, где настроен фаервол.
- Это может быть как пакет в интернет, так и в локальную сеть.
PREROUTING — обработка пакетов до маршрутизации с целью подменить адрес назначения.
- Проксирование трафика.
- Пакеты, поступающие в систему, сначала проходят через эту цепочку, где могут быть изменены их destination address, если описано подходящее правило.
- Используется в NAT таблице с действием DNAT.
POSTROUTING — обработка пакета после маршрутизации перед отправкой с целью подменить исходный адрес.
- Пакеты, которые уже прошли маршрутизацию, попадают в эту цепочку, где может быть изменён их source address.
- Используется в NAT таблице c действием MASQUERADE или SNAT.
Пользовательские
В качестве примера можно привести Docker — создает свои пользовательские цепочки в таблицах filter и nat.
Таблицы | Tables
Таблица — совокупность базовых и пользовательских цепочек, объединенные общим назначением.
В iptables хранятся пять основных таблиц.
filter — содержит правила, которые обрабатывают разрешение или блокировку трафика — фильтрация трафика.
- Основная таблица, которая используется по умолчанию в команде iptables.
- Другие таблицы нужно задавать явно через параметр -t.
- В основном работают цепочки INPUT, FORWARD и OUTPUT.
nat — содержит правила, которые меняют IP-адреса (source or destination) и порты пакетов (SNAT, DNAT, MASQUERADE).
- Пакет проходя через эту таблицу меняет только IP адрес или IP адрес и порт, в зависимости от действия.
- В основном работают цепочки PREROUTING, OUTPUT, POSTROUTING.
mangle — содержит правила модификации заголовков пакета (QoS, TTL, маркировка).
- Таблица используется редко и нужно иметь экспертизу, задавая то или иное правило.
raw — используется для исключения пакетов из отслеживания соединений.
- Пакет проходит через эту таблицу до передачи системе состояний.
- Используется редко.
security — применяется в системах SELinux.
- Используется редко.
Действия | -j option
После установки критерия в правиле, нужно задать действие (action), которое будет выполнено в случае попадания пакета под критерий.
ACCEPT — разрешить трафик.
DROP — блокировать трафик (без уведомления).
REJECT — отклонить трафик (отправляя ICMP-ответ).
LOG — записать информацию в лог.
MASQUERADE — преобразование исходящего IP адреса пакета и добавление уникального порта (PAT, NAT Overload) - отправка пакетов в Интернет.
SNAT — преобразование только исходящего IP адреса - Source Nat.
DNAT — преобразование IP адреса назначения (перенаправление трафика) - Destination Nat.
Connection tracking
Механизм определения состояний (conntrack) — позволяет определить какому соединению принадлежит пакет.
- Под анализ попадают все пакеты, кроме помеченных NOTRACK, в таблице raw.
NEW — пакет принадлежит новому соединению.
- Это означает, что процесс передающий пакет инициирует новое соединение, которое ещё не существует в таблице соединений.
- Например, если с внешней сети поступает запрос на установление соединения (например, TCP SYN) — это будет состояние NEW.
ESTABLISHED — пакет относится к уже существующему соединению.
- Если соединение уже было установлено (например, TCP-соединение), то все пакеты, принадлежащие этому соединению, будут отслеживаться как ESTABLISHED.
- Например, если отправить запрос с сервера на внешний ресурс, то ответ будет иметь ESTABLISHED состояние.
RELATED —используется для соединений, которые логически связаны с уже существующим соединением, но это не обязательно то же соединение.
- Например, когда устанавливается FTP-соединение, основное соединение (для команд) будет ESTABLISHED, а соединение для передачи данных через другой порт будет отмечено как RELATED, потому что оно связано с основным FTP-соединением.
INVALID — пакет не соответствует ни одному из предыдущих состояний, и может быть поврежден или неправильным.
Путь пакета
Любой поступивший пакет на сервер с iptables проходит через ядро, а именно — межсетевой экран netfilter.
Каждый из них классифицируется в зависимости от его назначения, попадает в соответствующую ему таблицу и проходит по цепочкам, содержащим правила, установленные администратором.
На основе этих правил выполняется действие: принять пакет, отбросить, удалить или передать следующему узлу сети.
Схема
<img alt="" src="https://lh7-rt.googleusercontent.com/docsz/AD_4nXfJdCeIdXem-WrPZneYFSS5Tf9bi5PbwXe9hNG75-7wfxdEFbk1MKELGo8aTCGWI1W01O6tXMml8pOziVN1draiiMGWCJA_z-px5OhAjNvPVQsFEEi_Sh87HxmdjKjG_8ey-pcY?key=ZAb1OYHOb8ZXqz95ievSPh5N" />
Основная настройка
- Может потребоваться установить утилиты iptables-services, iptables-persistent.
sudo iptables -t \<table> -L -v -n — показать правила указанной таблицы межсетевого экрана.
- -t — фильтровать вывод правил по таблице: filter, nat, raw, mangle.
- -L — список правил.
- -v — удобный формат
- -n — заменять символьные значения протоколов на номера портов.
- --line-numbers — нумеровать строки в выводе для удобства навигации.
Основное правило в настройке iptables — не нужно внедрять DROP политику пока не внес необходимые разрешающие правила:
-
Основное: удаленный доступ через SSH для серверов.
-
Взаимодействие через loopback интерфейс.
-
Далее уже можно подключиться удаленно и настроить более тонко.
loopback
Интерфейс lo или loopback (сетка 127.0.0.1/16 с доменом localhost) используется для локального взаимодействия между процессами на хостовой машине.
- Если заблокировать lo интерфейс, процессы хостовой системы не смогут взаимодействовать между собой.
sudo iptables -A INPUT -i lo -j ACCEPT — разрешить весь входящий трафик для интерфейса loopback.
sudo iptables -A OUTPUT -o lo -j ACCEPT — разрешить весь исходящий трафик через интерфейс loopback.
conntrack and ssh
sudo iptables -A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT — весь трафик который является ответом на инициированный сервером запрос или соединение будет разрешен.
- Если сам роутер что-то запросил, нужно получить ответ.
sudo iptables -A OUTPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT — весь трафик который является ответом на инициированный извне запрос или соединение будет разрешен.
- Правило полезно с политикой OUTPUT DROP.
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT — разрешить новые входящие соединения по SSH протоколу.
policy
sudo iptables -P INPUT DROP — установить политику DROP, когда все входящие соединения не подпадающие под правила в таблицах блокируются.
save
service iptables save — сервис сохранит текущие таблицы в файл /etc/sysconfig/iptables и автоматически будет загружать их после перезагрузки.
sudo netfilter-persistent save — в новых версиях систем.
nat
Правила в таблицу NAT добавляются только в случае, если сервер используется в качестве маршрутизатора.
Правила в таблице nat определяют:
- Сеть, адресу которой требуются трансляция.
- На каком этапе нужна трансляция.
- Тип NAT.
PREROUTING — момент времени, когда пакет еще не получил адрес следующего узла для отправки.
- Используется для подмены адреса назначения.
- Когда пакет через свой шлюз достиг хостовой машины, он имеет определенный адрес назначения.
- Трансляция адреса назначения произойдет в этот момент.
- Уже потом маршрутизатор (хост) смотрит на адрес назначения пакета и проверяет в таблице маршрутизации доступна ли ему эта сеть.
- Если сеть неизвестна маршрутизатору, пакет уходит по стандартному маршруту на шлюз другого маршрутизатора.
POSTROUTING — момент времени, когда пакет знает адрес следующего узла для отправки.
- Используется чаще всего для подмены исходного адреса.
- Когда пакет через свой шлюз достиг хостовой машины, он все еще имеет исходный адрес в своей сети.
- Маршрутизатор (хост) смотрит на адрес назначения пакета и проверяет в таблице маршрутизации доступна ли ему эта сеть.
- Трансляция исходного адреса произойдет в этот момент.
- Если сеть известна маршрутизатору и включен режим IP Forwarding, пакет отправляется на шлюз нужной сети.
- Если сеть неизвестна маршрутизатору, пакет уходит по стандартному маршруту на шлюз другого маршрутизатора.
Почему NAT?
Когда пакет из своего сегмента сети приходит на маршрутизатор, он имеет исходный адрес в своей сети.
Далее маршрутизатор проверяет адрес назначения пакета.
- Если адрес назначения пакета известен маршрутизатору, он переправляет его на соответствующий шлюз.
- То есть делает маршрутизацию внутри частных сегментов сети.
Если адрес назначения пакета неизвестен маршрутизатору, он отправляет пакет на стандартному маршрут.
- В случае с маршрутизатором, стандартный маршрут прописывается статически в таблице.
- В случае с хостом, стандартным маршрутом является основной шлюз назначенный хосту.
- Стандартный маршрут включает в себя основной шлюз — адрес другого маршрутизатора.
- Пакет попадает на маршрутизатор, натится в белый адрес и уходит в Интернет.
- Все преобразования адресов записываются в таблицу NAT.
Спустя время на маршрутизатор приходит ответ с белым адресом назначения и натится в серый адрес хоста из таблицы NAT.
Проблема заключается в том, что теперь пакет с серым адресом должен попасть на шлюз локальной сети, чтобы вернуться обратно.
Для решения этой проблемы существует несколько подходов:
- Статически прописать маршрут на роутере, указав в качестве шлюза адрес последнего маршрутизатора.
- Настроить динамическую маршрутизацию.
- Настроить NAT.
Настроить NAT — самое простое и надежное решение, так как чтобы настроить динамическую маршрутизацию нужно иметь доступ к роутеру и обладать некоторой экспертизой.
sudo iptables -t nat -A POSTROUTING -o enp0s3 -s 192.168.252.0/24 -j MASQUERADE
- Правило будет добавлено в таблицу nat и цепочку POSTROUTING — нужно изменить исходный адрес после маршрутизации.
- Правило должно применяться на выходящий трафик из интерфейса enp0s3 — адрес интерфейса в сети роутера, значит трафик уходит в сторону роутера.
- Источником является сеть 192.168.252.0/24, значит транслироваться будут только ее хосты.
- Будет применяться технология MASQUERADE или NAT Overload — будет присужден дополнительный порт процесса.