Iptables — это классический и широко распространённый фаерволл, который до сих пор используется на многих серверах и является базовым средством, несмотря на появление более современных аналогов — ufw и nftables. Причина его востребованности — в проверенной временем стабильности и уже знакомой логике построения правил для опытных системных администраторов.
В статье рассказываем, как пользоваться iptables для защиты вашего сервера, научиться понимать конструкции этого фаерволла и сохранить доступ к системе.

Что такое iptables
iptables — это мощный инструмент командной строки для настройки и управления механизмом фильтрации, встроенным в ядро Linux, а также преобразования сетевых пакетов. Он взаимодействует с подсистемой Netfilter, которая отвечает за обработку сетевого трафика: входящего (INPUT), исходящего (OUTPUT) и проходящего через систему (FORWARD).
Хотя термин «iptables» часто используется как синоним фаервола в Linux, технически это пользовательский интерфейс к более глубокой системе — Netfilter. Netfilter определяет, как обрабатываются пакеты, а iptables — что с ними делать: разрешить, отклонить, перенаправить, залогировать и т.д.
С момента своего появления в начале 2000-х годов iptables стал де-факто стандартом для сетевой безопасности в Linux. Его гибкость позволяет не только блокировать или разрешать соединения, но и реализовывать сложные сценарии: NAT (трансляция сетевых адресов), балансировку нагрузки, ограничение скорости, защиту от DDoS и многое другое.
Важно понимать, что iptables — это фаерволл с отслеживанием состояния (stateful). Это означает, что он ориентируется на состояние соединений (новое, установленное, связанное и т. д.) и принимает решения на основе этого контекста, а не только на основе IP-адресов и портов. Такой подход значительно повышает безопасность и эффективность фильтрации, так как позволяет производить более гибкую, производительную и точную настройку правил под конкретные ситуации.
Однако со временем в iptables обнаружились недостатки:
- дублирование кода между IPv4 и IPv6;
- неэффективная обработка правил;
- сложный синтаксис, особенно если требуется сложная фильтрация.
Сейчас iptables считается устаревшим решением, и ему на смену пришёл более актуальный инструмент — nftables, который, в том числе устраняет эти недостатки, но более сложен для понимания и обучения. Поэтому iptables даже в 2025 году iptables остаётся актуальным у системных администраторов, DevOps-инженеров и специалистов по информационной безопасности.
Другие его преимущества:
- широкий выбор документации, скриптов и учебных материалов;
- стабильность и предсказуемость поведения;
- совместимость с устаревшими системами и встроенными устройствами (например, роутерами на OpenWrt);
- большое количество готовых решений и шаблонов.
Что учесть перед работой с iptables
Прежде чем приступать к настройке iptables, важно убедиться, что на вашей системе не запущен другой фаерволл: он может конфликтовать с вашими правилами или даже полностью игнорировать их.
Современные дистрибутивы Linux часто по умолчанию используют альтернативные системы управления сетевым трафиком: firewalld (в RHEL, CentOS, Fedora), ufw (в Ubuntu, Debian) или nftables, который постепенно заменяет iptables в качестве основного фреймворка.
Как проверить активные фаерволлы:
- Firewalld. Проверить статус firewalld можно командой:
systemctl status firewalldЕсли служба активна, вы увидите строку active(running). Firewalld управляет правилами через собственный API и может перезаписывать правила iptables в фоне, что делает ручное управление iptables нестабильным.
- UFW. Чтобы проверить статус UFW, введите команду (для Debian/Ubuntu и подобных систем):
ufw status verboseЕсли вывод показывает Status: active, значит, UFW управляет сетевыми правилами.
- nftables. Проверить, используется ли nftables, можно командой:
nft list rulesetЕсли команда возвращает правила — система уже работает на nftables. В некоторых дистрибутивах (например, Debian 11+) iptables даже перенаправляется на nftables через совместимый интерфейс (iptables-nft).
- Проверка текущих правил iptables. Чтобы убедиться, что iptables действительно работает и содержит правила, введите команду:
iptables -L -n -vПустой вывод не означает отсутствие фаерволла — возможно, правила управляются другим инструментом.
Как безопасно отключить конкурирующий фаерволл
Отключение фаерволла без предварительной настройки альтернативы может привести к потере доступа к серверу, особенно если вы подключены по SSH. Поэтому перед любыми изменениями рекомендуется добавить временное правило, разрешающее соединение на нужный порт:
iptables -A INPUT -p tcp --dport 22 -j ACCEPTЭто обеспечит непрерывный доступ по SSH, даже при сбросе или перезапуске правил. Если вы используете другой SSH-порт, подставьте его значение в команде вместо «22».
Важно: в любом случае перед подобными работами необходимо убедиться в наличии резервного доступа (в случае VDS – прямой доступ по VNC в панели VMmanager).
Как отключить конкурирующий фаерволл:
- Отключаем firewalld. Сохраните текущие правила (если они важны):
firewall-cmd --list-allЗатем остановите и отключите службу:
systemctl stop firewalld
systemctl disable firewalldЧтобы избежать случайного возврата firewalld при обновлении пакетов, можно замаскировать службу:
systemctl mask firewalld- Отключаем UFW:
ufw disableУбедитесь, что он не запустится автоматически:
systemctl disable ufw- Отключаем nftables. Если вы хотите перейти именно на «классический» iptables (не на iptables-nft), убедитесь, что установлен пакет iptables-legacy:
update-alternatives --set iptables /usr/sbin/iptables-legacy
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacyОстановите nftables:
systemctl stop nftables
systemctl disable nftablesОчистите все правила nftables:
nft flush ruleset Только убедившись, что система не управляется другим фаерволом, можно приступать к непосредственной настройке iptables.
Таблицы iptables
В основе архитектуры iptables — концепция таблиц (tables). Каждая таблица отвечает за определённый тип обработки пакетов. Всего существует пять основных таблиц, хотя на практике чаще используются только первые три.
1. filter
Это основная и самая часто используемая таблица. Она предназначена для фильтрации пакетов — то есть для принятия решений: разрешить пакету пройти дальше или отклонить его.
Цепочки (chains) в этой таблице:
- INPUT — обрабатывает пакеты, предназначенные локальной системе (например, входящие SSH-соединения).
- OUTPUT — обрабатывает пакеты, исходящие от локальной системы.
- FORWARD — обрабатывает пакеты, проходящие через систему (актуально, если сервер работает как маршрутизатор или шлюз).
Если вы просто вводите команду iptables -A INPUT ..., вы по умолчанию работаете с таблицей filter.
2. nat
Таблица Network Address Translation используется для изменения IP-адресов и портов в заголовках пакетов. Это необходимо для:
- организации выхода в интернет для всей локальной сети через один публичный IP (маскарадинг);
- перенаправления трафика с одного порта на другой (port forwarding);
- настройки прозрачных прокси.
Цепочки в таблице nat:
- PREROUTING — изменение пакета до принятия решения о маршрутизации (например, DNAT — destination NAT).
- POSTROUTING — изменение пакета после маршрутизации (например, MASQUERADE или SNAT — source NAT).
- OUTPUT — для NAT исходящих локальных соединений (редко используется).
Пример команды для внесения правила, чтобы разрешить машинам в локальной сети выходить в интернет через сервер с публичным IP:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE3. mangle
Таблица mangle предназначена для модификации специфических полей IP-заголовков, например, TTL (Time To Live), TOS (Type of Service) или маркировки пакетов для последующей обработки (например, в QoS-системах).
Таблица содержит цепочки: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING.
Используется редко и в основном в специализированных сценариях (например, для настройки политики качества обслуживания или отладки сетевых проблем).
4. raw
Таблица raw позволяет исключить пакеты из отслеживания соединений (connection tracking). Это полезно для повышения производительности при обработке большого объёма трафика, который не требует stateful-анализа (например, потоковое видео или DNS-запросы).
Основные цепочки: PREROUTING и OUTPUT.
Пример команды для внесения правила:
iptables -t raw -A PREROUTING -p udp --dport 53 -j NOTRACK5. security
Эта таблица используется в системах с расширенными механизмами безопасности, такими как SELinux. Она применяет метки безопасности к пакетам и редко встречается в обычных конфигурациях.
Важно: Порядок обработки пакета в ядре строго определён. Например, пакет, пришедший извне, проходит через цепочки в таком порядке: raw → mangle → nat (PREROUTING) → routing decision → filter (INPUT).
Если пакет предназначен для другого хоста и система работает как маршрутизатор, после решения о маршрутизации он попадает в filter (FORWARD), затем в mangle → nat (POSTROUTING).
Понимание таблиц и цепочек — ключ к эффективной настройке iptables. Неправильный выбор таблицы может привести к тому, что правило просто не сработает, даже если синтаксис корректен. Когда пакет проходит через систему, он проверяется на соответствие правилам в цепочках, пока не будет найдено первое подходящее действие.
Синтаксис iptables
Команды iptables строятся по строгой логической структуре, которая позволяет точно указать, какой трафик, в какой таблице, в какой цепочке и что с ним делать. Базовый синтаксис выглядит так:
iptables [-t таблица] -операция ЦЕПОЧКА [условия] -j ЦЕЛЬРазберём каждый элемент подробно.
1. Выбор таблицы (-t таблица)
По умолчанию используется таблица filter. Если нужно работать с NAT, mangle или raw-правилами, необходимо явно указать таблицу, например:
iptables -t nat -A POSTROUTING ...2. Операции
Основные операции определяют, что сделать с правилом:
-A(append) — добавить правило в конец цепочки.-I(insert) — вставить правило в начало цепочки или в указанную позицию, например: -I INPUT 2.-D(delete) — удалить правило по номеру или по совпадению.-R(replace) — заменить правило по номеру.-L(list) — вывести список правил в цепочке.-F(flush) — очистить все правила в цепочке.-N(new-chain) — создать пользовательскую цепочку.-X(delete-chain) — удалить пользовательскую цепочку.-P(policy) — установить политику по умолчанию для встроенной цепочки.
3. Цепочки
Это точки входа в обработку пакетов. В таблице filter это INPUT, OUTPUT, FORWARD. В других таблицах — свои цепочки (см. раздел «Таблицы iptables»).
4. Условия
Условия определяют, к каким пакетам применяется правило. Они могут быть простыми или сложными:
-p tcp— только TCP-трафик.--dport 22— только пакеты, направленные на порт 22.-s 192.168.1.0/24— только от подсети 192.168.1.0/24.-d 10.0.0.5— только к адресу 10.0.0.5.-i eth0— только входящие через интерфейс eth0.-o eth1— только исходящие через eth1.-m state --state ESTABLISHED,RELATED— только установленные или связанные соединения.-m limit --limit 5/min— ограничение частоты срабатывания (для логирования).-m comment --comment "Allow SSH"— добавление поясняющего комментария.
Модули (-m) расширяют возможности iptables. Например, -m multiport позволяет указывать несколько портов:
-m multiport --dports 22,80,4435. Цель
Цель определяет действие, которое выполняется при совпадении условия:
ACCEPT— разрешить пакет.DROP— тихо отбросить пакет (без уведомления отправителя).REJECT— отклонить пакет и отправить ICMP-ошибку (например, «порт недоступен»).LOG— записать информацию о пакете в системный журнал (обычно /var/log/kern.log).MASQUERADE— динамическая замена исходного IP (для NAT).DNAT / SNAT— статическая трансляция адресов.RETURN— вернуться в предыдущую цепочку.- Имя пользовательской цепочки — передать обработку в неё.
Важно: Порядок правил критичен, iptables обрабатывает правила сверху вниз и останавливается на первом совпадении. Поэтому общие правила (например, DROP all) должны идти в конце, а специфичные — в начале.
Пример полной команды:
iptables -A INPUT -p tcp -s 192.168.1.100 --dport 22 -j ACCEPTЭто правило:
— добавляется в конец цепочки INPUT,
— применяется только к TCP-пакетам,
— от источника 192.168.1.100,
— направленным на порт 22,
— и разрешает их прохождение.
Основные команды iptables
Ниже приведены наиболее часто используемые команды, которые формируют основу повседневной работы с iptables.
1. Просмотр правил:
iptables -L -n -v- -L — список правил.
- -n — не выполнять DNS-запросы (показывать IP, а не имена).
- -v — подробный вывод (счётчики пакетов и байтов).
Для просмотра с номерами строк (удобно для удаления):
iptables -L --line-numbers2. Очистка всех правил:
iptables -FОчищает все цепочки в таблице filter. Чтобы очистить другие таблицы, введите:
iptables -t nat -F
iptables -t mangle -F3. Установка политик по умолчанию
Политика определяет, что делать с пакетами, не попавшими ни под одно правило.
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPTЭти действия создают «белый список»: всё запрещено, кроме явно разрешённого.
Осторожно! Установка INPUT DROP без предварительного разрешения SSH может отключить вас от сервера.
4. Разрешение локального трафика:
iptables -A INPUT -i lo -j ACCEPTТрафик через loopback-интерфейс (127.0.0.1) почти всегда должен быть разрешён.
5. Разрешение установленных соединений:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTПозволяет отвечать на запросы, инициированные локальной системой (например, обновления пакетов).
6. Сохранение и восстановление правил.
Правила iptables не сохраняются автоматически после перезагрузки. Их нужно сохранять вручную.
В Debian/Ubuntu:
iptables-save > /etc/iptables/rules.v4Установите пакет iptables-persistent, чтобы правила загружались при старте:
apt install iptables-persistentВ RHEL/CentOS 7 и старше:
service iptables save(требует установленного пакета iptables-services).
В CentOS 8+ / RHEL 8+ рекомендуется использовать nftables, но если нужно установить iptables, введите:
iptables-save > /etc/sysconfig/iptables
systemctl enable iptables7. Удаление правила
По номеру строки:
iptables -D INPUT 3По совпадению:
iptables -D INPUT -p tcp --dport 22 -j ACCEPT8. Создание пользовательской цепочки
iptables -N SSH-RULES
iptables -A INPUT -p tcp --dport 22 -j SSH-RULES
iptables -A SSH-RULES -s 192.168.1.0/24 -j ACCEPT
iptables -A SSH-RULES -j DROPУлучшает читаемость и модульность конфигурации.
Примеры настройки iptables
Теория — хорошо, но настоящая ценность iptables раскрывается на практике. Ниже приведены три типичных сценария, с которыми часто сталкиваются администраторы: базовый сервер, веб-сервер и почтовые порты. Все примеры предполагают, что конкурирующие фаерволлы отключены, а доступ по SSH сохранён.
Базовый сервер с минимальными разрешениями
Цель: разрешить только SSH и локальный трафик, всё остальное — запретить.
Очистка всех правил (рекомендуется выполнять в VNC-консоли сервера):
iptables -F
iptables -t nat -F
iptables -t mangle -FРазрешить SSH только с доверенного IP (замените на ваш):
iptables -A INPUT -p tcp -s 203.0.113.45 --dport 22 -j ACCEPTУстановка политик по умолчанию:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPTРазрешить loopback:
iptables -A INPUT -i lo -j ACCEPTРазрешить установленные и связанные соединения:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT(Опционально) Разрешить пинг:
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPTСохранение правил:
iptables-save > /etc/iptables/rules.v4Совет: если вы не знаете, с какого IP будете подключаться, после очистки правил первой же командой временно разрешите весь SSH-трафик:iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Веб-сервер (HTTP/HTTPS + SSH)
Цель: открыть порты 80 и 443 для всех, SSH — только для админов, защитить от сканирования портов.
SSH — только с подсети админов, вместо 192.168.10.0/24 укажите подсеть администраторов:
iptables -A INPUT -p tcp -s 192.168.10.0/24 --dport 22 -j ACCEPTУстановка политик по умолчанию:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPTLoopback и установленные соединения:
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPTВеб-трафик — для всех:
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPTЗащита от сканирования: логировать и отклонять подозрительные попытки:
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j LOG --log-prefix "NULL_SCAN: "
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j LOG --log-prefix "XMAS_SCAN: "
iptables -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROPСохранение:
iptables-save > /etc/iptables/rules.v4Эти правила блокируют так называемые NULL- и XMAS-сканы, часто используемые в разведке уязвимостей.
Настройка для почтового сервера
Цель: открыть доступ для всех необходимых портов почтового сервера (exim/postfix, dovecot).
Правила будут указаны в продолжение предыдущих примеров.
iptables -A INPUT -p tcp -m multiport --dports 25,465,587,110,995,143,993 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --sports 25,465,587,110,995,143,993 -m conntrack --ctstate ESTABLISHED -j ACCEPTПри этом важно помнить, что почтовые службы часто становятся целью спам-ботов и перебора паролей, поэтому можно добавить ограничение скорости:
iptables -A INPUT -p tcp --dport 25 -m limit --limit 10/minute --limit-burst 20 -j ACCEPT Расширенное использование iptables
Помимо базовой фильтрации, iptables позволяет реализовывать продвинутые сценарии безопасности и управления трафиком. Вариантов реализации довольно много, и они бывают достаточно сложными. В рамках этой статьи мы рассмотрим лишь распространённые и более простые случаи.
1. Ограничение скорости подключений (защита от брутфорса SSH)
Модуль limit и recent позволяют ограничивать частоту подключений.
Например, разрешим до трёх попыток подключения с одного IP по SSH за 60 секунд:
iptables -A INPUT -p tcp --dport 22 -m recent --name ssh --set
iptables -A INPUT -p tcp --dport 22 -m recent --name ssh --update --seconds 60 --hitcount 4 -j DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPTПервое правило помечает IP, второе — блокирует, если за 60 секунд было совершено 4 или более попыток. Третье правило разрешает доступ по 22-му порту, если были пройдены условия первых двух правил.
2. Перенаправление портов (Port Forwarding)
Например, поставлена задача перенаправить внешний порт 8080 на внутренний сервер 192.168.1.50:80
В первую очередь включаем маршрутизацию командой:
echo 1 > /proc/sys/net/ipv4/ip_forwardЧтобы эта настройка сохранялась после перезагрузки, воспользуемся командой:
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.confИспользуем правило DNAT для изменения назначения пакета:
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.50:80Далее следует разрешить в цепочке FORWARD приём пакетов на нужном адресе и порту:
iptables -A FORWARD -p tcp -d 192.168.1.50 --dport 80 -j ACCEPTТеперь запросы к <ip_вашего_сервера>:8080 будут перенаправляться и обрабатываться веб-сервером на внутреннем адресе.
3. Логирование подозрительного трафика
Чтобы не засорять логи, используйте ограничение частоты:
iptables -A INPUT -p tcp --dport 22 -j LOG --log-prefix "SSH_ATTEMPT: " --log-level 6 -m limit --limit 3/min
iptables -A INPUT -p tcp --dport 22 -j ACCEPTКоманда запишет не более 3 записей в минуту, даже если атака идёт непрерывно.
4. Маркировка пакетов для QoS (приоритезация трафика)
С помощью таблицы mangle можно помечать пакеты для последующей обработки в tc (traffic control), например:
iptables -t mangle -A OUTPUT -p tcp --dport 5060 -j MARK --set-mark 10Затем в tc (отдельная утилита управлением трафика) можно задать приоритет для пакетов с меткой 10 (например, для VoIP-трафика).
5. Защита от DDoS (базовый уровень)
Хотя iptables не заменит специализированные решения, он может смягчить простые атаки.
Ограничить новые соединения до 20 в секунду:
iptables -A INPUT -p tcp --syn -m limit --limit 20/sec --limit-burst 50 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP--limit-burst задаёт «запас» для кратковременных всплесков.
6. Использование пользовательских цепочек для группировки и удобства
Группировка правил улучшает читаемость. Введем, например, такие группы:
iptables -N WEB
iptables -N MONITORINGТеперь мы можем помечать правила вышеназванными категориями, например:
iptables -A INPUT -p tcp --dport 80 -j WEB
iptables -A INPUT -p tcp --dport 443 -j WEB
iptables -A INPUT -s 10.0.0.0/8 -p tcp --dport 9100 -j MONITORINGИ затем задавать общие правила для всей категории, например, разрешить:
iptables -A WEB -j ACCEPT
iptables -A MONITORING -j ACCEPTТаким образом можно легко включать/отключать целые группы правил.
7. Работа с IPv6
Для IPv6 используется команда ip6tables с аналогичным синтаксисом:
ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
ip6tables-save > /etc/iptables/rules.v6Не забывайте настраивать обе версии, если в вашей сети используется IPv6.
Заключение
Настройка iptables — это не просто техническая задача, а искусство баланса между безопасностью, функциональностью и удобством. Несмотря на то что в 2025 году всё больше дистрибутивов переходят на nftables, iptables остаётся неотъемлемой частью Linux-экосистемы. Его понимание даёт администратору глубокий контроль над сетевым стеком и позволяет быстро реагировать на угрозы без зависимости от сторонних инструментов.
Что важно помнить:
- Фаерволл — это не «установил и забыл». Правила должны регулярно пересматриваться, тестироваться и адаптироваться под меняющуюся инфраструктуру. Особенно критично это в облачных средах, где IP-адреса динамичны, а атаки становятся всё более изощрёнными.
- Безопасность начинается с минимальных разрешений. Принцип «запретить всё, кроме необходимого» (whitelist) значительно надёжнее, чем «разрешить всё, кроме опасного» (blacklist). iptables предоставляет все инструменты для реализации этого подхода — от простой фильтрации до сложных сценариев с маркировкой, логированием и ограничением скорости.
- Наконец, никогда не применяйте правила на продакшен-сервере без тестирования. Используйте виртуальные машины, контейнеры или резервные сессии, чтобы избежать потери доступа. Автоматизируйте развёртывание правил через скрипты или системы конфигурации (Ansible, например), чтобы гарантировать воспроизводимость и минимизировать человеческий фактор.
Освоив iptables, вы не только научитесь защищать свои системы, но и глубже поймёте, как устроен сетевой трафик в Linux — знание, которое остаётся актуальным независимо от эволюции инструментов.
Шпаргалка: команды, которые стоит заучить
Команда | Назначение |
|---|---|
| Просмотр всех активных правил с подробной статистикой |
| Очистить все цепочки (flush) |
| Удалить пользовательские цепочки |
| Установить политику по умолчанию для входящего трафика — разрешить |
| Вставить правило в начало цепочки (ключ -I) |
| Разрешить установленные соединения |
| Разрешить доступ по SSH |
| Разрешить HTTP и HTTPS |
| Разрешить ICMP (ping) |
| Ограничить частоту SMTP-запросов |
| Блокировка перебора паролей SSH |
| Заблокировать подсеть (либо IP, если укажете вместо подсети один адрес) |
| Заблокировать порт 123 (можете указать какой требуется) по TCP и UDP |
| Сохранить текущие правила |
| Восстановить сохранённые правила |