iptables
iptables
iptables — утилита для управления правилами межсетевого экрана Linux, работающего в подсистеме ядра Netfilter. С её помощью фильтруют трафик, ограничивают доступ к портам, настраивают маршрутизацию, NAT и проброс портов.
В современных дистрибутивах
iptablesчасто работает через совместимый слой надnftables. Перед настройкой проверьте используемый backend и не смешивайте ручные правила сufw,firewalld, Docker или Kubernetes без понимания их взаимодействия.
Основные понятия
Правила объединяются в цепочки, а цепочки находятся в таблицах. Пакеты проверяются по правилам сверху вниз. Первое подходящее завершающее действие обычно прекращает дальнейшую обработку.
Таблицы
| Таблица | Назначение |
|---|---|
filter |
Разрешение и блокировка трафика; используется по умолчанию |
nat |
Трансляция адресов и портов |
mangle |
Изменение специальных параметров пакетов |
raw |
Управление отслеживанием соединений |
security |
Дополнительные механизмы безопасности |
Встроенные цепочки
INPUT— пакеты, адресованные локальной системе.OUTPUT— пакеты, созданные локальной системой.FORWARD— транзитные пакеты, проходящие через систему.PREROUTING— обработка до выбора маршрута; часто используется для DNAT.POSTROUTING— обработка после выбора маршрута; используется для SNAT иMASQUERADE.
Упрощённые маршруты пакета:
Входящий локальный трафик:
PREROUTING → INPUT → локальный процесс
Исходящий локальный трафик:
локальный процесс → OUTPUT → POSTROUTING
Транзитный трафик:
PREROUTING → FORWARD → POSTROUTINGПросмотр правил
Показать правила основной таблицы filter:
sudo iptables -L
sudo iptables -L -n -v --line-numbers-nне выполняет DNS-разрешение и показывает порты числами;-vвыводит интерфейсы и счётчики;--line-numbersпоказывает номера правил.
Показать правила таблицы nat:
sudo iptables -t nat -L -n -v --line-numbersВывести конфигурацию в форме команд:
sudo iptables -S
sudo iptables -t nat -SПроверить реализацию команды:
iptables --version
sudo nft list rulesetЕсли версия содержит nf_tables, команда использует совместимый backend nftables.
Добавление и удаление правил
Общая форма:
iptables [-t таблица] команда цепочка условия -j действиеОсновные команды:
| Опция | Назначение |
|---|---|
-A |
добавить правило в конец цепочки |
-I |
вставить правило в начало или указанную позицию |
-D |
удалить правило |
-R |
заменить правило |
-C |
проверить наличие правила |
-F |
очистить цепочку или таблицу |
-N |
создать пользовательскую цепочку |
-X |
удалить пустую пользовательскую цепочку |
-P |
установить политику встроенной цепочки |
-Z |
обнулить счётчики |
Разрешить входящие TCP-подключения к SSH:
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPTВставить правило первым:
sudo iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPTПроверить наличие правила:
sudo iptables -C INPUT -p tcp --dport 22 -j ACCEPTУдалить правило по полному описанию:
sudo iptables -D INPUT -p tcp --dport 22 -j ACCEPTУдалить правило по номеру:
sudo iptables -L INPUT -n --line-numbers
sudo iptables -D INPUT 3После удаления нумерация меняется, поэтому перед следующей операцией снова просмотрите цепочку.
Условия выбора пакетов
Протоколы и порты
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p icmp -j ACCEPTНесколько портов:
sudo iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPTДиапазон портов:
sudo iptables -A INPUT -p tcp --dport 8000:8100 -j ACCEPTIP-адреса и сети
Разрешить SSH только из административной сети:
sudo iptables -A INPUT -p tcp -s 192.168.10.0/24 --dport 22 -j ACCEPTЗаблокировать отдельный адрес:
sudo iptables -A INPUT -s 203.0.113.25 -j DROPУсловия назначения задаются через -d:
sudo iptables -A OUTPUT -p tcp -d 203.0.113.10 --dport 443 -j ACCEPTСетевые интерфейсы
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
sudo iptables -A OUTPUT -o eth0 -p tcp --dport 443 -j ACCEPT-i— входной интерфейс;-o— исходящий интерфейс.
Состояния соединений
Модуль conntrack делает firewall stateful — учитывающим состояние соединений:
sudo iptables -A INPUT -m conntrack \
--ctstate ESTABLISHED,RELATED -j ACCEPTОсновные состояния:
| Состояние | Значение |
|---|---|
NEW |
новое соединение |
ESTABLISHED |
пакет существующего соединения |
RELATED |
новое соединение, связанное с существующим |
INVALID |
пакет не удалось корректно классифицировать |
Типовые правила:
sudo iptables -A INPUT -m conntrack \
--ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROPПравило ESTABLISHED,RELATED обычно размещают в начале цепочки. Оно разрешает ответный трафик для соединений, которые были разрешены ранее.
Действия над пакетами
| Target | Действие |
|---|---|
ACCEPT |
разрешить пакет |
DROP |
молча отбросить пакет |
REJECT |
отклонить пакет и отправить ответ об ошибке |
LOG |
записать информацию и продолжить обработку |
RETURN |
вернуться из пользовательской цепочки |
DNAT |
изменить адрес или порт назначения |
SNAT |
изменить адрес источника |
MASQUERADE |
динамический вариант SNAT |
REDIRECT |
направить трафик на локальный порт |
Примеры:
sudo iptables -A INPUT -p tcp --dport 23 \
-j REJECT --reject-with tcp-reset
sudo iptables -A INPUT -p tcp --dport 25 -j DROPDROP не отвечает отправителю. REJECT сообщает об отказе, поэтому клиент обычно получает ошибку быстрее.
Политики по умолчанию
Политика применяется, если пакет не совпал ни с одним правилом:
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPTПеред установкой
INPUT DROPна удалённом сервере разрешите текущие соединения и SSH. Иначе можно потерять доступ. Желательно иметь резервную консоль и не закрывать существующую SSH-сессию до проверки новой.
Базовый набор правил веб-сервера:
# Сначала разрешения
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack \
--ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
sudo iptables -A INPUT -p tcp -s 192.168.10.0/24 \
--dport 22 -m conntrack --ctstate NEW -j ACCEPT
sudo iptables -A INPUT -p tcp -m multiport \
--dports 80,443 -m conntrack --ctstate NEW -j ACCEPT
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Полностью блокировать ICMP без необходимости не рекомендуется: это мешает диагностике и некоторым сетевым механизмам.
Пользовательские цепочки
Пользовательские цепочки помогают группировать правила:
sudo iptables -N SSH_IN
sudo iptables -A INPUT -p tcp --dport 22 -j SSH_IN
sudo iptables -A SSH_IN -s 192.168.10.0/24 -j ACCEPT
sudo iptables -A SSH_IN -j RETURNУдаление цепочки:
sudo iptables -F SSH_IN
# Сначала удалите все переходы на SSH_IN
sudo iptables -X SSH_INNAT и маршрутизация
Для маршрутизации пакетов между интерфейсами включите IPv4 forwarding:
sudo sysctl -w net.ipv4.ip_forward=1Постоянная настройка в /etc/sysctl.d/99-forwarding.conf:
net.ipv4.ip_forward = 1Применить:
sudo sysctl --systemMASQUERADE
Пусть lan0 подключён к сети 192.168.1.0/24, а eth0 — к интернету:
sudo iptables -t nat -A POSTROUTING \
-s 192.168.1.0/24 -o eth0 -j MASQUERADE
sudo iptables -A FORWARD -i lan0 -o eth0 \
-s 192.168.1.0/24 -j ACCEPT
sudo iptables -A FORWARD -i eth0 -o lan0 \
-d 192.168.1.0/24 -m conntrack \
--ctstate ESTABLISHED,RELATED -j ACCEPTMASQUERADE обычно применяют при динамическом внешнем IP. Для статического адреса можно использовать SNAT:
sudo iptables -t nat -A POSTROUTING \
-s 192.168.1.0/24 -o eth0 \
-j SNAT --to-source 203.0.113.10Проброс порта через DNAT
Проброс внешнего порта 8080 на 192.168.1.20:80:
sudo iptables -t nat -A PREROUTING -i eth0 \
-p tcp --dport 8080 \
-j DNAT --to-destination 192.168.1.20:80
sudo iptables -A FORWARD -i eth0 -o lan0 \
-p tcp -d 192.168.1.20 --dport 80 \
-m conntrack --ctstate NEW,ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A FORWARD -i lan0 -o eth0 \
-p tcp -s 192.168.1.20 --sport 80 \
-m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPTДля работы нужны корректная маршрутизация и включённый IP forwarding.
Перенаправление на локальный порт
sudo iptables -t nat -A PREROUTING -i eth0 \
-p tcp --dport 80 -j REDIRECT --to-ports 8080Логирование
Target LOG не блокирует пакет, а только записывает информацию:
sudo iptables -A INPUT -m limit \
--limit 5/min --limit-burst 10 \
-j LOG --log-prefix "iptables denied: " --log-level 4
sudo iptables -A INPUT -j DROPОграничение частоты защищает журнал от переполнения. Просмотр сообщений:
sudo journalctl -k -f
sudo dmesg -wНа системах с rsyslog записи также могут находиться в /var/log/kern.log или /var/log/messages.
Счётчики пакетов и байтов:
sudo iptables -L -n -v
sudo iptables -ZСохранение и восстановление
Изменения обычно хранятся в памяти и могут исчезнуть после перезагрузки.
Экспорт правил:
sudo iptables-save > firewall.rules
sudo ip6tables-save > firewall6.rulesВосстановление:
sudo iptables-restore < firewall.rules
sudo ip6tables-restore < firewall6.rulesВ Debian/Ubuntu можно использовать iptables-persistent:
sudo apt update
sudo apt install iptables-persistent
sudo netfilter-persistent saveОбычно IPv4- и IPv6-правила сохраняются в:
/etc/iptables/rules.v4
/etc/iptables/rules.v6В других дистрибутивах механизм зависит от используемого firewall-стека. Не включайте одновременно несколько сервисов управления одними правилами.
IPv6 и ip6tables
IPv4-правила не защищают IPv6. Для него используется ip6tables:
sudo ip6tables -L -n -v --line-numbers
sudo ip6tables -A INPUT -m conntrack \
--ctstate ESTABLISHED,RELATED -j ACCEPTЕсли узел доступен по IPv6, настройте отдельный набор правил. Не блокируйте весь ICMPv6: он нужен для обнаружения соседей, Path MTU Discovery и других базовых функций IPv6.
Очистка правил
Очистить конкретную цепочку:
sudo iptables -F INPUTОчистить таблицу filter и пользовательские цепочки:
sudo iptables -F
sudo iptables -XОчистить таблицу nat:
sudo iptables -t nat -F
sudo iptables -t nat -XОчистка правил и изменение политик могут немедленно оборвать сеть. Перед экспериментом сохраните конфигурацию:
sudo iptables-save > /root/iptables.before-change.rulesОткат:
sudo iptables-restore < /root/iptables.before-change.rulesДиагностика
Проверить интерфейсы и маршруты:
ip -br address
ip routeПроверить слушающие сервисы:
sudo ss -lntupПроверить порядок правил и счётчики:
sudo iptables -L -n -v --line-numbers
sudo iptables -t nat -L -n -v --line-numbersПроверить порт с другого узла:
nc -vz example.com 443
curl -v https://example.com/Если порт разрешён, но недоступен, проверьте:
- слушает ли сервис нужный адрес и порт;
- находится ли разрешающее правило выше блокирующего;
- корректны ли маршруты и NAT;
- настроены ли IPv4 и IPv6;
- нет ли внешнего cloud firewall или security group;
- не управляет ли правилами
ufw,firewalld, Docker или другой сервис.
Docker, Kubernetes и libvirt могут автоматически создавать цепочки. Команды iptables -F и iptables -t nat -F способны нарушить работу их сетей.
iptables и nftables
nftables — современная замена классическому интерфейсу iptables. Во многих системах существуют варианты:
iptables-legacy— старый backend;iptables-nft— совместимый интерфейс поверх nftables.
Проверка:
iptables --version
sudo nft list rulesetПрактические рекомендации:
- выберите один основной инструмент управления firewall;
- не редактируйте вручную правила, которыми управляет другой сервис;
- для новой конфигурации изучите nftables;
- при поддержке старой системы учитывайте различия
legacyиnft; - всегда проверяйте правила IPv4 и IPv6.
Пример скрипта веб-сервера
#!/usr/bin/env bash
set -Eeuo pipefail
# Внимание: сначала протестируйте через резервную консоль.
iptables -F
iptables -X
iptables -P INPUT ACCEPT
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
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
# Замените сеть на реальную административную сеть.
iptables -A INPUT -p tcp -s 192.168.10.0/24 \
--dport 22 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p tcp -m multiport \
--dports 80,443 -m conntrack --ctstate NEW -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# Блокирующая политика устанавливается последней.
iptables -P INPUT DROPСкрипт необходимо выполнять от root. Пример не учитывает специфические требования Docker, VPN, IPv6 и конкретной инфраструктуры.
Краткая памятка
# Просмотр
sudo iptables -L -n -v --line-numbers
sudo iptables -S
sudo iptables -t nat -L -n -v
# Разрешения
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A INPUT -m conntrack \
--ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp -m multiport \
--dports 80,443 -j ACCEPT
# Удаление правила
sudo iptables -D INPUT НОМЕР
# Политики
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
# Сохранение и восстановление
sudo iptables-save > firewall.rules
sudo iptables-restore < firewall.rules
# IPv6
sudo ip6tables -L -n -v --line-numbersПравила безопасной работы
- Сохраняйте текущие правила перед изменениями.
- На удалённом сервере держите открытой резервную SSH-сессию или консоль.
- Разрешайте loopback,
ESTABLISHED,RELATEDи административный доступ до включенияINPUT DROP. - Ограничивайте SSH доверенными адресами, если это возможно.
- Учитывайте порядок правил: специфичные разрешения должны стоять выше общего запрета.
- Настраивайте IPv6 отдельно.
- Ограничивайте частоту
LOG, чтобы не заполнить диск. - Не очищайте правила Docker, Kubernetes или libvirt вслепую.
- Проверяйте не только доступность разрешённых сервисов, но и блокировку запрещённых.
- Тестируйте автоматическое восстановление правил после перезагрузки.