Nftables – это современная система фильтрации пакетов, которая является заменой iptables. Nftables предоставляет более гибкий и мощный набор функций, чем iptables. Настройка Nftables для блокировки вредоносных хостов – важный шаг для обеспечения безопасности вашей сети.
В статье будем использовать готовые списки вредоносных хостов.
Настройка nftables фильтровать хосты будем в таблицы inet filter. Для этого отредактируйте файл /etc/nftables.conf и добате в него следущее
table inet filter {
set BLACK { type ipv4_addr; timeout 24р; flags interval;}
set BLACKIPV6 { type ipv6_addr; timeout 24h; flags interval;}
chain INPUT { ….. }
}
Z BLACKIPV6
#while IFS= read -r line
#do
#/usr/sbin/nft add element inet filter BLACKIPV6 {“$line”}
#done < blacklist_ipv6.txt
Далее приведу скрипты на для формирования таблицы в nftables и блокировки этих хостов на сутки
cat blacklist_add_nftables.sh
#! /usr/bin/bash
#скачивания и обработки файлов
/usr/bin/wget https://myip.ms/files/blacklist/csf/latest_blacklist.txt
/usr/bin/wget https://rules.emergingthreats.net/fwrules/emerging-Block-IPs.txt
/usr/bin/wget https://iplists.firehol.org/files/firehol_level1.netset -O firehol_level1.txt
# Объединяем файлы в один
cat latest_blacklist.txt emerging-Block-IPs.txt firehol_level1.txt > blacklist_distr.txt
# Убирем дубли
cat blacklist_distr.txt | grep -v “#” | sort | uniq > blacklist.txt
# Выделяем IPv4 адреса с масками
grep -E ‘^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+/[0-9]+’ blacklist.txt > blacklist_ipv4_mask.txt
# Проверяем дублирующие подсети
/usr/bin/python3 sort_mask_dublekate.py
# Выделяем IPv6 адреса с масками
#grep -E ‘^[0-9a-fA-F:]+/[0-9]+’ blacklist.txt > blacklist_ipv6_mask.txt
# Проверяем дублирующие подсети
#/usr/bin/python3 sort_mask_dublekate_ipv6.py
#deleteold element
#BLAC=$(/usr/sbin/nft list set inet filter BLACK | awk ‘/{ /,/}/’ | cut -d ‘=’ -f 2)
#/usr/sbin/nft delete element inet filter BLACK {“$BLAC”}
#Очищаем blacklist
/usr/sbin/nft flush set inet filter BLACK
# Импортируем списки в nftables
while IFS= read -r line
do
/usr/sbin/nft add element inet filter BLACK “{$line}”
done < blacklist_ipv4.txt
#Очищаем blacklist для IPV6
#/usr/sbin/nft flush set inet filter BLACKIPV6
#while IFS= read -r line
#do
#/usr/sbin/nft add element inet filter BLACKIPV6 “{$line}”
#done < blacklist_ipv6.txt
rm ./*.txt
Для зпапуска python скриптов необходим модуль ipaddress. Его можно установить командой pip install ipaddress
cat sort_mask_dublekate.py
# Импортируем библиотеку для работы с IP-адресами и масками подсети
import ipaddress
# Открываем исходный файл
with open(‘blacklist_ipv4_mask.txt’, ‘r’) as file:
lines = file.readlines()
# Список для хранения уникальных адресов
unique_networks = []
# Преобразовываем строки в объекты IP-адресов и масок подсети
networks = [ipaddress.ip_network(line.strip()) for line in lines]
# Проверяем и удаляем перекрывающиеся подсети
for network in networks:
is_unique = True
for unique_network in unique_networks:
if network.subnet_of(unique_network):
is_unique = False
break
if is_unique:
unique_networks.append(network)
# Записываем уникальные адреса в новый файл
with open(‘blacklist_ipv4.txt’, ‘w’) as file:
for network in unique_networks:
file.write(str(network) + ‘\n’)
cat sort_mask_dublekate_ipv6.py
#!/usr/bin/python3
import ipaddress
# Определите имя входного файла и выходного файла
input_file = “blacklist_ipv6_mask.txt”
output_file = “blacklist_ipv6.txt”
# Создаем множество для уникальных сетей
unique_networks = set()
# Открываем исходный файл и читаем его
with open(input_file, “r”) as file:
lines = file.readlines()
# Преобразуем строки в объекты IPv6-сетей и фильтруем перекрывающиеся сети
for line in lines:
network = ipaddress.IPv6Network(line.strip(), strict=False)
is_unique = True
# Проверяем, перекрывается ли сеть с какой-либо из уже найденных
for unique_network in unique_networks:
if network.overlaps(unique_network):
is_unique = False
break
# Если сеть не перекрывается, добавляем ее в уникальные сети
if is_unique:
unique_networks.add(network)
# Записываем уникальные сети в выходной файл
with open(output_file, “w”) as file:
for network in unique_networks:
file.write(str(network) + “\n”)
Для запуска скрипта даем права на его запуск
chmod 750 blacklist_add_nftables.sh
chmod 640 sort_mask_dublekate*
Меняем владельца на файлы
chown root:root blacklist_add_nftables.sh
chown root:root sort_mask_dublekate*
Прописываем blacklist_add_nftables.sh в cron
00 21 * * * /usr/scripts/master/blacklist/blacklist_add_nftables.sh