Перейти к содержимому

Блокировка IP подсетей в firewalld по списку из файла

15 декабря 2024

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 огромным количеством отдельных правил.И самое главное – можно манипулировать ими как логическими блоками.

Предположим, что у вас есть файл /var/www/siteuser/www/biterika.txt, в котором каждое значение — это IP-адрес или подсеть в отдельной строке. Например:
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

Важно понимать их соотношение:

  1. 45.11.20.0/23 — более широкая подсеть, охватывает диапазон от 45.11.20.0 до 45.11.21.255.
  2. 45.11.20.0/24 — более узкая подсеть, охватывает диапазон от 45.11.20.0 до 45.11.20.255.

Их можно объединить оставив более широкую подсеть 45.11.20.0/23. Обработанный файл мы выложили в конце статьи. Его можно использовать для блокировки всех подсетей Битерики.

После создания и наполнения ipset вам нужно перезагрузить конфигурацию firewalld, чтобы изменения вступили в силу:
firewall-cmd --reload

Создание правила блокировки

Теперь, когда ipset biterika создан и наполнен, можно применить к нему фильтрующее правило. Допустим, мы хотим блокировать все входящие соединения с IP-адресов, указанных в этом наборе. Для этого применим rich-rule к нужной зоне, например, к зоне public:
firewall-cmd --permanent --zone=public --add-rich-rule='rule source ipset=biterika drop'

Данное правило говорит: для всех источников, которые входят в ipset biterika, применить действие drop — полностью отбрасывать пакеты.

После добавления правила снова перезагрузите firewalld:

firewall-cmd --reload
С этого момента все адреса из biterika.txt будут заблокированы.

Проверка результата

Для проверки, что ipset успешно создан и заполнен, используйте команду:
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
После этого новые строки из файла будут учтены в ipset и, соответственно, в правилах, которые используют этот ipset.

Как удалить 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

Можно целиком удалить загруженный ipset и затем повторить импорт из файла или оставить как есть. Суть разделения всех наборов на ipset как раз и заключается в удобстве управления ими.
Вначале надо удалить правило, которое было применено к набору. Если этого не сделать – после удаления ipset перезагрузка firewalld приведет к ошибке.
firewall-cmd --permanent --zone=public --remove-rich-rule='rule source ipset=biterika drop'
firewall-cmd --reload
Если дело было давно – вы можете убедиться какие сейчас правила действуют для вашего firewalld:
firewall-cmd --permanent --zone=public --list-rich-rules
В списке будут указаны те правила которые сейчас применяются на вашем файерволе. Важно увидеть имя вашего ipset. Если правил окажется много – можете использовать grep для фильтрации:
firewall-cmd --permanent --zone=public --list-rich-rules | grep biterika
Затем можно удалить целиком набор:
firewall-cmd --permanent --delete-ipset=biterika
firewall-cmd --reload
После этого можно либо повторить импорт, либо оставить как есть, если цель была только в удалении.

Файлы с полезными списками диапазонов IP адресов для блокировки на вашем сервере

Первый и самый полезный список – блокировка компании Biterika. Ничего кроме ботов с ее IP адресов на вашем сайте не появится. Поэтому качайте файл и блокируйте Biterika целиком!
Так как список IP адресов Biterika содержит пересечения подсетей – пришлось его чистить и объединять.
Полный список всегда можно взять по ссылке:
Основатель