Что такое iptables?
iptables — это один из самых надёжных инструментов для настройки межсетевого экрана (firewall) в Linux. Он встроен прямо в ядро системы и работает на уровне сетевого стека. Это значит: когда к вашему серверу летит пакет — iptables решает, пустить его или нет. И хотя на первый взгляд он выглядит как «утилита для терминала», под капотом у него мощный механизм управления сетевым трафиком: от базовой фильтрации до сложных сценариев NAT, логирования и контроля доступа.
С 2001 года, начиная с версии ядра 2.4, iptables предустановлен во всех основных дистрибутивах Linux.
Работает iptables через командную строку, и для любых действий нужен root-доступ. Чтобы проверить, установлен ли инструмент в системе и какая версия используется, достаточно ввести:
Если вы видите ответ — всё готово к работе. Теперь можно переходить к правилам, цепочкам и таблицам — именно они задают логику работы firewall.
Зачем нужен iptables?
iptables — это многофункциональный инструмент, который помогает вам контролировать, что именно происходит с трафиком на сервере — от простых фильтров до гибкой маршрутизации и настройки качества обслуживания.
Вот ключевые задачи, которые решает iptables:
- Фильтрация пакетов Можно настраивать как простую фильтрацию (по IP-адресам, портам, протоколам), так и отслеживать состояния соединений. Вы можете, например, разрешить только входящие ответы на исходящие запросы — и автоматически отбрасывать остальное.
- Настройка NAT, PAT и NAPT
iptables позволяет настроить NAT (Network Address Translation) — трансляцию адресов, которая необходима, если у вас частная подсеть за роутером. PAT (Port Address Translation) и NAPT (Network Address and Port Translation) дают возможность «подвязывать» внешние запросы к конкретным внутренним машинам и портам. Это основа для работы практически всех домашних и корпоративных сетей. - Управление приоритетами через QoS
Хотите, чтобы VoIP-трафик шёл быстрее, чем фоновые обновления? iptables поддерживает метки и классификацию трафика, что позволяет реализовать управление приоритетами (Quality of Service). Это особенно полезно в системах с ограниченной пропускной способностью, где важно обеспечить стабильность критичных сервисов. - Изменение заголовков пакетов
Благодаря таблице mangle, iptables даёт возможность переписывать отдельные поля в заголовках IP-пакетов — например, менять TTL, маркировать трафик, настраивать маршруты по политике (policy routing) и многое другое. Это уже тонкая инженерия, но она даёт полный контроль над тем, как ваш трафик ведёт себя внутри сети.
Прежде чем переходить к более сложным функциям — таким как NAT или QoS, — важно чётко понимать, как работает фильтрация трафика на базовом уровне. Именно с этого начинается настройка firewall: с понимания разницы между stateless и stateful фильтрацией. От этого зависит, насколько точно вы сможете управлять входящими и исходящими соединениями.
Stateless и stateful фильтрация: в чём разница?
Stateless-фильтрация — это самый базовый уровень проверки. Она работает с каждым пакетом по отдельности, не вникая в контекст. Если в правиле указан IP, порт или протокол — iptables просто сверяет входящий пакет с этими условиями и сразу принимает решение: пропустить или отклонить. Это быстро и просто, но не даёт представления о том, к какому соединению относится пакет и в каком он состоянии.
Stateful-фильтрация идёт дальше. Она отслеживает полную картину соединения: знает, был ли установлен сеанс, какие пакеты уже прошли, и ожидается ли ответ. Благодаря встроенному механизму отслеживания состояний (connection tracking), iptables может отличать новые соединения от уже существующих и автоматически блокировать подозрительный трафик. Например, можно разрешить входящие ответы только на исходящие соединения, а всё остальное — отбрасывать.
Теперь подробнее поговорим о правилах и из чего они состоят
Правила (Rules)
В iptables всё строится на правилах — они задают конкретные условия обработки пакетов. Каждое правило — это своего рода инструкция для ядра Linux, объясняющая, что делать с пакетом, если он соответствует определённым признакам.
Структура любого правила включает три ключевых компонента:
1. Критерий (условие)
Это то, по чему система будет «опознавать» нужный трафик. В качестве критериев можно использовать:
- IP-адрес источника (-s 192.168.1.10)
- IP-адрес назначения (-d 10.0.0.1)
- Порт (—dport 22)
- Протокол (-p tcp, -p udp)
- Интерфейс (-i eth0, -o eth1)
- Состояние соединения (—state NEW, ESTABLISHED, RELATED)
Вы можете комбинировать сразу несколько условий, чтобы точно задать, какой трафик нужно обрабатывать.
2. Действие (target)
Когда критерий совпал, iptables должен выполнить какое-то действие. Это и есть «решение» правила. Основные варианты:
- ACCEPT — пропустить пакет
- DROP — молча отбросить
- REJECT — отклонить с уведомлением
- LOG — записать в лог (но не блокировать)
- RETURN — вернуться к предыдущей цепочке
- Специальные действия, например DNAT, SNAT, MASQUERADE — для работы с NAT
3. Счётчик
У каждого правила есть встроенный счётчик: он показывает, сколько раз правило сработало — сколько пакетов (и байт) оно обработало. Это удобно для отладки, мониторинга и понимания, какие правила действительно задействованы в работе.
Пример: блокировка SSH-доступа
Допустим, вы хотите заблокировать доступ к серверу по SSH (порт 22). Пример простого правила:
iptables -A INPUT -p tcp --dport 22 -j DROP
Что здесь происходит:
- -A INPUT — добавляем правило в цепочку входящих соединений
- -p tcp — фильтруем TCP-пакеты
- —dport 22 — применяем только к трафику, идущему на порт 22
- -j DROP — действие: отбросить пакет
Результат: любое входящее подключение по SSH будет тихо отклонено, без ответа. Удобно, если вы хотите закрыть доступ без лишнего шума.
(В конце статьи вы найдёте таблицу синтаксиса для iptables с подробным описанием действий)
Цепочки (Chains)
Чтобы iptables знал, когда и где применять определённые правила, все они объединяются в цепочки. Цепочка — это набор последовательных условий, через которые поэтапно проходит каждый сетевой пакет. В зависимости от того, на каком этапе обработки находится пакет, он попадает в одну из цепочек.
Цепочки бывают двух типов:
- Базовые (встроенные) — всегда присутствуют по умолчанию
- Пользовательские (custom) — создаются вручную пользователем для логической группировки
INPUT
Обрабатывает все входящие пакеты, направленные непосредственно на этот хост.
Если ваш сервер получает SSH-соединение, HTTP-запрос или пинг — этот трафик проходит через цепочку INPUT.
Пример: разрешить входящие соединения на порт 443 (HTTPS):
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
OUTPUT
Отвечает за все исходящие пакеты, которые отправляет сам хост.
Например, когда сервер делает запрос к внешнему API или скачивает обновления — эти пакеты проходят через OUTPUT.
Пример: запретить серверу отправлять любые DNS-запросы:
iptables -A OUTPUT -p udp --dport 53 -j DROP
FORWARD
Используется для транзитного трафика, который проходит через хост, но не предназначен ему напрямую.
Актуально, если сервер используется как роутер или NAT-шлюз. Всё, что перенаправляется — идёт через FORWARD.
Пример: разрешить форвардинг трафика между двумя интерфейсами:
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
PREROUTING
Эта цепочка применяется до маршрутизации, то есть до того, как ядро определит, куда направить пакет.
Обычно используется для изменения адреса назначения (DNAT). Полезно, если вы перенаправляете внешний трафик на внутренние ресурсы.
Пример: перенаправить HTTP-запросы на внутренний сервер:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:80
POSTROUTING
Срабатывает после маршрутизации, перед тем как пакет покинет интерфейс.
Используется для маскарадинга (MASQUERADE) или изменения адреса источника (SNAT) — чтобы сервер подставлял нужный внешний IP.
Пример: скрыть локальные IP-адреса за внешним интерфейсом:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Каждая цепочка обрабатывает пакеты строго в своей зоне ответственности, и важно правильно выбирать, куда вы добавляете правило. Ошибка в выборе цепочки может привести к тому, что правило не сработает, даже если оно написано корректно.
Все правила и цепочки в iptables не существуют сами по себе — они сгруппированы внутри таблиц. О них и поговорим ниже.
Таблицы (Tables)
Таблица — это логический контейнер, определяющий цель обработки трафика. В зависимости от задачи (фильтрация, трансляция, модификация и т.д.), iptables применяет соответствующую таблицу.
Каждая таблица содержит свои цепочки, и в одном правиле обязательно нужно понимать, в какой таблице вы работаете.
Вот основные таблицы, которые используются на практике:
filter
Это основная и самая часто используемая таблица. Именно она отвечает за принятие решений: пропускать, отклонять или блокировать трафик.
Если вы не указываете таблицу вручную, iptables по умолчанию работает именно с filter.
Цепочки внутри: INPUT, OUTPUT, FORWARD.
Пример:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
nat
Таблица для настройки сетевой трансляции адресов (Network Address Translation).
Используется при перенаправлении портов, подмене исходного или конечного адреса. Без nat не обойтись при создании шлюзов, маршрутизаторов, прокси и организации доступа из внешнего мира к внутренним сервисам.
Цепочки внутри: PREROUTING, POSTROUTING, OUTPUT.
Типичные действия:
- SNAT — подмена источника
- DNAT — подмена назначения
- MASQUERADE — маскарадинг (динамический SNAT)
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
mangle
Эта таблица предназначена для глубокой настройки пакетов. Она позволяет модифицировать заголовки, маркировать трафик и использовать эти метки для дальнейшей маршрутизации или приоритизации.
Используется при настройке QoS, сложных схем маршрутизации, балансировке нагрузки и firewall’ах с политиками.
Цепочки внутри: PREROUTING, OUTPUT, INPUT, FORWARD, POSTROUTING.
Пример:
iptables -t mangle -A PREROUTING -p tcp --dport 80 -j MARK --set-mark 1
raw
Специализированная таблица, которая работает до включения механизма отслеживания соединений (connection tracking). Используется, если нужно исключить определённые пакеты из stateful-фильтрации, либо настроить приоритет обработки вручную.
Цепочки внутри: PREROUTING, OUTPUT.
Пример:
iptables -t raw -A PREROUTING -p icmp -j NOTRACK
security
Редко используемая таблица, связанная с метками SELinux. Она применяется для реализации дополнительных политик безопасности на уровне ядра. Используется в специализированных окружениях, где настроен SELinux и нужны ограничения доступа к ресурсам на основе контекста безопасности.
Цепочки внутри: INPUT, OUTPUT, FORWARD.
Как выбрать нужную таблицу?
- Если нужно просто разрешить или запретить трафик — используйте filter
- Хотите настроить переадресацию или NAT — используйте nat
- Нужно пометить трафик или изменить заголовки — берите mangle
- Хотите исключить соединение из трекинга — подходит raw
- Работаете с SELinux — используйте security
Правильный выбор таблицы — это залог того, что правило сработает так, как вы задумали. Поэтому всегда начинайте с вопроса: какой эффект вы хотите получить? — и уже от этого отталкивайтесь при выборе таблицы и цепочки.
Теперь, когда вы понимаете, как работают цепочки и в какие таблицы они сгруппированы, пора разобраться с тем, что именно делает iptables, когда пакет соответствует заданному правилу. На этом этапе в дело вступают действия, или по-другому — targets.
Действия (Targets)
Каждое правило в iptables заканчивается действием — это команда, которую ядро должно выполнить, если пакет прошёл все фильтры и условия правила. Именно действие определяет судьбу пакета: разрешить, заблокировать, переадресовать или просто записать в лог.
Вот основные типы действий, которые вы будете использовать чаще всего:
ACCEPT
Пропустить пакет дальше по стеку, как ни в чём не бывало. Это означает, что пакет прошёл проверку и может быть доставлен приложению или передан дальше по маршруту.
Используется для разрешения трафика.
Пример: разрешить входящие соединения на порт 80:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
DROP
Молча отбросить пакет. Никаких уведомлений, никаких ICMP-ответов — пакет просто исчезает. Это самый строгий и «тихий» способ блокировки. Особенно полезен при защите от сканеров и брутфорса.
Пример: заблокировать пинг:
iptables -A INPUT -p icmp -j DROP
REJECT
Отбросить пакет, но уведомить отправителя, что соединение запрещено. В зависимости от протокола, может вернуться ICMP-сообщение или TCP RST. Используется, если хотите вести себя вежливо и явно показать, что соединение не разрешено.
Пример: отклонить вход по Telnet с уведомлением:
iptables -A INPUT -p tcp --dport 23 -j REJECT
LOG
Не влияет на прохождение пакета — просто записывает информацию о нём в системный журнал (/var/log/syslog или journalctl). Это удобно для мониторинга, отладки и анализа трафика. Часто используется вместе с DROP.
Пример: логировать все SSH-подключения:
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix \"SSH attempt: \"
QUEUE
Передаёт пакет в пользовательское пространство — например, для обработки с помощью nfqueue или других внешних приложений. Это используется редко, но полезно в сложных конфигурациях, например, при интеграции с антивирусами, IDS/IPS или кастомной логикой.
RETURN
Прекращает выполнение текущей цепочки и возвращает управление в предыдущую (например, в базовую). Полезно при использовании пользовательских цепочек, когда вы хотите завершить их выполнение и передать обработку дальше.
Особые targets (для таблицы nat):
DNAT
Изменяет адрес назначения пакета. Используется в PREROUTING для переадресации внешнего трафика на внутренние сервисы.
Пример: перенаправить порт 80 на внутренний сервер:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.1.10:8080
SNAT
Изменяет адрес источника. Применяется в POSTROUTING, когда вы хотите, чтобы внешний мир видел другой IP-адрес, например, IP-шлюза.
Пример: подменить исходящий адрес:
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 203.0.113.1
MASQUERADE
Вариант SNAT, который автоматически подставляет внешний IP интерфейса. Удобен, когда IP динамический (например, при подключении через PPPoE или мобильный интернет).
Пример: маскарадинг для всей локальной сети:
bash
Копировать код
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Каждое действие играет свою роль в цепочке принятия решений. И чем точнее вы их используете — тем эффективнее работает ваш firewall. Главное — не путать контексты: ACCEPT и DROP работают в таблице filter, а SNAT и DNAT — только в nat.
Ну а теперь давайте закрепим на практике — как же использовать всю полученную информацию и как правильно составить правило в iptables?
Каждое правило в iptables строится по одному и тому же принципу: определить условия (фильтры) и назначить действие. Чем точнее вы зададите параметры — тем эффективнее будет защита или обработка трафика.
Вот пример:
Допустим, вы хотите заблокировать доступ к веб-серверу на порту 80 от конкретного IP-адреса — например, от 192.168.2.2.
iptables -A INPUT -p tcp -s 192.168.2.2 --dport 80 -j DROP
Давайте разберем по частям что здесь указано:
- -A INPUT
Добавляем правило в цепочку INPUT, то есть это правило будет применяться ко всем входящим соединениям, направленным к самому хосту. - -p tcp
Указываем протокол — в данном случае TCP, потому что HTTP работает поверх TCP. - -s 192.168.2.2
Это IP-адрес источника. Мы фильтруем только пакеты, отправленные с этого адреса. - —dport 80
Порт назначения — 80, стандартный порт для HTTP. То есть правило будет применяться только к трафику, направленному к веб-серверу. - -j DROP
Действие: отбросить пакет. Клиент не получит ответа, соединение будет просто прервано.
Если вы хотите отменить действие правила — не редактируйте его вручную. Вместо этого используйте тот же синтаксис, но замените -A (append) на -D (delete):
iptables -D INPUT -p tcp -s 192.168.2.2 --dport 80 -j DROP
Это удалит ранее добавленное правило. Именно поэтому важно документировать правила или сохранять их в файл — чтобы потом было легко откатить изменения.
Писать правила — несложно, если вы понимаете структуру и порядок аргументов. Но чтобы делать это уверенно и без ошибок, важно знать основной синтаксис iptables — какие ключи использовать, за что они отвечают, и как задаются условия фильтрации
Синтаксис iptables: ключи и параметры
Команда iptables строится по принципу:
таблица → цепочка → условия → действие.
Чаще всего таблица по умолчанию — filter, и её можно не указывать. Но остальные элементы всегда задаются явно.
Ниже — основные ключи, которые используются для управления правилами:
Ключ | Назначение |
-A | Добавить правило в конец цепочки |
-D | Удалить правило из цепочки |
-I | Вставить правило в начало цепочки или по индексу |
-R | Заменить правило по номеру |
-F | Очистить цепочку (удалить все правила) |
-P | Задать политику по умолчанию для цепочки (ACCEPT/DROP) |
Опции фильтрации трафика
Именно с помощью этих ключей вы описываете условия, по которым iptables будет определять, какому правилу соответствует пакет:
Опция | Назначение |
`-p tcp | udp |
-s | IP-адрес источника |
-d | IP-адрес назначения |
-i | Входной сетевой интерфейс (например, eth0) |
-o | Выходной сетевой интерфейс |
—dport | Порт назначения (например, —dport 80 для HTTP) |
—sport | Порт источника |
-j | Действие, которое нужно выполнить (ACCEPT, DROP, LOG и т.д.) |
Подведем итоги:
В этой статье мы разобрали:
- Что такое iptables и зачем он нужен
- Разницу между stateless- и stateful-фильтрацией
- Основы: как устроены правила, цепочки и таблицы
- Какие действия (targets) применяются к пакетам
- Как писать и редактировать правила
- Как работает синтаксис, ключи и параметры
Чем вам помогут эти навыки?
- Эффективно строить правила для защиты серверов и сетей
- Отлаживать и тестировать настройки без риска «запороть» соединение
- Быстро реагировать на сетевые угрозы — от DDoS до нежеланных сканеров
- Понимать, где и как в системе проходит каждый сетевой пакет
iptables — это инструмент, который действительно стоит освоить. Даже базовое владение позволяет существенно повысить уровень защиты и стабильности работы Linux-сервера. А по мере роста компетенций вы сможете выстраивать более сложные схемы маршрутизации, балансировки, фильтрации и приоритезации трафика.
Если вы хотите идти глубже — изучите nftables, firewalld или настройку fail2ban в связке с iptables. Но именно iptables остаётся классикой и фундаментом, с которого стоит начать.