
Script para implementar Q-Feeds diretamente no NFtables ou IPtables
Blocklist automatizada de IPs de malware para servidores Linux — suporta nftables e iptables+ipset
Obtenha uma chave de API gratuita em 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
O instalador irá:
O seu servidor está agora protegido. A tarefa cron verifica atualizações a cada 20 minutos (configurável), e as chamadas reais à API só acontecem quando a sua licença o permite.
Esta solução descarrega periodicamente o feed de inteligência de ameaças mais recente do Q-Feeds e aplica-o como regras de firewall (guia passo a passo: Configuração de NFtables/IPtables), permitindo-lhe:
O instalador deteta automaticamente qual o backend de firewall disponível:
| Prioridade | Deteção | Backend |
|---|---|---|
| 1ª | comando nft encontrado | nftables |
| 2ª | comando iptables encontrado | iptables+ipset |
| — | Nenhum encontrado | Erro (sair) |
O backend detetado é armazenado no ficheiro de configuração. Os scripts de atualização e desinstalação usam-no para executar os comandos de firewall corretos.
Ambos os backends usam a mesma estratégia de conjuntos divididos para máximo desempenho:
Backend 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 │
└─────────────────────────────────────────────────────────┘
Backend 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) │
└──────────────────────────────────────────────────────────┘
A mesma estrutura existe para IPv6 (tabela ip6 qfeeds ou ip6tables + ipsets family inet6).
Por que dois tipos de conjunto?