iptables: настройка файрвола в Linux — правила, цепочки и примеры
Безопасность Linux-сервера начинается с правильно настроенного файрвола. iptables — это стандартная утилита для управления брандмауэром в ядре Linux на базе подсистемы Netfilter. Она позволяет фильтровать входящий, исходящий и транзитный трафик, настраивать NAT, ограничивать количество соединений и логировать подозрительную активность. Несмотря на появление nftables и надстроек вроде ufw, именно iptables остаётся основным инструментом на огромном количестве серверов Debian, Ubuntu, CentOS и RHEL. В этой статье мы разберём архитектуру iptables, основные цепочки и таблицы, а также покажем конкретные команды для типичных задач системного администратора.
Архитектура iptables: таблицы и цепочки
Прежде чем писать правила, нужно понимать, как устроен iptables. Система работает с четырьмя таблицами, каждая из которых содержит набор цепочек:
- filter — основная таблица фильтрации пакетов (используется по умолчанию). Содержит цепочки INPUT, FORWARD и OUTPUT.
- nat — трансляция сетевых адресов. Цепочки PREROUTING, OUTPUT и POSTROUTING.
- mangle — модификация заголовков пакетов (TTL, TOS, маркировка). Все пять цепочек.
- raw — работа с пакетами до отслеживания соединений (conntrack). Цепочки PREROUTING и OUTPUT.
Каждая цепочка обрабатывает пакет последовательно: правила проверяются сверху вниз. Как только пакет совпал с условием правила, применяется указанное действие (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 заканчивается указанием действия, которое нужно совершить с пакетом. Базовые действия:
- ACCEPT — пропустить пакет. Обработка в текущей цепочке прекращается.
- DROP — молча отбросить пакет. Отправитель не получает уведомления.
- REJECT — отклонить пакет и отправить ICMP-ответ об ошибке. Клиент сразу узнаёт, что соединение отклонено.
- LOG — записать информацию о пакете в системный журнал и продолжить обработку.
- MASQUERADE — подменить исходный IP-адрес (используется в NAT при динамическом IP).
- DNAT / SNAT — трансляция адреса назначения и источника соответственно.
Настройка базовых правил файрвола
Типичная стратегия: разрешить нужное, запретить всё остальное. Начнём с настройки политик по умолчанию и базовых разрешающих правил:
# Сначала разрешаем 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
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-адресу. 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. Основные отличия:
- Синтаксис — nftables использует более компактный и читаемый формат правил.
- Производительность — nftables поддерживает множества (sets) и словари (maps) на уровне ядра, что быстрее длинных цепочек iptables.
- Совместимость — в современных дистрибутивах команда
iptablesчасто является обёрткой над nftables (iptables-nft). - Миграция — утилита
iptables-translateавтоматически конвертирует правила iptables в формат nft.
Для существующих серверов с работающей конфигурацией 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-инфраструктуры, чтобы вы могли сосредоточиться на бизнесе.