Настройка 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 без разрешения может отключить вас от сервера. Всегда проверяйте правила перед применением.
Принцип работы¶
- Пакет попадает в соответствующую цепочку (
INPUT,OUTPUT,FORWARD). - Правила проверяются по порядку — как только найдено совпадение, выполняется указанное действие.
- Если не найдено ни одного совпадения, применяется политика по умолчанию (
policy).
Действия (targets)¶
| Действие | Поведение | Рекомендация |
|---|---|---|
ACCEPT | Разрешить пакет | Для доверенных сервисов (SSH, HTTP) |
DROP | Тихо отбросить пакет (без ответа) | Лучший выбор для безопасности — скрывает факт существования порта |
REJECT | Отклонить с отправкой ICMP-ошибки (например, port-unreachable) | Используйте, если нужна обратная связь (например, для отладки) |
Примечание
Правило безопасности:
По умолчанию — запрещать всё, а потом разрешать только необходимое.
Базовый синтаксис команд¶
Основные опции:¶
| Опция | Назначение |
|---|---|
-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 | Ограничение числа подключений |
Просмотр и диагностика¶
Вывести все правила (читаемо):¶
--n — не резолвить имена (быстрее); - -v — подробный вывод; - --line-numbers — показать номера правил (удобно для удаления). 
Посмотреть политики по умолчанию:¶
Примеры практических правил¶
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 и ранее:¶
Для Debian / Ubuntu:¶
Установите пакет сохранения:
При установке система предложит сохранить текущие правила — выберите «Да».Обновить сохранённые правила позже:
Примечание
Перед перезагрузкой проверьте правила:
Флаг-t — только проверка синтаксиса, без применения. Удаление правил¶
Удалить по номеру (см. --line-numbers):¶
Удалить по точному совпадению:¶
Очистить цепочку:¶
Сбросить политики по умолчанию:¶
Информация
- Тестируйте правила локально или через консоль (не по SSH!), особенно при изменении
INPUT. - Используйте
screenилиtmux— чтобы не потерять сессию при ошибке. - Рассмотрите переход на более современные инструменты:
ufw— упрощённый интерфейс дляiptables(Ubuntu/Debian);firewalld— динамический firewall для RHEL/CentOS;nftables— будущее ядра Linux (более эффективный и лаконичный синтаксис).