Os scripts são de código aberto e estão no GitHub: Q-Feeds/NFtables-IPtables-integration-script. Descarregue-os sempre de lá para ter a certeza de que tem a versão atual. Precisa de acesso root, HTTPS de saída para api.qfeeds.com e um token API da Q-Feeds. Consulte Obter os seus threat feeds. O instalador pede-lhe primeiro que aceite os nossos Termos e condições e o EULA.
Requisitos
- SO: Linux com nftables, ou com iptables e ipset
- Distribuições: Debian, Ubuntu, CentOS, RHEL, AlmaLinux, Rocky Linux, Fedora, openSUSE Leap, SLES, Arch Linux, Alpine
- Privilégios: root para a instalação, as atualizações e as alterações à firewall
- Feed: lista de IP maliciosos (
feed_type=malware_ip) - Pacotes: é o script que os instala, não tem de preparar nada. Com nftables são
nftables,curl,jqeutil-linux. Com iptables sãoiptables,ipset,curl,jqeutil-linux.
Teste opcional antes de instalar:
curl -v -u api_token:YOUR_TOKEN "https://api.qfeeds.com/api?feed_type=malware_ip&limit=1000"
Obter os scripts
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
Não tem git no servidor? Descarregue o ficheiro ZIP da página do repositório e descompacte-o.
Instalação
sudo ./qfeeds-installer.sh
O instalador deteta a sua firewall, faz algumas perguntas, coloca o script de atualização com a respetiva tarefa cron e executa logo uma primeira sincronização completa, para que a lista de bloqueio fique ativa de imediato. As perguntas, por ordem:
- Termos e EULA: escreva
yespara continuar. - Token API: o seu token da Q-Feeds. Se o deixar vazio, o instalador para.
- Feed type: por omissão
malware_ip. Altere apenas se lhe tivermos indicado outro tipo de feed. - Número de IP: prima Enter para não definir limite, é o que recomendamos.
- Bloquear entrada (sim por omissão): o tráfego dos IP listados para o seu servidor é descartado.
- Bloquear saída (não por omissão): o tráfego do seu servidor para os IP listados é descartado.
- Lista branca (opcional): endereços IPv4 e IPv6 ou intervalos CIDR que nunca podem ser bloqueados, separados por vírgulas. Coloque aqui os seus próprios IP de gestão e nunca se fecha fora do servidor.
- Agendamento cron: por omissão
*/10 * * * *, ou seja a cada dez minutos. Correr com frequência não é problema, porque o script só contacta a API quando a sua licença permite uma nova atualização.
Os avisos sobre notação CIDR durante a descarga do feed são inofensivos e pode ignorá-los. Se executar novamente o instalador num host que já tem uma linha cron da Q-Feeds, ele pergunta primeiro e, por omissão, deixa a sua crontab intacta. Em instalações não assistidas, defina QFEEDS_SKIP_CRON=1 para saltar esse passo sem perguntas.
Como funciona
- Deteção da firewall: se o comando
nftexistir, o instalador usa nftables; caso contrário recorre a iptables com ipset. O resultado fica comoBACKENDno ficheiro de configuração, e o script de atualização e o de desinstalação seguem essa escolha. - Regras próprias: o nftables recebe as tabelas
ip qfeedseip6 qfeeds. No iptables, as regras de bloqueio ficam em cadeias dedicadasQFEEDS_INPUTeQFEEDS_OUTPUT, com uma única regra de salto marcada emINPUTeOUTPUT. As suas regras de firewall existentes nunca são tocadas. - Dois tipos de conjuntos: os endereços individuais vão para um conjunto hash e os poucos intervalos CIDR para um conjunto de redes separado. É por isso que carregar 400.000 endereços ou mais leva segundos em vez de minutos.
- Lista branca primeiro: as regras da lista branca são avaliadas antes da lista de bloqueio, por isso um endereço autorizado passa sempre.
- Sincronização completa e diferencial: a primeira execução carrega o feed inteiro e as seguintes obtêm apenas as adições e remoções desde a última descarga. Uma sincronização completa só é aplicada depois de os dados válidos estarem descarregados, por isso uma descarga falhada nunca o deixa sem proteção.
- Auto-reparação: se o conjunto estiver vazio ou muito menor do que o esperado, por exemplo após um reinício em que as regras não foram guardadas, o script reconstrói tudo em vez de completar um conjunto vazio. Por omissão, força também uma sincronização completa a cada 24 horas.
- De acordo com a sua licença: antes de cada execução o script verifica quando a licença permite a próxima atualização. Se ainda não for o momento, termina sem contactar a API.
Verificação
nftables
sudo nft list table ip qfeeds
sudo nft list set ip qfeeds qfeeds_blacklist_v4 | grep -oP '\d+\.\d+\.\d+\.\d+' | wc -l
sudo nft list set ip qfeeds qfeeds_blacklist_v4_nets | head -20
sudo nft list table ip6 qfeeds
iptables com ipset
sudo ipset list -t | grep -A4 qfeeds
sudo ipset list qfeeds_blacklist_v4 | tail -n +9 | wc -l
sudo iptables -L INPUT -n --line-numbers | grep qfeeds
sudo iptables -L QFEEDS_INPUT -n
sudo ip6tables -L QFEEDS_INPUT -n
Para ambos
sudo tail -20 /var/log/qfeeds_blocklist.log
sudo grep -i error /var/log/qfeeds_blocklist.log
sudo crontab -l | grep qfeeds
sudo /usr/local/bin/update_qfeeds_blocklist.sh
sudo QFEEDS_FORCE_UPDATE=1 /usr/local/bin/update_qfeeds_blocklist.sh
O último comando força uma sincronização completa e ignora o agendamento da licença. É a forma mais rápida de confirmar que tudo funciona de ponta a ponta.
Configuração
Todas as opções estão em /etc/qfeeds/qfeeds_config.conf. Pode editar esse ficheiro diretamente em vez de executar o instalador outra vez; a alteração entra em vigor na execução seguinte.
| Opção | Descrição | Valor por omissão |
|---|---|---|
BACKEND | Firewall, nftables ou iptables | detetada |
API_TOKEN | O seu token API da Q-Feeds | obrigatório |
FEED_TYPE | Feed que é descarregado | malware_ip |
LIMIT | Número máximo de IP, vazio significa sem limite | vazio |
BLOCK_INCOMING | Bloquear tráfego dos IP listados | yes |
BLOCK_OUTGOING | Bloquear tráfego para os IP listados | no |
WHITELIST_V4 | Endereços IPv4 ou intervalos CIDR, separados por vírgulas | vazio |
WHITELIST_V6 | Endereços IPv6 ou intervalos CIDR, separados por vírgulas | vazio |
LOG_FILE | Caminho do ficheiro de registo | /var/log/qfeeds_blocklist.log |
FULL_SYNC_MAX_AGE | Segundos até ser forçada nova sincronização completa | 86400 |
Localização de ficheiros e diretórios
- Configuração:
/etc/qfeeds/qfeeds_config.conf - Estado da sincronização:
/etc/qfeeds/.last_synce/etc/qfeeds/.last_count - Script de atualização:
/usr/local/bin/update_qfeeds_blocklist.sh - Registo:
/var/log/qfeeds_blocklist.log - Ficheiro de bloqueio:
/var/lock/qfeeds_blocklist.lock - Cron: crontab do root
- Persistência das regras:
netfilter-persistentquando existe; caso contrário/etc/nftables.confcom nftables, ou/etc/ipset.confcom/etc/iptables.rulese/etc/ip6tables.rulescom iptables
Desinstalação
sudo ./qfeeds-uninstaller.sh
O desinstalador lê qual a firewall configurada e limpa em conformidade. Com nftables elimina as tabelas ip qfeeds e ip6 qfeeds com todas as cadeias, regras e conjuntos. Com iptables retira as regras de salto marcadas, esvazia e elimina as cadeias QFEEDS_INPUT e QFEEDS_OUTPUT e destrói todos os conjuntos qfeeds_. Nos dois casos também desaparecem o diretório de configuração, o script de atualização, a tarefa cron, o registo e o ficheiro de bloqueio. Se o ficheiro de configuração já não existir, limpa as duas variantes por precaução.
Os pacotes do sistema ficam instalados. Remova-os se já não precisar deles:
- Ubuntu/Debian:
sudo apt-get -y remove ipset netfilter-persistent - CentOS/RHEL/Alma/Rocky:
sudo yum -y remove ipset - Fedora:
sudo dnf -y remove ipset - openSUSE/SLES:
sudo zypper remove ipset - Arch:
sudo pacman -R ipset
Cuidado com iptables, nftables, curl e jq: é quase certo que outras partes do sistema precisam deles.
Resolução de problemas
- Os conjuntos estão vazios depois da instalação: veja
sudo tail -50 /var/log/qfeeds_blocklist.log, confirme o seu token API e executesudo QFEEDS_FORCE_UPDATE=1 /usr/local/bin/update_qfeeds_blocklist.sh. - «Not time yet. Next update scheduled at ...»: é normal. A tarefa cron correu, mas a sua licença ainda não permite uma nova atualização. A execução seguinte volta a verificar.
- As regras desaparecem depois de um reinício: o script guarda as regras automaticamente e na execução seguinte deteta o conjunto vazio e reconstrói-o. Por segurança, confirme que o
netfilter-persistentestá instalado ou que o serviçonftablesestá ativado. - «Batch nft -f failed. Falling back to per-command execution»: inofensivo. Acontece sobretudo em contentores LXC com o buffer netlink limitado. Mesmo assim, 400.000 endereços ou mais são carregados em cerca de dez segundos. O mesmo vale para «Message too long».
- «ipset restore failed»: confirme com
command -v ipsetque o ipset existe e comlsmod | grep ip_setque o módulo do kernel está carregado. - Não se veem regras no INPUT: no iptables as regras de bloqueio estão em
QFEEDS_INPUT. NoINPUTestá apenas a regra de salto, marcada com o comentárioqfeeds. Verifique as duas comsudo iptables -L INPUT -n | grep qfeedsesudo iptables -L QFEEDS_INPUT -n. - A instalação falha com «Unable to locate package»: a sua distribuição não foi reconhecida. Instale
curl,jqeutil-linuxmanualmente, além denftablesouiptablescomipset, e execute o instalador novamente. - Suporte: support@qfeeds.com ou a página de suporte. Encontrou um erro nos scripts? Comunique-o como issue no repositório do GitHub.