Home » Основы iptables — распространённые правила и команды фаервола
Основы iptables — распространённые правила и команды фаервола

Основы iptables — распространённые правила и команды фаервола

Если вы хотя бы раз настраивали сервер в продакшене, то знаете: безопасность — это не про “поставил и забыл”. Это про каждый день, каждое соединение, каждый пакет, который приходит на ваш сервер. И тут на помощь приходит iptables — мощный, но иногда пугающий инструмент для настройки файрвола в Linux.

Да, существуют более современные решения вроде nftables и firewalld, но iptables до сих пор остаётся стандартом де-факто на большинстве серверов. Понимание его основ — это как знание SQL для разработчика или TCP/IP для сетевого администратора. Без этого никуда.

В этой статье мы разберём три ключевых момента: как работает iptables изнутри, как быстро настроить базовую защиту сервера, и какие команды и правила нужно знать для ежедневной работы. Плюс куча практических примеров, которые можно сразу применить на своём VPS.

Как работает iptables: цепочки, таблицы и правила

Перед тем как начать кликать по клавишам, давайте разберёмся, что происходит под капотом. iptables работает с netfilter — подсистемой ядра Linux, которая перехватывает сетевые пакеты на разных этапах их обработки.

Представьте себе конвейер обработки пакетов. Каждый пакет проходит через несколько станций (chains), на каждой из которых может быть принято решение: пропустить (ACCEPT), отклонить (DROP) или перенаправить (REDIRECT).

Основные цепочки:

  • INPUT — входящие пакеты, предназначенные для локального процесса
  • OUTPUT — исходящие пакеты от локального процесса
  • FORWARD — пакеты, которые проходят через сервер транзитом
  • PREROUTING — обработка пакетов до принятия решения о маршрутизации
  • POSTROUTING — обработка пакетов после принятия решения о маршрутизации

Цепочки объединяются в таблицы по функциональности:

  • filter — фильтрация пакетов (по умолчанию)
  • nat — трансляция адресов
  • mangle — модификация пакетов
  • raw — обработка пакетов до connection tracking

Базовые команды: с чего начать

Начнём с просмотра текущих правил. Это первое, что нужно сделать на любом сервере:

# Посмотреть все правила с номерами строк
iptables -L -n --line-numbers

# Посмотреть правила в формате команд
iptables-save

# Посмотреть статистику по правилам
iptables -L -n -v

Ключ -n отключает резолвинг имён — это ускоряет выполнение команды и избавляет от потенциальных проблем с DNS.

Базовые операции с правилами:

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

# Вставить правило в начало цепочки
iptables -I INPUT -p tcp --dport 22 -j ACCEPT

# Вставить правило в определённую позицию
iptables -I INPUT 3 -p tcp --dport 22 -j ACCEPT

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

# Удалить конкретное правило
iptables -D INPUT -p tcp --dport 22 -j ACCEPT

# Очистить все правила в цепочке
iptables -F INPUT

# Очистить все правила во всех цепочках
iptables -F

Практические примеры настройки

Теперь перейдём к реальным сценариям. Вот базовый набор правил для типичного веб-сервера:

# Сброс всех правил
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
iptables -t mangle -F
iptables -t mangle -X

# Политики по умолчанию
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

# SSH (измените порт на свой)
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT

# HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m conntrack --ctstate NEW -j ACCEPT

# Ping
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT

Сохранение правил зависит от дистрибутива:

# Ubuntu/Debian
iptables-save > /etc/iptables/rules.v4

# CentOS/RHEL
service iptables save

# Или универсальный способ
iptables-save > /etc/iptables.rules

Защита от атак: продвинутые правила

Базовые правила — это хорошо, но в реальном мире нужно больше. Вот несколько примеров защиты от распространённых атак:

Защита от SYN flood:

# Ограничение SYN пакетов
iptables -A INPUT -p tcp --syn -m limit --limit 1/s --limit-burst 3 -j ACCEPT
iptables -A INPUT -p tcp --syn -j DROP

Защита от брутфорса SSH:

# Максимум 3 попытки в минуту
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set --name SSH
iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP

Защита от сканирования портов:

# Блокировка NULL пакетов
iptables -A INPUT -p tcp --tcp-flags ALL NONE -j DROP

# Блокировка syn-flood пакетов
iptables -A INPUT -p tcp ! --syn -m conntrack --ctstate NEW -j DROP

# Блокировка XMAS пакетов
iptables -A INPUT -p tcp --tcp-flags ALL ALL -j DROP

Работа с NAT и проксированием

Если ваш сервер работает как шлюз или вы настраиваете проксирование, то без NAT не обойтись:

# Включение форвардинга
echo 1 > /proc/sys/net/ipv4/ip_forward

# Маскарадинг для исходящих соединений
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

# Проброс портов
iptables -t nat -A PREROUTING -p tcp --dport 8080 -j REDIRECT --to-port 80

# DNAT для перенаправления трафика
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.100:8080

Это особенно полезно при работе с контейнерами или при настройке нескольких сервисов на одном выделенном сервере.

Логирование и мониторинг

Без логов вы летаете вслепую. Вот как настроить логирование подозрительной активности:

# Создание цепочки для логирования
iptables -N LOG_DROP

# Логирование с лимитом
iptables -A LOG_DROP -m limit --limit 2/min -j LOG --log-prefix "IPTables-Dropped: " --log-level 4

# Сброс пакета после логирования
iptables -A LOG_DROP -j DROP

# Использование цепочки
iptables -A INPUT -p tcp --dport 23 -j LOG_DROP

Логи будут писаться в /var/log/messages или /var/log/syslog в зависимости от дистрибутива.

Сравнение с альтернативами

Решение Плюсы Минусы Лучше использовать для
iptables Универсальность, стабильность, широкая поддержка Сложный синтаксис, производительность Продакшен-серверы, legacy-системы
nftables Лучшая производительность, единый синтаксис Меньше материалов, относительно новое Современные дистрибутивы, high-load
firewalld Простота настройки, зоны, динамические правила Дополнительная абстракция, overhead Desktop-системы, простые серверы
ufw Максимальная простота Ограниченная функциональность Быстрая настройка, начинающие

Автоматизация и скрипты

Ручная настройка — это хорошо для понимания, но в реальной жизни всё должно быть автоматизировано. Вот пример простого скрипта для развёртывания базовых правил:

#!/bin/bash
# firewall-setup.sh

# Функция для безопасного применения правил
apply_rules() {
    # Временно разрешаем SSH, чтобы не заблокировать себя
    iptables -I INPUT -p tcp --dport 22 -j ACCEPT
    
    # Очистка старых правил
    iptables -F
    iptables -X
    
    # Политики по умолчанию
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT ACCEPT
    
    # Базовые правила
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    
    # SSH с защитой от брутфорса
    iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set --name SSH
    iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP
    iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -j ACCEPT
    
    # Веб-сервисы
    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 -j ACCEPT
    
    # Сохранение правил
    iptables-save > /etc/iptables/rules.v4
    
    echo "Firewall configured successfully"
}

# Проверка прав
if [ "$EUID" -ne 0 ]; then
    echo "Run as root"
    exit 1
fi

apply_rules

Для продакшена рекомендую использовать Ansible или подобные инструменты. Вот пример Ansible playbook:

---
- name: Configure iptables
  hosts: servers
  become: yes
  tasks:
    - name: Install iptables-persistent
      apt:
        name: iptables-persistent
        state: present
      
    - name: Configure iptables rules
      iptables:
        chain: INPUT
        protocol: tcp
        destination_port: "{{ item }}"
        jump: ACCEPT
        state: present
      loop:
        - 22
        - 80
        - 443
      
    - name: Save iptables rules
      shell: iptables-save > /etc/iptables/rules.v4

Отладка и troubleshooting

Когда что-то не работает (а это случается часто), нужно уметь быстро найти проблему:

# Включить детальное логирование
iptables -A INPUT -j LOG --log-level 4 --log-prefix "Debug: "

# Посмотреть статистику правил
iptables -L -n -v --line-numbers

# Проследить прохождение пакета
iptables -t raw -A PREROUTING -p tcp --dport 80 -j TRACE

# Посмотреть счётчики
iptables -L -n -v | grep -E "Chain|pkts"

Полезные команды для диагностики:

# Посмотреть активные соединения
ss -tuln

# Проверить, слушает ли сервис
netstat -tlnp | grep :80

# Тестирование соединения
telnet your-server.com 80

# Проверка из другой сети
nmap -p 80,443 your-server.com

Нестандартные применения

iptables можно использовать не только для безопасности. Вот несколько интересных применений:

Балансировка нагрузки:

# Простой round-robin между серверами
iptables -t nat -A PREROUTING -p tcp --dport 80 -m statistic --mode nth --every 2 --packet 0 -j DNAT --to-destination 192.168.1.10:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.1.11:80

Ограничение bandwidth:

# Ограничение скорости для определённого IP
iptables -A INPUT -s 192.168.1.100 -m limit --limit 50/sec --limit-burst 100 -j ACCEPT
iptables -A INPUT -s 192.168.1.100 -j DROP

Геоблокировка (с модулем geoip):

# Блокировка трафика из определённых стран
iptables -A INPUT -m geoip --src-cc CN,RU -j DROP

Интеграция с fail2ban:

fail2ban отлично работает с iptables для автоматической блокировки IP-адресов:

# /etc/fail2ban/jail.local
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = /var/log/auth.log
maxretry = 3
bantime = 3600
findtime = 600
backend = systemd

Производительность и оптимизация

При большом количестве правил iptables может стать узким местом. Вот несколько советов по оптимизации:

  • Порядок правил имеет значение — часто используемые правила размещайте в начале
  • Используйте ipset для работы с большими списками IP-адресов
  • Группируйте правила по протоколам и портам
  • Избегайте сложных регулярных выражений в правилах

Пример использования ipset:

# Создание множества IP-адресов
ipset create blacklist hash:ip

# Добавление IP в множество
ipset add blacklist 192.168.1.100
ipset add blacklist 10.0.0.50

# Использование в iptables
iptables -A INPUT -m set --match-set blacklist src -j DROP

Заключение и рекомендации

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

Для начинающих:

  • Начните с простых правил и постепенно усложняйте
  • Всегда тестируйте правила на тестовом сервере
  • Ведите бэкапы конфигурации
  • Изучите основы сетевых протоколов

Для продакшена:

  • Автоматизируйте развёртывание правил
  • Настройте мониторинг и алерты
  • Регулярно аудируйте правила
  • Рассмотрите переход на nftables для новых проектов

Для высоконагруженных систем:

  • Используйте ipset для больших списков
  • Оптимизируйте порядок правил
  • Рассмотрите аппаратные решения для критичных сценариев
  • Мониторьте производительность

Помните: идеальной защиты не существует. iptables — это лишь один из слоёв безопасности. Используйте его в комплексе с другими мерами защиты, регулярно обновляйте систему и следите за новыми угрозами.

И самое главное — не бойтесь экспериментировать! Лучший способ изучить iptables — это практика. Поднимите тестовый сервер, попробуйте разные сценарии, сломайте что-нибудь и почините. Именно так и приходит понимание.


В этой статье собрана информация и материалы из различных интернет-источников. Мы признаем и ценим работу всех оригинальных авторов, издателей и веб-сайтов. Несмотря на то, что были приложены все усилия для надлежащего указания исходного материала, любая непреднамеренная оплошность или упущение не являются нарушением авторских прав. Все упомянутые товарные знаки, логотипы и изображения являются собственностью соответствующих владельцев. Если вы считаете, что какой-либо контент, использованный в этой статье, нарушает ваши авторские права, немедленно свяжитесь с нами для рассмотрения и принятия оперативных мер.

Данная статья предназначена исключительно для ознакомительных и образовательных целей и не ущемляет права правообладателей. Если какой-либо материал, защищенный авторским правом, был использован без должного упоминания или с нарушением законов об авторском праве, это непреднамеренно, и мы исправим это незамедлительно после уведомления. Обратите внимание, что переиздание, распространение или воспроизведение части или всего содержимого в любой форме запрещено без письменного разрешения автора и владельца веб-сайта. Для получения разрешений или дополнительных запросов, пожалуйста, свяжитесь с нами.

Leave a reply

Your email address will not be published. Required fields are marked