Los scripts son de código abierto y están en GitHub: Q-Feeds/NFtables-IPtables-integration-script. Descárguelos siempre de allí para tener con seguridad la versión actual. Necesita acceso root, HTTPS saliente a api.qfeeds.com y un token API de Q-Feeds. Consulte Obtener sus threat feeds. El instalador le pide primero que acepte nuestros Términos y condiciones y el EULA.
Requisitos
- SO: Linux con nftables, o con iptables e ipset
- Distribuciones: Debian, Ubuntu, CentOS, RHEL, AlmaLinux, Rocky Linux, Fedora, openSUSE Leap, SLES, Arch Linux, Alpine
- Privilegios: root para la instalación, las actualizaciones y los cambios en el firewall
- Feed: lista de IP maliciosas (
feed_type=malware_ip) - Paquetes: los instala el script por usted, no tiene que preparar nada. Con nftables son
nftables,curl,jqyutil-linux. Con iptables soniptables,ipset,curl,jqyutil-linux.
Prueba opcional antes de instalar:
curl -v -u api_token:YOUR_TOKEN "https://api.qfeeds.com/api?feed_type=malware_ip&limit=1000"
Obtener los 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
¿No hay git en el servidor? Descargue el archivo ZIP desde la página del repositorio y descomprímalo.
Instalación
sudo ./qfeeds-installer.sh
El instalador detecta su firewall, hace unas pocas preguntas, coloca el script de actualización con su tarea cron y ejecuta de inmediato una primera sincronización completa para que la lista de bloqueo esté activa desde el principio. Las preguntas, en orden:
- Términos y EULA: escriba
yespara continuar. - Token API: su token de Q-Feeds. Si lo deja vacío, el instalador se detiene.
- Feed type: por defecto
malware_ip. Cámbielo solo si le hemos facilitado otro tipo de feed. - Número de IP: pulse Enter para no fijar límite, es lo que recomendamos.
- Bloquear entrante (sí por defecto): se descarta el tráfico desde las IP listadas hacia su servidor.
- Bloquear saliente (no por defecto): se descarta el tráfico desde su servidor hacia las IP listadas.
- Lista blanca (opcional): direcciones IPv4 e IPv6 o rangos CIDR que nunca deben bloquearse, separados por comas. Añada aquí sus propias IP de gestión y así no se quedará fuera nunca.
- Programación cron: por defecto
*/10 * * * *, es decir cada diez minutos. Ejecutarlo a menudo no supone problema, porque el script solo llama a la API cuando su licencia permite una nueva actualización.
Los avisos sobre la notación CIDR mientras se descarga el feed son inofensivos y puede ignorarlos. Si vuelve a ejecutar el instalador en un host que ya tiene una línea cron de Q-Feeds, le pregunta antes y deja su crontab sin cambios por defecto. Para instalaciones desatendidas, defina QFEEDS_SKIP_CRON=1 y ese paso se omite sin preguntar.
Cómo funciona
- Detección del firewall: si existe el comando
nft, el instalador usa nftables; si no, recurre a iptables con ipset. El resultado queda comoBACKENDen el archivo de configuración, y el script de actualización y el de desinstalación lo respetan. - Reglas propias: nftables recibe sus propias tablas
ip qfeedseip6 qfeeds. Con iptables, las reglas de bloqueo viven en cadenas dedicadasQFEEDS_INPUTyQFEEDS_OUTPUT, con una única regla de salto etiquetada enINPUTyOUTPUT. Sus reglas de firewall existentes no se tocan nunca. - Dos tipos de conjuntos: las direcciones sueltas van a un conjunto hash y los pocos rangos CIDR a un conjunto de redes aparte. Por eso cargar 400.000 direcciones o más tarda segundos en lugar de minutos.
- La lista blanca primero: las reglas de lista blanca se evalúan antes que la lista de bloqueo, así que una dirección permitida siempre pasa.
- Sincronización completa y diferencial: la primera ejecución carga todo el feed y las siguientes solo recogen las altas y bajas desde su última descarga. Una sincronización completa se aplica únicamente cuando los datos válidos ya están descargados, así que una descarga fallida nunca le deja sin protección.
- Autorreparación: si el conjunto está vacío o es mucho más pequeño de lo esperado, por ejemplo tras un reinicio en el que no se guardaron las reglas, el script lo reconstruye por completo en lugar de completar un conjunto vacío. Además, por defecto fuerza una sincronización completa cada 24 horas.
- Según su licencia: antes de cada ejecución el script comprueba cuándo permite su licencia la siguiente actualización. Si aún no toca, termina sin llamar a la API.
Comprobación
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 con 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
El último comando fuerza una sincronización completa e ignora la programación de la licencia. Es la forma más rápida de confirmar que todo funciona de principio a fin.
Configuración
Todos los ajustes están en /etc/qfeeds/qfeeds_config.conf. Puede editar ese archivo directamente en lugar de volver a ejecutar el instalador; el cambio se aplica en la siguiente ejecución.
| Ajuste | Descripción | Valor por defecto |
|---|---|---|
BACKEND | Firewall, nftables o iptables | detectado |
API_TOKEN | Su token API de Q-Feeds | obligatorio |
FEED_TYPE | Feed que se descarga | malware_ip |
LIMIT | Número máximo de IP, vacío significa sin límite | vacío |
BLOCK_INCOMING | Bloquear el tráfico desde las IP listadas | yes |
BLOCK_OUTGOING | Bloquear el tráfico hacia las IP listadas | no |
WHITELIST_V4 | Direcciones IPv4 o rangos CIDR, separados por comas | vacío |
WHITELIST_V6 | Direcciones IPv6 o rangos CIDR, separados por comas | vacío |
LOG_FILE | Ruta del archivo de registro | /var/log/qfeeds_blocklist.log |
FULL_SYNC_MAX_AGE | Segundos antes de forzar otra sincronización completa | 86400 |
Ubicación de archivos y directorios
- Configuración:
/etc/qfeeds/qfeeds_config.conf - Estado de sincronización:
/etc/qfeeds/.last_syncy/etc/qfeeds/.last_count - Script de actualización:
/usr/local/bin/update_qfeeds_blocklist.sh - Registro:
/var/log/qfeeds_blocklist.log - Archivo de bloqueo:
/var/lock/qfeeds_blocklist.lock - Cron: crontab de root
- Conservación de las reglas:
netfilter-persistentsi está disponible; en su defecto/etc/nftables.confcon nftables, o/etc/ipset.confjunto con/etc/iptables.rulese/etc/ip6tables.rulescon iptables
Desinstalación
sudo ./qfeeds-uninstaller.sh
El desinstalador lee qué firewall está configurado y limpia en consecuencia. Con nftables elimina las tablas ip qfeeds e ip6 qfeeds con todas sus cadenas, reglas y conjuntos. Con iptables retira las reglas de salto etiquetadas, vacía y elimina las cadenas QFEEDS_INPUT y QFEEDS_OUTPUT y destruye todos los conjuntos qfeeds_. En ambos casos también desaparecen el directorio de configuración, el script de actualización, la tarea cron, el registro y el archivo de bloqueo. Si falta el archivo de configuración, limpia las dos variantes por precaución.
Los paquetes del sistema se mantienen. Quítelos usted mismo si ya no los necesita:
- 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
Tenga cuidado con iptables, nftables, curl y jq: es casi seguro que otras partes de su sistema los necesitan.
Resolución de problemas
- Los conjuntos están vacíos tras la instalación: revise
sudo tail -50 /var/log/qfeeds_blocklist.log, compruebe su token API y ejecutesudo QFEEDS_FORCE_UPDATE=1 /usr/local/bin/update_qfeeds_blocklist.sh. - «Not time yet. Next update scheduled at ...»: es normal. La tarea cron se ejecutó, pero su licencia todavía no permite una nueva actualización. La siguiente ejecución volverá a comprobarlo.
- Las reglas desaparecen tras un reinicio: el script guarda las reglas automáticamente y en la siguiente ejecución detecta el conjunto vacío y lo reconstruye. Por seguridad, compruebe que
netfilter-persistentestá instalado o que el servicionftablesestá activado. - «Batch nft -f failed. Falling back to per-command execution»: inofensivo. Ocurre sobre todo en contenedores LXC con el búfer netlink limitado. Incluso así, 400.000 direcciones o más se cargan en unos diez segundos. Lo mismo vale para «Message too long».
- «ipset restore failed»: compruebe con
command -v ipsetque ipset está presente y conlsmod | grep ip_setque el módulo del kernel está cargado. - No se ven reglas en INPUT: con iptables las reglas de bloqueo están en
QFEEDS_INPUT. EnINPUTsolo está la regla de salto, etiquetada con el comentarioqfeeds. Compruebe ambas consudo iptables -L INPUT -n | grep qfeedsysudo iptables -L QFEEDS_INPUT -n. - La instalación falla con «Unable to locate package»: no se ha reconocido su distribución. Instale
curl,jqyutil-linuxa mano, además denftablesoiptablesconipset, y vuelva a ejecutar el instalador. - Soporte: support@qfeeds.com o la página de soporte. ¿Ha encontrado un error en los scripts? Comuníquelo como issue en el repositorio de GitHub.