Блокировка IP подсетей в firewalld по списку из файла
Firewalld – стандартный файерволл для семейства Linux дистрибутивов RedHat (CentOS, Alma, Fedora, RHEL). Он отлично подходит для блокировки IP адресов и подсетей IP адресов.
Однако что делать, если нужно заблокировать целый список подсетей IP адресов, который вы тщательно собрали в одном текстовом файле?
Как манипулировать такими понятиями как, набор IP адресов?
Блокировка списков IP адресов или IP-подсетей с помощью ipset
Начиная с версии 0.4.3 в firewalld появилось понятие "набора IP адресов" – ipset. Затем, начиная с версии 0.9.0 появилсь команды, которые позволяют подгружать наборы IP адресов из текстовых файлов.
Используя ipset, вы можете хранить множество IP-адресов или подсетей в одном наборе и применять к ним единое правило фильтрации (например, «drop» — полностью блокировать доступ). Это особенно полезно при необходимости заблокировать десятки или сотни нежелательных адресов, не переполняя конфигурацию Firewalld огромным количеством отдельных правил.И самое главное – можно манипулировать ими как логическими блоками.
192.168.1.10
203.0.113.0/24
198.51.100.45
Важно: каждое значение должно быть корректным IP-адресом или подсетью в формате CIDR.
Вы можете создать на основе файла с набором таких IP и подсетей IP свой набор ipset и манипулировать в дальнейшем им с помощью одной команды. Это очень удобно, если требуется заблокировать сразу множество IP из одного источника.
Нужно понимать, что файл с набором IP в данном случае является просто источником импорта. На его основе просто создаются внутренние правила фильтрации. В дальнейшем он не участвует в работе и для добавления IP вам потребуется повторный импорт из этого файла с новыми IP.
Для удаления можно использовать целиком этот же файл или некоторые правила из него.
Хорошим объектом для тренировок является компания Битерика, чьи IP можно без малейших колебаний добавлять в бан на всех своих серверах – ничем кроме спама она не занимается.
Создание ipset
Прежде чем мы сможем добавить записи из файла в ipset, нам нужно этот ipset создать. Предположим, мы хотим назвать его biterika.
Команда для создания нового ipset в Firewalld выглядит так:
firewall-cmd --permanent --new-ipset=biterika --type=hash:net
Здесь:
--permanent — говорит о том, что изменение будет сохраняться после перезагрузки.
--type=hash:net — тип ipset, оптимизированный для хранения множества сетей или отдельных IP.
После выполнения этой команды ipset будет создан, но пока что пуст.
Добавление IP-адресов из файла в ipset
Начиная с определённых версий Firewalld (примерно с 0.9.0) появилась возможность добавлять сразу много адресов в ipset из файла с помощью опции --add-entries-from-file.
Добавим записи из biterika.txt:
firewall-cmd --permanent --ipset=biterika --add-entries-from-file=/var/www/siteuser/www/biterika.txt
Эта команда прочитает все строки из biterika.txt и добавит их в ipset biterika.
Учитывайте, что при загрузке файла пересекающиеся наборы IP адресов приведут к ошибке загрузки. Например, 45.11.20.0/23
и 45.11.20.0/24
содержат пересекающиеся диапазоны адресов и наличие их обоих в файле импорта приведет к ошибке. Такие диапазоны вы получите, если попытаетесь выгрузить все IP Битерики напрямую например здесь https://asn.ipinfo.app/downloads/AS35048
Важно понимать их соотношение:
-
45.11.20.0/23
— более широкая подсеть, охватывает диапазон от 45.11.20.0 до 45.11.21.255. -
45.11.20.0/24
— более узкая подсеть, охватывает диапазон от 45.11.20.0 до 45.11.20.255.
Их можно объединить оставив более широкую подсеть 45.11.20.0/23
.
Обработанный файл мы выложили в конце статьи. Его можно использовать для блокировки всех подсетей Битерики.
firewall-cmd --reload
Создание правила блокировки
firewall-cmd --permanent --zone=public --add-rich-rule='rule source ipset=biterika drop'
Данное правило говорит: для всех источников, которые входят в ipset biterika, применить действие drop — полностью отбрасывать пакеты.
После добавления правила снова перезагрузите firewalld:
firewall-cmd --reload
Проверка результата
firewall-cmd --permanent --ipset=biterika --get-entries
Вы должны увидеть список всех добавленных IP-адресов и подсетей в ваш ipset.
Чтобы убедиться, что правило работает, можно попробовать с машины, попадающей под блокировку, выполнить пинг или другое соединение к вашему серверу. Пакеты должны отбрасываться, и соединение не будет установлено.
Подключение можно сделать и со своей машины через VPN, временно заблокировав его адрес.
Как добавить новые подсети в ipset
Если вы уже загрузили список подсетей в ipset из файла, а затем добавили в этот файл новые строки (новые IP или подсети), то для того, чтобы новые записи попали в ipset, вам необходимо повторно запустить команду добавления.
К примеру, если у вас ipset называется biterika и файл /var/www/siteuser/www/biterika.txt, то после добавления новых строк в biterika.txt выполните:
firewall-cmd --permanent --ipset=biterika --add-entries-from-file=/var/www/siteuser/www/biterika.txt
Это добавит в ipset все новые записи, которых ранее не было. Если какие-то записи уже есть, firewalld их просто пропустит.
Не забываем перезапустить firewalld:
firewall-cmd --reload
Как удалить IP адреса и подсети из ipset
Удаление возможно двумя способами:
1. Удаление по одной записи – если вы точно знаете, какую подсеть хотите убрать, используйте:
firewall-cmd --permanent --ipset=biterika --remove-entry="xxx.xxx.xxx.0/24"
firewall-cmd --reload
2. Удаление сразу нескольких записей из файла – в новых версиях Firewalld (начиная примерно с 0.9.0) можно использовать опцию --remove-entries-from-file, аналогично добавлению.
То есть, если у вас есть файл с подсетями, которые нужно удалить, то можно сделать так:
firewall-cmd --permanent --ipset=biterika --remove-entries-from-file=/var/www/siteuser/www/biterika.txt
firewall-cmd --reload
Как удалить целиком ipset
firewall-cmd --permanent --zone=public --remove-rich-rule='rule source ipset=biterika drop'
firewall-cmd --reload
firewall-cmd --permanent --zone=public --list-rich-rules
firewall-cmd --permanent --zone=public --list-rich-rules | grep biterika
firewall-cmd --permanent --delete-ipset=biterika
firewall-cmd --reload