В чем разница между iptables -S и iptables-save?

Вопрос или проблема

iptables -S выводит один набор правил, а iptables-save выводит супермножество с множеством дополнительных правил. В чем разница? И почему iptables -S не выводит дополнительные правила?

Например, iptables -S не выводит правило, которое изменяет адрес источника для SMTP (порт 25) пакетов через интерфейс Wireguard (wg0) (-A POSTROUTING -o wg0 -j SNAT --to-source 10.0.0.2), но iptables-save выводит это правило? Я бы предположил, что iptables -S выводит только одну цепочку, но iptables -h говорит:

  --list-rules -S [chain [rulenum]]
                Вывести правила в цепочке или во всех цепочках

… что, похоже, подразумевает, что он выведет все цепочки, если не будет задан аргумент цепочки.

# Сгенерировано iptables-save v1.8.4 в сб Jan 30 06:47:36 2021
*mangle
:PREROUTING ACCEPT [175762948:152635787911]
:INPUT ACCEPT [85129338:67722036020]
:FORWARD ACCEPT [90631707:84913651708]
:OUTPUT ACCEPT [43631301:2479371699]
:POSTROUTING ACCEPT [134263118:87393032790]
-A OUTPUT -p tcp -m tcp --dport 465 -j MARK --set-xmark 0x2/0xffffffff
-A OUTPUT -p tcp -m tcp --dport 25 -j MARK --set-xmark 0x2/0xffffffff
COMMIT
# Завершено в сб Jan 30 06:47:36 2021
# Сгенерировано iptables-save v1.8.4 в сб Jan 30 06:47:36 2021
*filter
:INPUT ACCEPT [367:62684]
:FORWARD ACCEPT [10426:4247532]
:OUTPUT ACCEPT [50809:2739507]
:f2b-sshd - [0:0]
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
-A INPUT -i lo -j ACCEPT
-A INPUT -i enp2s0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i enp2s0 -j DROP
-A FORWARD -i enxa0cec802c711 -o enp2s0 -j DROP
-A f2b-sshd -s 200.140.81.94/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 177.92.35.201/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 94.43.219.173/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 14.228.195.50/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 66.96.232.50/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 71.217.140.138/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 14.249.54.134/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 201.209.161.174/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 174.30.109.183/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 71.217.167.42/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 116.193.139.76/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 41.89.234.2/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 182.71.223.194/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 173.202.19.15/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 180.112.138.132/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -j RETURN
COMMIT
# Завершено в сб Jan 30 06:47:36 2021
# Сгенерировано iptables-save v1.8.4 в сб Jan 30 06:47:36 2021
*nat
:PREROUTING ACCEPT [444244:60896263]
:INPUT ACCEPT [168098:15673985]
:OUTPUT ACCEPT [120570:8875499]
:POSTROUTING ACCEPT [113904:8359713]
-A POSTROUTING -o enp2s0 -j MASQUERADE
-A POSTROUTING -o wg0 -j SNAT --to-source 10.0.0.2
COMMIT
# Завершено в сб Jan 30 06:47:36 2021

против

iptables v1.8.4 (legacy): опция "-s" требует аргумент
Попробуйте `iptables -h' или 'iptables --help' для получения дополнительной информации.
root@sputnik:/home/nathan# iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N f2b-sshd
-A INPUT -p tcp -m multiport --dports 22 -j f2b-sshd
-A INPUT -i lo -j ACCEPT
-A INPUT -i enp2s0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i enp2s0 -j DROP
-A FORWARD -i enxa0cec802c711 -o enp2s0 -j DROP
-A f2b-sshd -s 200.140.81.94/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 177.92.35.201/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 94.43.219.173/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 14.228.195.50/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 66.96.232.50/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 71.217.140.138/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 14.249.54.134/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 201.209.161.174/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 174.30.109.183/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 71.217.167.42/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 116.193.139.76/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 41.89.234.2/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 182.71.223.194/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 173.202.19.15/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -s 180.112.138.132/32 -j REJECT --reject-with icmp-port-unreachable
-A f2b-sshd -j RETURN

man iptables:

-S, –list-rules [цепочка]
Выводит все правила в выбранной цепочке. Если цепочка не выбрана,
выводятся все цепочки, как в iptables-save. Как и в любой другой команде iptables, это применяется к указанной таблице (фильтр является
по умолчанию).
:

Так что, похоже, вывод ограничен таблицей filter.

В то время как iptable-save выводит весь набор правил в формате, подходящем для классического конфигурационного файла.

man iptable-save

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

Обратите внимание на все доступные таблицы как значение по умолчанию здесь.

Я смотрел это на CentOS 7.

Ответ или решение

Отличия между iptables -S и iptables-save

Вопрос о различиях между командами iptables -S и iptables-save часто возникает у системных администраторов и специалистов по информационным технологиям, работающих с управлением сетевыми фильтрами в Linux. Оба инструмента являются важными для отображения правил iptables, но они различаются по своему назначению и типу выводимой информации.

Основные функции команд

  • iptables -S: Эта команда предоставляет печать правил для выбранной цепочки (chain) или всех цепочек, если команда вызывается без параметров. Ключевым аспектом, который следует учитывать, является то, что по умолчанию команда iptables -S отображает правила только из стандартной таблицы filter.

  • iptables-save: В отличие от iptables -S, эта команда выводит полное состояние всех таблиц iptables (таких как filter, nat, mangle и т.д.) в формате, удобном для последующего сохранения и загрузки правил. Это делает iptables-save идеальным инструментом для резервного копирования и восстановления конфигураций iptables.

Почему iptables -S не показывает дополнительные правила

Как упоминалось ранее, команда iptables -S ограничивается выводом правил только для таблицы filter. Это и объясняет, почему определенные правила, такие как правило преобразования адреса исходящего трафика (например, -A POSTROUTING -o wg0 -j SNAT --to-source 10.0.0.2), которое относится к таблице nat, не отображаются в выводе iptables -S.

Хотя в документации указано, что iptables -S может выводить правила для всех цепочек, это касается только цепочек внутри выбранной таблицы, а не всех доступных таблиц. Следовательно, если правила находятся в таблице nat или mangle, их не будет видно в результате выполнения iptables -S.

Примеры вывода

  1. Вывод iptables -S:

    $ iptables -S
    -P INPUT ACCEPT
    -P FORWARD ACCEPT
    -P OUTPUT ACCEPT
    -N f2b-sshd
    ...

    Из этого вывода видно, что команда предоставляет список только правил в таблице filter.

  2. Вывод iptables-save:

    # Generated by iptables-save ...
    *mangle
    ...
    *nat
    -A POSTROUTING -o wg0 -j SNAT --to-source 10.0.0.2
    ...

    В этом выводе мы видим не только правила из таблицы filter, но и правила из mangle и nat, что обеспечивает более полную картину сетевых фильтров.

Заключение

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

Оцените материал
Добавить комментарий

Капча загружается...