
Скрипт для реализации Q-Feeds напрямую в NFtables или IPtables
Автоматизированный блок-лист IP-адресов вредоносного ПО для серверов Linux — поддерживает nftables и iptables+ipset
Получите бесплатный API-ключ на tip.qfeeds.com.
git clone https://github.com/Q-Feeds/NFtables-IPtables-integration-script.git
cd NFtables-IPtables-integration-script
chmod +x qfeeds-installer.sh qfeeds-uninstaller.sh
sudo ./qfeeds-installer.sh
Установщик:
Ваш сервер теперь защищён. Задание cron проверяет обновления каждые 20 минут (настраивается), а фактические вызовы API происходят только тогда, когда это позволяет ваша лицензия.
Это решение периодически загружает последний канал аналитики угроз из Q-Feeds и применяет его в виде правил межсетевого экрана (пошаговое руководство: Настройка NFtables/IPtables), что позволяет вам:
Установщик автоматически определяет, какой бэкенд межсетевого экрана доступен:
| Приоритет | Обнаружение | Бэкенд |
|---|---|---|
| 1-й | найдена команда nft | nftables |
| 2-й | найдена команда iptables | iptables+ipset |
| — | Ни одна не найдена | Ошибка (выход) |
Обнаруженный бэкенд сохраняется в файле конфигурации. Скрипты обновления и удаления используют его для выполнения правильных команд межсетевого экрана.
Оба бэкенда используют одну и ту же стратегию разделения наборов для максимальной производительности:
Бэкенд nftables:
┌─────────────────────────────────────────────────────────┐
│ table ip qfeeds │
│ │
│ ┌─────────────────────────┐ ┌───────────────────────┐ │
│ │ qfeeds_blacklist_v4 │ │ qfeeds_blacklist_v4 │ │
│ │ (hash set) │ │ _nets (interval set) │ │
│ │ │ │ │ │
│ │ Individual IPs │ │ CIDR ranges │ │
│ │ ~99% of entries │ │ ~1% of entries │ │
│ │ O(1) lookup & insert │ │ O(log n) lookup │ │
│ └─────────────────────────┘ └───────────────────────┘ │
│ │
│ ┌─────────────────────────┐ │
│ │ qfeeds_whitelist_v4 │ │
│ │ (interval set) │ │
│ │ Your allowed IPs/CIDRs │ │
│ └─────────────────────────┘ │
│ │
│ chain input-chain (hook input, priority 0, accept) │
│ → ip saddr @qfeeds_whitelist_v4 accept │
│ → ip saddr @qfeeds_blacklist_v4 drop │
│ → ip saddr @qfeeds_blacklist_v4_nets drop │
│ │
│ chain output-chain (if enabled) │
│ → ip daddr @qfeeds_whitelist_v4 accept │
│ → ip daddr @qfeeds_blacklist_v4 drop │
│ → ip daddr @qfeeds_blacklist_v4_nets drop │
└─────────────────────────────────────────────────────────┘
Бэкенд iptables+ipset:
┌──────────────────────────────────────────────────────────┐
│ ipset sets │
│ │
│ ┌─────────────────────────┐ ┌────────────────────────┐ │
│ │ qfeeds_blacklist_v4 │ │ qfeeds_blacklist_v4 │ │
│ │ (hash:ip) │ │ _nets (hash:net) │ │
│ │ maxelem 1000000 │ │ maxelem 65536 │ │
│ │ │ │ │ │
│ │ Individual IPs │ │ CIDR ranges │ │
│ └─────────────────────────┘ └────────────────────────┘ │
│ │
│ ┌─────────────────────────┐ │
│ │ qfeeds_whitelist_v4 │ │
│ │ (hash:net) │ │
│ └─────────────────────────┘ │
│ │
│ iptables: INPUT/OUTPUT jump to a dedicated chain │
│ (jump rule tagged -m comment "qfeeds"): │
│ │
│ chain QFEEDS_INPUT (rebuilt each run, in order): │
│ -m set --match-set whitelist_v4 src -j ACCEPT │
│ -m set --match-set blacklist_v4 src -j DROP │
│ -m set --match-set blacklist_v4_nets src -j DROP │
│ (QFEEDS_OUTPUT mirrors this with dst, if enabled) │
└──────────────────────────────────────────────────────────┘
Та же структура существует для IPv6 (таблица ip6 qfeeds или ip6tables + ipsets с family inet6).
Почему два типа наборов?