Как составить список и удалить правила брандмауэра Iptables
Введение
Iptables — это брандмауэр, который играет важную роль в сетевой безопасности для большинства систем Linux. В то время как во многих учебниках по iptables вы узнаете, как создавать правила брандмауэра для защиты вашего сервера, этот урок посвящен другому аспекту управления брандмауэром: составлению списка и удалению правил.
В этом руководстве мы рассмотрим, как выполнять следующие задачи iptables:
- Список правил
- Очистить счетчики пакетов и байтов
- Удалить правила
- Очистить цепочки (удалить все правила в цепочке)
- Очистить все цепочки и таблицы, удалить все цепочки и принять весь трафик.
Примечание. При работе с брандмауэрами будьте осторожны, чтобы не заблокировать доступ к собственному серверу, заблокировав трафик SSH (порт :22
по умолчанию). Если вы потеряете доступ из-за настроек брандмауэра, вам может потребоваться подключиться к нему через внешнюю консоль, чтобы исправить свой доступ.
Предпосылки
В этом руководстве предполагается, что вы используете сервер Linux с установленной командой iptables
и что у вашего пользователя есть привилегии sudo
.
Если вам нужна помощь с этой начальной настройкой, обратитесь к нашему CentOS.
Правила листинга по спецификации
Давайте сначала посмотрим, как составить список правил. Существует два разных способа просмотра активных правил iptables: в виде таблицы или в виде списка спецификаций правил. Оба метода предоставляют примерно одинаковую информацию в разных форматах.
Чтобы вывести список всех активных правил iptables по спецификации, запустите команду iptables
с параметром -S
:
- sudo iptables -S
Output-P INPUT DROP
-P FORWARD DROP
-P OUTPUT ACCEPT
-N ICMP
-N TCP
-N UDP
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate INVALID -j DROP
-A INPUT -p udp -m conntrack --ctstate NEW -j UDP
-A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m conntrack --ctstate NEW -j TCP
-A INPUT -p icmp -m conntrack --ctstate NEW -j ICMP
-A INPUT -p udp -j REJECT --reject-with icmp-port-unreachable
-A INPUT -p tcp -j REJECT --reject-with tcp-reset
-A INPUT -j REJECT --reject-with icmp-proto-unreachable
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT
...
Как видите, выходные данные выглядят точно так же, как команды, которые использовались для их создания, без предшествующей команды iptables
. Это также будет похоже на файлы конфигурации правил iptables, если вы когда-либо использовали iptables-persistent
или iptables save
.
Список конкретной цепочки
Если вы хотите ограничить вывод определенной цепочкой (INPUT
, OUTPUT
, TCP
и т. д.), вы можете напрямую указать имя цепочки после опции -S
. Например, чтобы отобразить все спецификации правил в цепочке TCP
, выполните следующую команду:
- sudo iptables -S TCP
Output-N TCP
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT
Теперь давайте рассмотрим альтернативный способ просмотра активных правил iptables: в виде таблицы правил.
Список правил в виде таблиц
Список правил iptables в виде таблицы может быть полезен для сравнения различных правил друг с другом. Чтобы вывести все активные правила iptables в таблицу, запустите команду iptables
с параметром -L
:
- sudo iptables -L
Это выведет все текущие правила, отсортированные по цепочке.
Если вы хотите ограничить вывод определенной цепочкой (INPUT
, OUTPUT
, TCP
и т. д.), вы можете напрямую указать имя цепочки после опции -L
.
Давайте посмотрим на пример цепочки INPUT
:
- sudo iptables -L INPUT
OutputChain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
ACCEPT all -- anywhere anywhere
DROP all -- anywhere anywhere ctstate INVALID
UDP udp -- anywhere anywhere ctstate NEW
TCP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
ICMP icmp -- anywhere anywhere ctstate NEW
REJECT udp -- anywhere anywhere reject-with icmp-port-unreachable
REJECT tcp -- anywhere anywhere reject-with tcp-reset
REJECT all -- anywhere anywhere reject-with icmp-proto-unreachable
В первой строке вывода указывается имя цепочки (в данном случае INPUT
), за которой следует политика по умолчанию (DROP
). Следующая строка состоит из заголовков каждого столбца в таблице, за которыми следуют правила цепочки. Давайте рассмотрим, что означает каждый заголовок:
target
: если пакет соответствует правилу, цель указывает, что с ним делать. Например, пакет можно принять, отбросить, зарегистрировать или отправить в другую цепочку для сравнения с другими правилами.prot
: протокол, напримерtcp
,udp
,icmp
илиall
opt
: используется редко, в этом столбце указаны параметры IP.source
: исходный IP-адрес или подсеть трафика илигде угодно
destination
: IP-адрес назначения или подсеть трафика, илигде угодно
Последний столбец, который не помечен, указывает параметры правила. Это любая часть правила, не указанная в предыдущих столбцах. Это может быть что угодно, от портов источника и назначения до состояния соединения пакета.
Отображение количества пакетов и совокупного размера
При перечислении правил iptables также можно показать количество пакетов и совокупный размер пакетов в байтах, соответствующих каждому конкретному правилу. Это часто полезно при попытке получить общее представление о том, какие правила соответствуют пакетам. Для этого используйте вместе параметры -L
и -v
.
Например, давайте снова посмотрим на цепочку INPUT
с опцией -v
:
- sudo iptables -L INPUT -v
OutputChain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
284K 42M ACCEPT all -- any any anywhere anywhere ctstate RELATED,ESTABLISHED
0 0 ACCEPT all -- lo any anywhere anywhere
0 0 DROP all -- any any anywhere anywhere ctstate INVALID
396 63275 UDP udp -- any any anywhere anywhere ctstate NEW
17067 1005K TCP tcp -- any any anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
2410 154K ICMP icmp -- any any anywhere anywhere ctstate NEW
396 63275 REJECT udp -- any any anywhere anywhere reject-with icmp-port-unreachable
2916 179K REJECT all -- any any anywhere anywhere reject-with icmp-proto-unreachable
0 0 ACCEPT tcp -- any any anywhere anywhere tcp dpt:ssh ctstate NEW,ESTABLISHED
Обратите внимание, что теперь в листинге есть два дополнительных столбца: pkts
и bytes
.
Теперь, когда вы знаете, как составить список активных правил брандмауэра различными способами, давайте посмотрим, как можно сбросить счетчики пакетов и байтов.
Сброс количества пакетов и совокупного размера
Если вы хотите очистить или обнулить счетчики пакетов и байтов для ваших правил, используйте параметр -Z
. Они также сбрасываются, если происходит перезагрузка. Это полезно, если вы хотите узнать, получает ли ваш сервер новый трафик, соответствующий вашим существующим правилам.
Чтобы очистить счетчики для всех цепочек и правил, используйте опцию -Z
отдельно:
- sudo iptables -Z
Чтобы сбросить счетчики для всех правил в определенной цепочке, используйте параметр -Z
и укажите цепочку. Например, чтобы очистить счетчики цепочки INPUT
, выполните следующую команду:
- sudo iptables -Z INPUT
Если вы хотите сбросить счетчики для определенного правила, укажите имя цепочки и номер правила. Например, чтобы обнулить счетчики для первого правила в цепочке INPUT
, выполните следующее:
- sudo iptables -Z INPUT 1
Теперь, когда вы знаете, как сбросить счетчики пакетов и байтов iptables, давайте рассмотрим два метода, которые можно использовать для их удаления.
Удаление правил по спецификации
Один из способов удалить правила iptables — указать правило. Для этого вы можете запустить команду iptables
с параметром -D
, за которым следует спецификация правила. Если вы хотите удалить правила с помощью этого метода, вы можете использовать вывод списка правил, iptables -S
, для некоторой помощи.
Например, если вы хотите удалить правило, которое отбрасывает недопустимые входящие пакеты (-A INPUT -m conntrack --ctstate INVALID -j DROP
), вы можете выполнить следующую команду:
- sudo iptables -D INPUT -m conntrack --ctstate INVALID -j DROP
Обратите внимание, что параметр -A
, который используется для указания позиции правила во время создания, здесь следует исключить.
Удаление правил по цепочке и номеру
Другой способ удаления правил iptables — по их цепочке и номеру строки. Чтобы определить номер строки правила, перечислите правила в формате таблицы и добавьте параметр --line-numbers
:
- sudo iptables -L --line-numbers
OutputChain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- anywhere anywhere ctstate RELATED,ESTABLISHED
2 ACCEPT all -- anywhere anywhere
3 DROP all -- anywhere anywhere ctstate INVALID
4 UDP udp -- anywhere anywhere ctstate NEW
5 TCP tcp -- anywhere anywhere tcp flags:FIN,SYN,RST,ACK/SYN ctstate NEW
6 ICMP icmp -- anywhere anywhere ctstate NEW
7 REJECT udp -- anywhere anywhere reject-with icmp-port-unreachable
8 REJECT tcp -- anywhere anywhere reject-with tcp-reset
9 REJECT all -- anywhere anywhere reject-with icmp-proto-unreachable
10 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh ctstate NEW,ESTABLISHED
...
Это добавляет номер строки к каждой строке правила, обозначенный заголовком num
.
Как только вы узнаете, какое правило вы хотите удалить, запишите цепочку и номер строки правила. Затем выполните команду iptables -D
, указав цепочку и номер правила.
Например, если мы хотим удалить правило ввода, которое отбрасывает недопустимые пакеты, мы увидим, что это правило 3
цепочки INPUT
. Итак, мы должны запустить эту команду:
- sudo iptables -D INPUT 3
Теперь, когда вы знаете, как удалять отдельные правила брандмауэра, давайте рассмотрим, как можно сбросить цепочки правил.
Промывочные цепи
Iptables предлагает способ удалить все правила в цепочке или сбросить цепочку. В этом разделе будут рассмотрены различные способы сделать это.
Предупреждение. Будьте осторожны, чтобы не заблокировать свой сервер через SSH, сбросив цепочку с политикой по умолчанию drop
или deny
. Если вы это сделаете, вам может потребоваться подключиться к нему через консоль, чтобы исправить свой доступ.
Промывка одной цепи
Чтобы сбросить определенную цепочку, которая удалит все правила в цепочке, вы можете использовать параметр -F
или эквивалентный --flush
и имя цепь промывать.
Например, чтобы удалить все правила в цепочке INPUT
, выполните следующую команду:
- sudo iptables -F INPUT
Промывка всех цепей
Чтобы сбросить все цепочки, что приведет к удалению всех правил брандмауэра, вы можете использовать опцию -F
или эквивалентную опцию --flush
:
- sudo iptables -F
Сброс всех правил, удаление всех цепочек и принятие всех
В этом разделе показано, как сбросить все правила, таблицы и цепочки брандмауэра и разрешить весь сетевой трафик.
Предупреждение: это эффективно отключит ваш брандмауэр. Вам следует следовать этому разделу только в том случае, если вы хотите начать настройку брандмауэра заново.
Сначала установите политики по умолчанию для каждой из встроенных цепочек на ACCEPT
. Основная причина сделать это — убедиться, что вы не будете заблокированы на своем сервере через SSH:
- sudo iptables -P INPUT ACCEPT
- sudo iptables -P FORWARD ACCEPT
- sudo iptables -P OUTPUT ACCEPT
Затем сбросить таблицы nat
и mangle
, сбросить все цепочки (-F
) и удалить все цепочки не по умолчанию (-X
):
- sudo iptables -t nat -F
- sudo iptables -t mangle -F
- sudo iptables -F
- sudo iptables -X
Теперь ваш брандмауэр разрешит весь сетевой трафик. Если вы сейчас перечислите свои правила, вы увидите, что их нет, и только три цепочки по умолчанию (INPUT
, FORWARD
и OUTPUT
) оставаться.
Заключение
Изучив это руководство, вы узнали, как составить список и удалить правила брандмауэра iptables.
Помните, что любые изменения iptables с помощью команды iptables
являются эфемерными, и их необходимо сохранить, чтобы они сохранялись при перезагрузке сервера. Это описано в разделе «Сохранение правил» учебника «Общие правила и команды брандмауэра».