Приложение IPTables – брандмауэр, необходимый для безопасной работы с сетевыми ресурсами на платформе Linux. Настройке продукта уделено много материалов, здесь же мы рассмотрим узкую задачу: как просматривать списки правил, удалять ненужные, сбрасывать цепочки, очищать счетчик количества пакетов и их объема. Не рекомендуем трогать коннект по SSH, использующий порт 22, если вы не уверены на 100% в своих действиях, чтобы случайно не заблокировать удаленный доступ к тестовому хосту.
Кстати, в официальном канале Timeweb Cloud собрали комьюнити из специалистов, которые говорят про IT-тренды, делятся полезными инструкциями и даже приглашают к себе работать.
Разбираться в настройках брандмауэра лучше на удаленной машине, например, арендованной у провайдера Timeweb Cloud. В Timeweb Cloud вы можете выбрать один из готовых образов Linux-дистрибутивов, в которые уже предустановлено основное ПО. Поэтому дополнительно не понадобится устанавливать Linux и iptables, однако будет нужно создать пользователя с привилегиями sudo или изменить права имеющегося. Желательно работать с актуальной версией операционной системы, в этом материале будем использовать Ubuntu. Схема настройки на CentOS и Debian будет аналогичной.
В iptables доступен просмотр правил, установленных по умолчанию или предыдущим администратором. Выполним команду:
sudo iptables –S
Результат будет отображен примерно так:
-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
Функцию применяют, когда хотят убрать из вывода определенную цепочку – INPUT, OUTPUT, TCP и пр. Их указывают следом за опцией -S. Пример:
sudo iptables -S TCP
Результат применения команды система выведет на экран:
-N TCP
-A TCP -p tcp -m tcp --dport 22 -j ACCEPT
Есть похожий вариант индикации текущих правил.
Такой способ удобен, если необходимо сопоставить разные правила. Построение таблицы заложено в утилиту, функция будет активирована при помощи опции -L. Введем команду iptables:
sudo iptables –L
В таком случае также есть возможность ограничить вывод указанной цепочкой:
sudo iptables -L INPUT
Вывод на экран примерно такой:
Chain 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. Далее заголовки столбцов и ниже непосредственно правила. Расшифруем их значение:
Заострим внимание, что у правой колонки нет заголовка. В ней указаны опции правил вроде номера порта исходного сервера или хоста назначения, состояния подключения текущего пакета.
Пользователю доступен вывод перечня пакетов и их общего объема в байтах, соответствующего указанному правилу. Такая информация нужна, если требуется анализ приблизительного трафика по каждому из разрешенных правил. Функция доступна с момента установки iptables благодаря опциям -L и -v:
sudo iptables -L INPUT –v
Вывод на экран будет выглядеть примерно так:
Chain 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. Теперь перейдем к другим функциям, доступным для iptables в Ubuntu.
Очистка (обнуление) счетчика пакетов и объема предусмотрена опцией -Z. Она применяется при перезагрузке сервера автоматически. Но иногда пользователю нужно выяснить, поступает ли новый трафик. Пример команды:
sudo iptables –Z
По умолчанию очистка проводится по всем видам цепочек. Если нужно провести операцию лишь с одной, ее указывают явно:
sudo iptables -Z OUTPUT
Также есть возможность обнулить указанное в цепочке правило по его номеру. Пример команды:
sudo iptables -Z OUTPUT 2
Следующим шагом расскажем о двух вариантах удаления правил с помощью iptables.
Первый, который применим на практике, это удаление по спецификации. Понадобится стартовать iptables с опцией –D, и после нее указать нужные данные. Перед ее применением желательно просмотреть действующие правила (рассматривали выше). Например, если захотели убрать задачу отклонения недействительного исходящего трафика, команда будет выглядеть так:
sudo iptables -D OUTPUT -m conntrack --ctstate INVALID -j DROP
Отметим, что опцию -A, применяемую при указании положения правила на время активации, здесь использовать не требуется.
Второй вариант чуть сложнее, т.к. требует сначала выяснить номер строки, соответствующей тому правилу, которое планируется удалить. Применим опцию --line-number, она выводит список с цифровыми значениями для всех строк:
sudo iptables -L --line-numbers
Результат будет выведен на экран примерно таким образом:
Chain 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. Теперь мы можем выяснить точное значение для удаляемого правила. И ввести команду -D с указанием нужного номера. Например, требуется удалить задачу, указанную в строке 3, отклоняющую любые недействительные пакеты:
sudo iptables -D INPUT 3
Помимо удаления, утилита поддерживает сброс цепочек правил.
Приложение позволяет сбрасывать действующие правила несколькими способами. При проверке этой функции важно случайно не заблокировать удаленный доступ к серверу с IPTables, который организован по протоколу SSH. Такое может произойти, если ввести команду с политикой «по умолчанию» drop или deny. Если использовать облачные сервисы от Timeweb, то при закрытии доступа будет возможно восстановить его через веб-консоль, но лучше сразу привыкать правильно работать с утилитой.
Сброс указанной цепочки с удалением правил внутри нее осуществляется при помощи опции -F или ее аналога –flush, после которых нужно добавить требуемое имя. Например, мы хотим убрать все правила внутри цепи OUTPUT.
sudo iptables -F INPUT
По аналогии с предыдущим вариантом в настройке iptables используем опцию -F или эквивалент –flush, но без указания имени цепочки. Пример:
sudo iptables –F
Итогом ввода этой команды будет разрешение любого трафика независимо от ранее установленных ограничений (входящего, исходящего, проходящего). Фактически это равнозначно отключению брандмауэра на сервере. Если такую команду ввести на рабочей машине, его придется настраивать с нуля, чтобы ограничить доступ посторонних, в том числе злоумышленников. Поэтому перед ее выполнением рекомендуется создать бэкап текущих настроек в файл с помощью iptables-save:
iptables-save > iptables_backup.txt
После настройки будет можно восстановить из файла с помощью iptables-restore:
iptables-restore < iptables_backup.txt
Вернем прежние настройки: сначала зададим 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 и сбрасывать, удалять их, производить те же операции с указанными цепочками. При тестировании функций важно учитывать, что любые изменения исчезнут при перезапуске сервера.