Iptables | Short Manual

62 Created on 28 April 2025 at 09:09
  Devops     Internet     It     Linux     Networks     Security  

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 — будет присужден дополнительный порт процесса.