iptables: настройка файрвола в Linux — правила, цепочки и примеры

Linux 24 марта 2026 12 мин чтения
ЕС
Евгений Семёнов
Генеральный директор ООО АйТи Фреш · 15+ лет в IT
iptables — настройка файрвола в Linux

Безопасность Linux-сервера начинается с правильно настроенного файрвола. iptables — это стандартная утилита для управления брандмауэром в ядре Linux на базе подсистемы Netfilter. Она позволяет фильтровать входящий, исходящий и транзитный трафик, настраивать NAT, ограничивать количество соединений и логировать подозрительную активность. Несмотря на появление nftables и надстроек вроде ufw, именно iptables остаётся основным инструментом на огромном количестве серверов Debian, Ubuntu, CentOS и RHEL. В этой статье мы разберём архитектуру iptables, основные цепочки и таблицы, а также покажем конкретные команды для типичных задач системного администратора.

Архитектура iptables: таблицы и цепочки

Прежде чем писать правила, нужно понимать, как устроен iptables. Система работает с четырьмя таблицами, каждая из которых содержит набор цепочек:

Каждая цепочка обрабатывает пакет последовательно: правила проверяются сверху вниз. Как только пакет совпал с условием правила, применяется указанное действие (target), и дальнейшая проверка прекращается. Если ни одно правило не сработало — применяется политика по умолчанию (policy).

Совет: Для просмотра всех таблиц и их правил используйте iptables -t filter -L -v -n, заменяя filter на нужную таблицу. Флаг -n отключает DNS-резолвинг и ускоряет вывод.

Просмотр текущих правил

Первое, что нужно сделать при работе с файрволом — посмотреть, какие правила уже настроены. Для этого есть несколько вариантов команд:

# Показать все правила в таблице filter (подробно, с номерами пакетов)
sudo iptables -L -v -n

# Показать правила в формате команд (удобно для экспорта)
sudo iptables -S

# Правила конкретной цепочки
sudo iptables -L INPUT -v -n --line-numbers

# Просмотр правил NAT-таблицы
sudo iptables -t nat -L -v -n

Флаг --line-numbers добавляет нумерацию строк — это пригодится при удалении конкретного правила по его порядковому номеру. Параметр -v выводит счётчики пакетов и байтов для каждого правила, что помогает понять, какие правила реально срабатывают.

Основные действия (targets)

Каждое правило iptables заканчивается указанием действия, которое нужно совершить с пакетом. Базовые действия:

Важно: Разница между DROP и REJECT существенна. DROP не отправляет ничего в ответ — клиент висит до таймаута. REJECT сразу отвечает, что соединение отклонено. Для внешних атак лучше DROP (не раскрываете наличие сервера), для внутренней сети — REJECT (быстрый отклик).

Настройка базовых правил файрвола

Типичная стратегия: разрешить нужное, запретить всё остальное. Начнём с настройки политик по умолчанию и базовых разрешающих правил:

# Сначала разрешаем loopback (обязательно!)
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT

# Разрешаем уже установленные соединения
sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Разрешаем SSH (порт 22)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# Разрешаем HTTP и HTTPS
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Разрешаем DNS (для исходящих запросов)
sudo iptables -A INPUT -p udp --sport 53 -j ACCEPT

# Разрешаем ping (ICMP)
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

# Устанавливаем политику по умолчанию — блокировать всё входящее
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
Внимание: Всегда добавляйте правило для SSH до установки политики DROP на INPUT! Иначе вы потеряете доступ к серверу. Если работаете удалённо — протестируйте правила через at или cron, запланировав автоматический сброс через 5 минут.

Добавление и удаление правил

Правила можно добавлять в конец цепочки (-A), вставлять в определённую позицию (-I) или удалять (-D):

# Добавить правило в конец цепочки INPUT
sudo iptables -A INPUT -p tcp --dport 8080 -j ACCEPT

# Вставить правило на позицию 3 (сдвигает остальные вниз)
sudo iptables -I INPUT 3 -p tcp --dport 3306 -s 192.168.1.0/24 -j ACCEPT

# Удалить правило по номеру строки
sudo iptables -D INPUT 5

# Удалить правило по полному описанию
sudo iptables -D INPUT -p tcp --dport 8080 -j ACCEPT

# Полный сброс всех правил
sudo iptables -F
sudo iptables -X
sudo iptables -Z

Команда -F (flush) очищает все правила во всех цепочках. -X удаляет пользовательские цепочки. -Z обнуляет счётчики пакетов и байтов. После сброса не забудьте заново установить политики по умолчанию.

Совет: Порядок правил критически важен. Правила проверяются сверху вниз — более специфичные правила должны стоять выше общих. Например, запрет конкретного IP нужно ставить перед общим разрешением на порт.

Фильтрация по IP-адресам и подсетям

Одна из самых частых задач — ограничить доступ по IP-адресу. Iptables позволяет указывать как отдельные адреса, так и подсети в нотации CIDR:

# Заблокировать конкретный IP
sudo iptables -A INPUT -s 203.0.113.50 -j DROP

# Заблокировать целую подсеть
sudo iptables -A INPUT -s 10.20.30.0/24 -j DROP

# Разрешить SSH только с определённой подсети
sudo iptables -A INPUT -p tcp --dport 22 -s 192.168.1.0/24 -j ACCEPT

# Разрешить доступ к MySQL только с сервера приложений
sudo iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.10 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 3306 -j DROP

# Блокировка диапазона (несколько адресов через iprange)
sudo iptables -A INPUT -m iprange --src-range 10.0.0.100-10.0.0.200 -j DROP

Модуль iprange удобен, когда нужно указать диапазон адресов, не укладывающийся в одну подсеть CIDR. Для работы с большими списками IP-адресов лучше использовать модуль ipset, который обеспечивает O(1) производительность поиска вместо линейного перебора правил.

Настройка NAT и перенаправление портов

Iptables — мощный инструмент для организации NAT на Linux-маршрутизаторах. Рассмотрим основные сценарии:

# Включаем маршрутизацию пакетов
echo 1 > /proc/sys/net/ipv4/ip_forward

# SNAT: маскарадинг для выхода локальной сети в интернет
sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# SNAT со статическим IP (быстрее MASQUERADE)
sudo iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 203.0.113.1

# DNAT: перенаправление порта 8080 на внутренний веб-сервер
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to-destination 192.168.1.100:80

# Разрешаем пересылку для DNAT
sudo iptables -A FORWARD -p tcp -d 192.168.1.100 --dport 80 -j ACCEPT

# Перенаправление локального порта (redirect)
sudo iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 8080
Совет: Для постоянного включения маршрутизации добавьте строку net.ipv4.ip_forward=1 в файл /etc/sysctl.conf и примените командой sysctl -p.

Защита от атак: rate limiting и connlimit

Iptables предоставляет мощные модули для защиты от брутфорса и DDoS-атак. Модуль limit ограничивает количество совпадений в единицу времени, а connlimit — число одновременных соединений:

# Защита SSH от брутфорса: максимум 3 новых соединения в минуту
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW \
  -m limit --limit 3/min --limit-burst 3 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j DROP

# Ограничение одновременных соединений с одного IP (не более 20)
sudo iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 -j REJECT

# Защита от SYN-flood
sudo iptables -A INPUT -p tcp --syn -m limit --limit 50/s --limit-burst 100 -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -j DROP

# Блокировка фрагментированных пакетов
sudo iptables -A INPUT -f -j DROP

# Блокировка XMAS и NULL сканирования
sudo iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP
sudo iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

Параметр --limit-burst задаёт начальный «запас» совпадений, который расходуется при всплесках трафика и постепенно восполняется согласно значению --limit. Это позволяет допускать кратковременные пики, но блокировать устойчивый поток.

Логирование событий файрвола

Действие LOG записывает информацию о пакете в системный журнал, не прерывая обработку. Это незаменимо для отладки и мониторинга:

# Логирование отброшенных пакетов с префиксом
sudo iptables -A INPUT -j LOG --log-prefix "IPT-DROP: " --log-level 4

# Логирование перед блокировкой конкретного порта
sudo iptables -A INPUT -p tcp --dport 23 -j LOG --log-prefix "TELNET-ATTEMPT: "
sudo iptables -A INPUT -p tcp --dport 23 -j DROP

# Ограничение частоты логирования (чтобы не забить диск)
sudo iptables -A INPUT -m limit --limit 5/min -j LOG --log-prefix "IPT-FLOOD: "

# Просмотр логов
sudo dmesg | grep "IPT-DROP"
sudo journalctl -k | grep "IPT-DROP"
Важно: Без ограничения частоты (--limit) логирование при DDoS-атаке может быстро заполнить /var/log и вызвать отказ сервера. Всегда ставьте лимит на правила LOG.

Сохранение и восстановление правил

Правила iptables хранятся в оперативной памяти и сбрасываются при перезагрузке. Чтобы этого избежать, правила нужно сохранять:

# Сохранение текущих правил в файл
sudo iptables-save > /etc/iptables.rules

# Восстановление правил из файла
sudo iptables-restore < /etc/iptables.rules

# Debian/Ubuntu: установка пакета для автозагрузки правил
sudo apt install iptables-persistent

# Сохранение через netfilter-persistent
sudo netfilter-persistent save
sudo netfilter-persistent reload

# CentOS/RHEL: сохранение через service
sudo service iptables save
# Правила сохраняются в /etc/sysconfig/iptables

Пакет iptables-persistent автоматически загружает правила из /etc/iptables/rules.v4 и /etc/iptables/rules.v6 при каждой загрузке системы. Это наиболее надёжный способ для Debian-систем.

Совет: Перед любыми экспериментами сделайте бэкап текущих правил: iptables-save > ~/iptables_backup_$(date +%F).txt. Это позволит быстро откатиться в случае ошибки.

Практический пример: полная конфигурация для веб-сервера

Собираем всё вместе — готовый набор правил для типичного веб-сервера с SSH, HTTP/HTTPS и базовой защитой:

#!/bin/bash
# Скрипт настройки iptables для веб-сервера

# Сброс текущих правил
iptables -F
iptables -X
iptables -Z

# Политики по умолчанию
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Loopback
iptables -A INPUT -i lo -j ACCEPT

# Установленные соединения
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Блокировка невалидных пакетов
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP

# Защита от сканирования
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

# SSH с rate limiting (порт 22)
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW \
  -m limit --limit 5/min --limit-burst 5 -j ACCEPT

# HTTP и HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# Ping (ограниченно)
iptables -A INPUT -p icmp --icmp-type echo-request \
  -m limit --limit 1/s --limit-burst 4 -j ACCEPT

# Логирование остального перед блокировкой
iptables -A INPUT -m limit --limit 3/min -j LOG --log-prefix "IPT-DROPPED: "

# Сохраняем
iptables-save > /etc/iptables/rules.v4
echo "Firewall configured successfully"

Этот скрипт можно сохранить как /root/firewall.sh, сделать исполняемым (chmod +x /root/firewall.sh) и запускать при необходимости. После проверки работоспособности сохраните правила через netfilter-persistent save.

iptables vs nftables: стоит ли переходить

Начиная с ядра 3.13, в Linux доступен nftables — преемник iptables с единым синтаксисом для IPv4, IPv6 и ARP. Основные отличия:

Для существующих серверов с работающей конфигурацией iptables срочной необходимости в переходе нет. Однако для новых проектов стоит рассмотреть nftables как более современную альтернативу.

Заключение

Iptables — фундаментальный инструмент сетевой безопасности Linux, который должен знать каждый системный администратор. Ключевые принципы настройки: понимание таблиц и цепочек, правильный порядок правил, обязательное разрешение SSH перед установкой политики DROP и регулярное сохранение конфигурации. Используйте rate limiting для защиты от брутфорса, логирование для отладки и iptables-persistent для автозагрузки правил. Помните: хорошо настроенный файрвол — первая линия обороны вашего сервера.

Официальная документация: Debian Wiki, Debian Wiki — iptables

Часто задаваемые вопросы

Что такое iptables: настройка файрвола в Linux — правила, цепочки и примеры?

iptables: настройка файрвола в Linux — правила, цепочки и примеры — это важный аспект системного администрирования, который позволяет настроить и оптимизировать работу IT-инфраструктуры. В данной статье подробно рассматриваются все ключевые моменты.

Как правильно настроить iptables: настройка файрвола в Linux — правила, цепочки и примеры?

Для корректной настройки iptables: настройка файрвола в Linux — правила, цепочки и примеры необходимо следовать пошаговой инструкции, представленной в статье выше. Важно учитывать особенности вашей инфраструктуры и требования безопасности.

Какие типичные ошибки возникают при работе с iptables: настройка файрвола в Linux — правила, цепочки и примеры?

Наиболее частые ошибки при работе с iptables: настройка файрвола в Linux — правила, цепочки и примеры: некорректная конфигурация, недостаточные права доступа и несовместимость версий. Рекомендуем обратиться к специалистам ITFresh для профессиональной настройки.

IT-аутсорсинг

ООО «АйТи Фреш» — настроим защиту вашей инфраструктуры

Аудит сетевой безопасности, настройка файрволов, защита серверов от атак и постоянный мониторинг — мы обеспечим надёжную работу вашей IT-инфраструктуры, чтобы вы могли сосредоточиться на бизнесе.

12+лет на рынке
150+компаний обслуживаем
24/7поддержка