Les scripts sont open source et publiés sur GitHub : Q-Feeds/NFtables-IPtables-integration-script. Récupérez-les toujours là, vous êtes ainsi certain d'avoir la version actuelle. Il vous faut un accès root, un HTTPS sortant vers api.qfeeds.com et un jeton API Q-Feeds. Voir Obtenir vos threat feeds. L'installateur vous demande d'abord d'accepter nos Conditions générales et l'EULA.
Prérequis
- OS : Linux avec nftables, ou avec iptables et ipset
- Distributions : Debian, Ubuntu, CentOS, RHEL, AlmaLinux, Rocky Linux, Fedora, openSUSE Leap, SLES, Arch Linux, Alpine
- Privilèges : root pour l'installation, les mises à jour et les modifications du pare-feu
- Flux : liste d'IP malveillantes (
feed_type=malware_ip) - Paquets : le script les installe pour vous, vous n'avez rien à préparer. Pour nftables il s'agit de
nftables,curl,jqetutil-linux. Pour iptables, deiptables,ipset,curl,jqetutil-linux.
Test facultatif avant l'installation :
curl -v -u api_token:YOUR_TOKEN "https://api.qfeeds.com/api?feed_type=malware_ip&limit=1000"
Récupérer les 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
Pas de git sur le serveur ? Téléchargez plutôt l'archive ZIP depuis la page du dépôt et décompressez-la.
Installation
sudo ./qfeeds-installer.sh
L'installateur détecte votre pare-feu, pose quelques questions, met en place le script de mise à jour avec sa tâche cron, puis lance immédiatement une première synchronisation complète pour que la liste de blocage soit active tout de suite. Les questions, dans l'ordre :
- Conditions et EULA : tapez
yespour continuer. - Jeton API : votre jeton Q-Feeds. Si vous le laissez vide, l'installateur s'arrête.
- Feed type : par défaut
malware_ip. Ne le changez que si nous vous avons fourni un autre type de flux. - Nombre d'IP : appuyez sur Entrée pour ne fixer aucune limite, c'est ce que nous recommandons.
- Bloquer l'entrant (oui par défaut) : le trafic venant des IP listées vers votre serveur est rejeté.
- Bloquer le sortant (non par défaut) : le trafic de votre serveur vers les IP listées est rejeté.
- Liste blanche (facultatif) : adresses IPv4 et IPv6 ou plages CIDR à ne jamais bloquer, séparées par des virgules. Indiquez ici vos propres IP d'administration, vous ne risquez ainsi pas de vous bloquer vous-même.
- Planification cron : par défaut
*/10 * * * *, soit toutes les dix minutes. Une exécution fréquente ne pose pas de problème, car le script n'appelle l'API que si votre licence autorise une nouvelle mise à jour.
Les avertissements sur la notation CIDR pendant la récupération du flux sont sans conséquence et peuvent être ignorés. Si vous relancez l'installateur sur un hôte où une ligne cron Q-Feeds existe déjà, il vous demande confirmation et laisse votre crontab inchangée par défaut. Pour une installation sans surveillance, définissez QFEEDS_SKIP_CRON=1 afin de sauter cette étape sans question.
Fonctionnement
- Détection du pare-feu : si la commande
nftest présente, l'installateur utilise nftables, sinon il se rabat sur iptables avec ipset. Le résultat est enregistré commeBACKENDdans le fichier de configuration ; le script de mise à jour et le script de désinstallation s'y conforment. - Règles séparées : nftables reçoit ses propres tables
ip qfeedsetip6 qfeeds. Avec iptables, les règles de blocage se trouvent dans des chaînes dédiéesQFEEDS_INPUTetQFEEDS_OUTPUT, avec une seule règle de saut marquée dansINPUTetOUTPUT. Vos règles de pare-feu existantes ne sont jamais touchées. - Deux types d'ensembles : les adresses individuelles vont dans un ensemble de hachage et les rares plages CIDR dans un ensemble réseau distinct. C'est ce qui permet de charger 400 000 adresses ou plus en quelques secondes plutôt qu'en plusieurs minutes.
- La liste blanche d'abord : les règles de liste blanche sont évaluées avant la liste de blocage, une adresse autorisée passe donc toujours.
- Synchronisation complète et différentielle : la première exécution charge tout le flux, les suivantes ne récupèrent que les ajouts et les retraits depuis votre dernier appel. Une synchronisation complète n'est appliquée qu'une fois les données valides téléchargées, un échec de téléchargement ne vous laisse donc jamais sans protection.
- Auto-réparation : si l'ensemble est vide ou nettement plus petit que prévu, par exemple après un redémarrage où les règles n'ont pas été conservées, le script le reconstruit entièrement au lieu de compléter un ensemble vide. Par défaut, une synchronisation complète a également lieu toutes les 24 heures.
- Selon votre licence : avant chaque exécution, le script vérifie quand votre licence autorise la prochaine mise à jour. Si le moment n'est pas venu, il s'arrête sans appeler l'API.
Vérification
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 avec 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
Pour les deux
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
La dernière commande force une synchronisation complète et ignore la planification liée à la licence. C'est le moyen le plus rapide de vérifier que tout fonctionne de bout en bout.
Configuration
Tous les réglages se trouvent dans /etc/qfeeds/qfeeds_config.conf. Vous pouvez modifier ce fichier directement au lieu de relancer l'installateur ; le changement prend effet à l'exécution suivante.
| Réglage | Description | Valeur par défaut |
|---|---|---|
BACKEND | Pare-feu, nftables ou iptables | détecté |
API_TOKEN | Votre jeton API Q-Feeds | obligatoire |
FEED_TYPE | Flux récupéré | malware_ip |
LIMIT | Nombre maximal d'IP, vide signifie aucune limite | vide |
BLOCK_INCOMING | Bloquer le trafic venant des IP listées | yes |
BLOCK_OUTGOING | Bloquer le trafic vers les IP listées | no |
WHITELIST_V4 | Adresses IPv4 ou plages CIDR, séparées par des virgules | vide |
WHITELIST_V6 | Adresses IPv6 ou plages CIDR, séparées par des virgules | vide |
LOG_FILE | Chemin du fichier journal | /var/log/qfeeds_blocklist.log |
FULL_SYNC_MAX_AGE | Secondes avant qu'une synchronisation complète soit forcée | 86400 |
Emplacements des fichiers et répertoires
- Configuration :
/etc/qfeeds/qfeeds_config.conf - État de synchronisation :
/etc/qfeeds/.last_syncet/etc/qfeeds/.last_count - Script de mise à jour :
/usr/local/bin/update_qfeeds_blocklist.sh - Journal :
/var/log/qfeeds_blocklist.log - Fichier de verrouillage :
/var/lock/qfeeds_blocklist.lock - Cron : crontab root
- Conservation des règles :
netfilter-persistents'il est présent, sinon/etc/nftables.confpour nftables ou/etc/ipset.confavec/etc/iptables.ruleset/etc/ip6tables.rulespour iptables
Désinstallation
sudo ./qfeeds-uninstaller.sh
Le script de désinstallation lit quel pare-feu est configuré et nettoie en conséquence. Avec nftables, il supprime les tables ip qfeeds et ip6 qfeeds ainsi que toutes leurs chaînes, règles et ensembles. Avec iptables, il retire les règles de saut marquées, vide et supprime les chaînes QFEEDS_INPUT et QFEEDS_OUTPUT, puis détruit tous les ensembles qfeeds_. Dans les deux cas, le répertoire de configuration, le script de mise à jour, la tâche cron, le journal et le fichier de verrouillage disparaissent également. Si le fichier de configuration est absent, il nettoie les deux variantes par précaution.
Les paquets système restent en place. Supprimez-les vous-même si vous n'en avez plus besoin :
- 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
Attention avec iptables, nftables, curl et jq : d'autres composants de votre système en ont presque certainement besoin.
Dépannage
- Les ensembles sont vides après l'installation : consultez
sudo tail -50 /var/log/qfeeds_blocklist.log, vérifiez votre jeton API, puis lancezsudo QFEEDS_FORCE_UPDATE=1 /usr/local/bin/update_qfeeds_blocklist.sh. - « Not time yet. Next update scheduled at ... » : c'est normal. La tâche cron s'est exécutée, mais votre licence n'autorise pas encore de nouvelle mise à jour. L'exécution suivante vérifiera de nouveau.
- Règles disparues après un redémarrage : le script enregistre les règles automatiquement et constate à l'exécution suivante que l'ensemble est vide, puis le reconstruit. Vérifiez par sécurité que
netfilter-persistentest installé ou que le servicenftablesest activé. - « Batch nft -f failed. Falling back to per-command execution » : sans conséquence. Cela arrive surtout dans les conteneurs LXC dont le tampon netlink est limité. Même dans ce cas, 400 000 adresses ou plus sont chargées en une dizaine de secondes. Idem pour « Message too long ».
- « ipset restore failed » : vérifiez avec
command -v ipsetqu'ipset est présent et aveclsmod | grep ip_setque le module noyau est chargé. - Aucune règle visible dans INPUT : avec iptables, les règles de blocage se trouvent dans
QFEEDS_INPUT.INPUTne contient que la règle de saut, marquée par le commentaireqfeeds. Vérifiez les deux avecsudo iptables -L INPUT -n | grep qfeedsetsudo iptables -L QFEEDS_INPUT -n. - L'installation s'arrête sur « Unable to locate package » : votre distribution n'a pas été reconnue. Installez
curl,jqetutil-linuxà la main, ainsi quenftablesouiptablesavecipset, puis relancez l'installateur. - Assistance : support@qfeeds.com ou la page d'assistance. Vous avez trouvé un bug dans les scripts ? Signalez-le comme issue dans le dépôt GitHub.
Télécharger le manuel PDF complet Voir les scripts sur GitHub