Перейти к содержанию

Настройка iptables: базовый межсетевой экран Linux

iptables — это встроенный фреймворк фильтрации и управления сетевым трафиком в ядре Linux. Он позволяет гибко управлять входящими, исходящими и транзитными соединениями на основе правил.

Примечание

iptables предустановлен почти во всех дистрибутивах Linux.
В новых системах (RHEL 8+, Ubuntu 20.04+) по умолчанию может использоваться nftables (команда nft), но iptables остаётся совместимым через legacy-интерфейс (iptables-legacy).
Для серверов в облаке или VPS — настройка iptables критически важна для безопасности.


Основные понятия

Три цепочки (chains)

Цепочка Назначение
INPUT Входящий трафик на сервер (SSH, HTTP, и т.д.)
OUTPUT Исходящий трафик с сервера (обновления, API-запросы)
FORWARD Трафик, проходящий через сервер (только при маршрутизации/NAT)

Примечание

Будьте осторожны с INPUT!
Блокировка порта 22 без разрешения может отключить вас от сервера. Всегда проверяйте правила перед применением.

Принцип работы

  1. Пакет попадает в соответствующую цепочку (INPUT, OUTPUT, FORWARD).
  2. Правила проверяются по порядку — как только найдено совпадение, выполняется указанное действие.
  3. Если не найдено ни одного совпадения, применяется политика по умолчанию (policy).

Действия (targets)

Действие Поведение Рекомендация
ACCEPT Разрешить пакет Для доверенных сервисов (SSH, HTTP)
DROP Тихо отбросить пакет (без ответа) Лучший выбор для безопасности — скрывает факт существования порта
REJECT Отклонить с отправкой ICMP-ошибки (например, port-unreachable) Используйте, если нужна обратная связь (например, для отладки)

Примечание

Правило безопасности:
По умолчанию — запрещать всё, а потом разрешать только необходимое.


Базовый синтаксис команд

iptables [опции] ЦЕПОЧКА [критерии] -j ДЕЙСТВИЕ

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

Опция Назначение
-A Добавить правило в конец цепочки
-I Вставить правило в начало (или по номеру: -I INPUT 1)
-D Удалить правило (по номеру или копированием строки)
-L Показать правила
-F Очистить все правила в цепочке
-P Установить политику по умолчанию (ACCEPT, DROP)

Часто используемые критерии:

Опция Пример Описание
-p tcp/udp/icmp -p tcp Протокол
--dport N --dport 22 Порт назначения
-s IP/МАСКА -s 192.168.1.5
-s 203.0.113.0/24
Источник (IP или подсеть)
-i интерфейс -i eth0 Входной интерфейс
-m state --state NEW,ESTABLISHED -m state --state NEW Состояние соединения
-m connlimit --connlimit-above 5 Ограничение числа подключений

Просмотр и диагностика

Вывести все правила (читаемо):

sudo iptables -L -n -v --line-numbers
- -n — не резолвить имена (быстрее); - -v — подробный вывод; - --line-numbers — показать номера правил (удобно для удаления).

Посмотреть политики по умолчанию:

sudo iptables -S | grep '^:'
# Или:
sudo iptables -L | head -3

Примеры практических правил

1. Безопасная базовая настройка (рекомендуется!)

# 1. Разрешить весь трафик на loopback
sudo iptables -A INPUT -i lo -j ACCEPT

# 2. Разрешить уже установленные соединения (важно!)
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# 3. Разрешить SSH (замени 22 на свой порт, если изменён!)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

# 4. Разрешить HTTP/HTTPS
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

# 5. Запретить ВСЁ остальное по умолчанию
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT   # ← обычно разрешаем исходящий

2. Ограничение доступа

# Разрешить MySQL (3306) только с одного IP
sudo iptables -A INPUT -s 203.0.113.15 -p tcp --dport 3306 -j ACCEPT

# Заблокировать весь трафик с подозрительного IP
sudo iptables -A INPUT -s 198.51.100.77 -j DROP

3. Защита от атак

# Блокировать неправильные/битые пакеты
sudo iptables -A INPUT -m state --state INVALID -j DROP

# Защита от SYN-flood
sudo iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
sudo iptables -A INPUT -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j DROP

# Ограничить подключения к HTTP (не более 20 одновременных с одного IP)
sudo iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 20 --connlimit-mask 32 -j DROP

4. Логирование

# Логировать попытки подключения к закрытым портам (первые 5 в минуту)
sudo iptables -A INPUT -p tcp -m multiport --dports 22,3389,5900 \
  -m limit --limit 5/min -j LOG --log-prefix "PORT-SCAN: " --log-level 4

# А затем отклонять
sudo iptables -A INPUT -p tcp -m multiport --dports 22,3389,5900 -j DROP

Сохранение правил после перезагрузки

Правила iptables не сохраняются автоматически — они хранятся только в памяти ядра.

Для RHEL / CentOS 7 и ранее:

sudo /sbin/service iptables save
# или
sudo iptables-save > /etc/sysconfig/iptables

Для Debian / Ubuntu:

Установите пакет сохранения:

sudo apt update && sudo apt install iptables-persistent
При установке система предложит сохранить текущие правила — выберите «Да».

Обновить сохранённые правила позже:

sudo netfilter-persistent save
# или напрямую:
sudo iptables-save > /etc/iptables/rules.v4

Примечание

Перед перезагрузкой проверьте правила:

sudo iptables-restore -t < /etc/iptables/rules.v4
Флаг -t — только проверка синтаксиса, без применения.


Удаление правил

Удалить по номеру (см. --line-numbers):

sudo iptables -D INPUT 3   # удалить правило №3 в цепочке INPUT

Удалить по точному совпадению:

sudo iptables -D INPUT -s 198.51.100.77 -j DROP

Очистить цепочку:

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

Сбросить политики по умолчанию:

sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

Информация

  1. Тестируйте правила локально или через консоль (не по SSH!), особенно при изменении INPUT.
  2. Используйте screen или tmux — чтобы не потерять сессию при ошибке.
  3. Рассмотрите переход на более современные инструменты:
  4. ufw — упрощённый интерфейс для iptables (Ubuntu/Debian);
  5. firewalld — динамический firewall для RHEL/CentOS;
  6. nftables — будущее ядра Linux (более эффективный и лаконичный синтаксис).
question_mark
Я могу вам чем-то помочь?
question_mark
ИИ Помощник ×