iptables: настройка фаервола с нуля и защита от базовых атак
Один из первых вопросов при настройке нового сервера — как закрыть всё лишнее и открыть только то, что нужно. UFW проще в освоении, но iptables даёт полный контроль и стоит на каждом Linux без дополнительной установки.
Логика iptables простая: правила обрабатываются сверху вниз, первое совпадение — действие. Три основных действия: ACCEPT — пропустить, DROP — заблокировать, RETURN — вернуться в вызывающую цепочку. Три основных цепочки: INPUT — входящий трафик, OUTPUT — исходящий, FORWARD — транзитный (для маршрутизаторов и прокси).
Установка
sudo apt install -y iptables iptables-persistent
iptables-persistent нужен чтобы правила сохранялись после перезагрузки.
Рабочая конфигурация
Очищаем все существующие правила
sudo iptables -F
sudo iptables -X
sudo iptables -t nat -F
sudo iptables -t nat -X
sudo iptables -t mangle -F
sudo iptables -t mangle -X
Разрешаем FORWARD и OUTPUT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
Создаём цепочку WHITELIST
Отдельная цепочка для доверенных источников — удобнее чем смешивать всё в INPUT:
sudo iptables -N WHITELIST
Разрешаем локальный трафик и установленные соединения
sudo iptables -I INPUT -i lo -j ACCEPT -m comment --comment 'Allowing local traffic'
sudo iptables -I INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT -m comment --comment 'Allowing established and related connections'
Без правила для ESTABLISHED,RELATED ответный трафик на исходящие соединения будет блокироваться — это распространённая ошибка при настройке с нуля.
Открываем порты 80 и 443
sudo iptables -I INPUT 1 -p tcp --dport 80 -j ACCEPT
sudo iptables -I INPUT 1 -p tcp --dport 443 -j ACCEPT
Добавляем правила в WHITELIST
sudo iptables -A WHITELIST -s IP_ZABBIX -p tcp --dport 10050 -m comment --comment "Monitoring Zabbix" -j ACCEPT
sudo iptables -A WHITELIST -s YOUR_IP -p tcp --dport 22 -m comment --comment "SSH Jumpbox" -j ACCEPT
IP_ZABBIX и YOUR_IP — замени на реальные адреса. SSH открываем только с конкретного IP, не для всего мира.
Подключаем WHITELIST к INPUT и закрываем всё остальное
sudo iptables -A INPUT -j WHITELIST
sudo iptables -P INPUT DROP
Порядок важен: сначала добавляем разрешающие правила, потом меняем политику по умолчанию на DROP. Если сделать наоборот — отрежешь себя от сервера.
Защита от базовых атак
Null-пакеты
Пакеты без флагов используются для сканирования портов:
sudo iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP
SYN-флуд
Ограничиваем количество новых соединений с одного источника:
sudo iptables -A INPUT -p tcp --syn -m limit --limit 10/s --limit-burst 20 -j ACCEPT
sudo iptables -A INPUT -p tcp --syn -j DROP
--limit 10/s — не более 10 новых соединений в секунду. --limit-burst 20 — разрешает всплеск до 20 соединений, после чего лимит начинает работать.
Отброс инвалидных пакетов
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
Сохраняем правила
sudo iptables-save > /etc/iptables/rules.v4
sudo netfilter-persistent save
sudo netfilter-persistent reload
Просмотр текущих правил
sudo iptables -L INPUT --line-numbers
sudo iptables -L WHITELIST --line-numbers
sudo iptables -S
Восстановление
Если правила ещё не сохранены и нужно откатиться:
# Ubuntu/Debian
sudo iptables-restore < /etc/iptables.rules
# CentOS/RedHat
iptables-restore < /etc/sysconfig/iptables
Готовый скрипт
Если не хочешь настраивать вручную — я собрал bash-скрипт с этой конфигурацией:
git clone https://github.com/Shipssv83/Iptables-ruls.git
sudo chmod +x iptables-ruls.sh
sudo ./iptables-ruls.sh
Если настраиваешь безопасность серверной инфраструктуры и нужна помощь — пиши на [email protected] или заходи на 1it.pro.