Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
Outils/GitHubGitHub/q-feeds/nftables-iptables-integration-script
Defensive ToolsScripting & AutomationConfiguration AuditingNetwork SecurityThreat IntelligenceIncident Response
GitHubq-feeds/nftables-iptables-integration-script

NFtables-IPtables-integration-script

Script to implement Q-Feeds directly on NFtables or IPtables

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager
Voir le dépôtSite web
il y a 1 moisPas encore vérifié

🛡️ Intégration de la liste de blocage du pare-feu Linux Q-Feeds

Liste de blocage IP automatisée pour les serveurs Linux — prend en charge nftables et iptables+ipset

License Linux


📋 Table des matières

  • Quick Start
  • Overview
  • How It Works
  • Prerequisites
  • Detailed Installation
  • Configuration
  • Usage and Verification
  • Troubleshooting
  • Uninstalling
  • License

🚀 Démarrage rapide

Étape 1 : Obtenez votre jeton API

Obtenez une clé API gratuite sur tip.qfeeds.com.

Étape 2 : Téléchargez les scripts```bash

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

root@kitploit:~
### Étape 3 : Exécuter l'installateur en tant que root```bash
sudo ./qfeeds-installer.sh

L’installateur va :

  1. Détecter automatiquement votre pare-feu sous-jacent (nftables ou iptables)
  2. Vous demander votre jeton API, vos options de blocage et une liste blanche facultative
  3. Installer toutes les dépendances, le script de mise à jour et la tâche cron
  4. Effectuer immédiatement la première synchronisation complète

Étape 4 : Terminé

Votre serveur est maintenant protégé. La tâche cron vérifie les mises à jour toutes les 20 minutes (configurable), et les appels API réels n’ont lieu que lorsque votre licence le permet.


📖 Présentation

Cette solution télécharge périodiquement le dernier flux de renseignements sur les menaces de Q-Feeds et l’applique sous forme de règles de pare-feu, vous permettant de :

  • ✅ Bloquer les connexions entrantes provenant d’IP malveillantes connues
  • ✅ Bloquer les connexions sortantes vers des IP malveillantes connues
  • ✅ Mettre en liste blanche vos propres IP/CIDR afin de ne jamais vous exclure
  • ✅ Planification automatique basée sur votre licence Q-Feeds
  • ✅ Mises à jour incrémentielles via une synchronisation différentielle pour une utilisation minimale des ressources

Pourquoi cette approche ?

  • ✅ Détection automatique du sous-jacent — fonctionne avec nftables ou iptables+ipset sans sélection manuelle
  • ✅ Rapide — charge plus de 400 000 IP en quelques secondes grâce à des jeux de hachage optimisés (nftables) ou ipset (iptables)
  • ✅ Sûr — utilise des tables/ensembles dédiés — ne touche jamais à vos règles de pare-feu existantes
  • ✅ Efficace — les mises à jour différentielles ne traitent que les changements, pas la liste complète
  • ✅ Fiable — auto-réparation : détecte un ensemble local vide ou incomplet (par exemple après un redémarrage) et le reconstruit, avec repli automatique sur une synchronisation complète en cas d’échec d’une différence
  • ✅ Flexible — choisissez le blocage entrant/sortant, liste blanche facultative

🔧 Fonctionnement

Détection du sous-jacent

L’installateur détecte automatiquement le sous-jacent de pare-feu disponible :

Le sous-jacent détecté est stocké dans le fichier de configuration. Les scripts de mise à jour et de désinstallation l’utilisent pour exécuter les commandes de pare-feu appropriées.

Architecture : deux types d’ensembles

Les deux sous-jacents utilisent la même stratégie de jeu divisé pour des performances maximales :

Sous-jacent 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 │ └─────────────────────────────────────────────────────────┘

root@kitploit:~
**iptables+ipset backend:**```
┌──────────────────────────────────────────────────────────┐
│  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)     │
└──────────────────────────────────────────────────────────┘

La même structure existe pour IPv6 (ip6 qfeeds table ou ip6tables + family inet6 ipsets).

Pourquoi deux types d'ensembles ?

  • Les ensembles de hachage stockent des IP individuelles avec une insertion et une recherche en O(1) — le chargement de plus de 400k+ IP prend quelques secondes
  • Les ensembles net/intervalle ne sont utilisés que pour le petit nombre de plages CIDR dans le flux
  • Cela évite des opérations de fusion coûteuses qui ralentiraient un seul ensemble contenant des centaines de milliers d'entrées

Flux de mise à jour```

┌──────────────────────────────────────────────────────┐ │ 1. Check license schedule (licenses.php API) │ │ → Skip run if not yet time for next update │ │ 2. Determine sync mode (full or diff) │ │ 3. Fetch IPv4 feed (ipv6=0) and IPv6 feed │ │ (ipv6=only) separately │ │ 4. Separate IPs from CIDRs in awk │ │ 5. Batch-load into hash set (IPs) and net/interval │ │ set (CIDRs) │ │ 6. Update whitelist sets from config │ │ 7. Persist rules │ └──────────────────────────────────────────────────────┘

root@kitploit:~
### Synchronisation complète vs synchronisation différentielle

| Mode | Quand | Ce qu'il fait |
|------|------|-------------|
| **Synchronisation complète** | Première exécution, mise à jour forcée, après un échec de diff, lorsque l'ensemble local a perdu sa référence (vide ou beaucoup plus petit que prévu), ou lorsque la dernière synchronisation est plus ancienne que `FULL_SYNC_MAX_AGE` (24h par défaut) | Récupère et valide d'abord chaque flux, puis vide et recharge les ensembles de blacklist. L'ensemble n'est vidé qu'après avoir obtenu des données valides, donc un échec de récupération ne vous laisse jamais sans protection |
| **Synchronisation différentielle** | Exécutions suivantes (flux `malware_ip` uniquement) avec un ensemble local sain | Récupère uniquement les ajouts (`+`) et les suppressions (`-`) depuis la dernière récupération |

La synchronisation différentielle est **par clé API** — l'API suit votre dernière récupération réussie et ne renvoie que les changements depuis cette date. Si un diff échoue, le script bascule automatiquement vers une synchronisation complète.

> **Auto-réparation :** Les mises à jour différentielles ne patchent que l'ensemble existant. Si cet ensemble est perdu ou tronqué – par exemple après un redémarrage où les règles du pare-feu n'ont pas été persistées, une vidange manuelle ou une synchronisation partielle antérieure – le programme de mise à jour détecte la référence manquante (le nombre d'éléments en direct est 0 ou bien inférieur au dernier nombre enregistré) et force une reconstruction complète au lieu d'appliquer un diff sur un ensemble vide. Comme filet de sécurité supplémentaire, il force également une synchronisation complète périodique (toutes les 24h par défaut, via `FULL_SYNC_MAX_AGE`).

### Planification basée sur la licence

Le programme de mise à jour vérifie l'API de licence Q-Feeds (`licenses.php`) avant chaque exécution. Si l'horodatage `next_update` de votre licence n'est pas encore atteint, le script se termine prématurément sans effectuer d'appels API inutiles. La tâche cron s'exécute fréquemment (par défaut : toutes les 20 minutes), mais les mises à jour réelles n'ont lieu que lorsque votre licence le permet.

---

## ✅ Prérequis

Avant l'installation, assurez-vous d'avoir :

- [x] **Serveur Linux** avec **nftables** ou **iptables** (Debian, Ubuntu, CentOS, Fedora, Arch, Alpine)
- [x] **Accès root** — l'installateur et le programme de mise à jour doivent s'exécuter en tant que root
- [x] **Jeton API Q-Feeds** — obtenez le vôtre gratuitement sur [tip.qfeeds.com](https://tip.qfeeds.com/)
- [x] **Accès Internet** — le serveur doit pouvoir atteindre `api.qfeeds.com`

L'installateur installera automatiquement les dépendances nécessaires :
- **Backend nftables** : `nftables`, `curl`, `jq`, `util-linux`
- **Backend iptables** : `iptables`, `ipset`, `curl`, `jq`, `util-linux`

---

## 📝 Guide d'installation détaillé

### 1. Obtenez votre jeton API

Visitez [tip.qfeeds.com](https://tip.qfeeds.com/) pour obtenir votre jeton API Q-Feeds gratuit.

### 2. Téléchargez et exécutez```bash
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

3. Invites de l'installateur

L'installateur posera les questions suivantes:

API Token (obligatoire)```

Enter your Q-Feeds API Token:

root@kitploit:~
Votre jeton depuis [tip.qfeeds.com](https://tip.qfeeds.com/). L'installateur refuse de continuer si vide.

#### Type de flux```
Enter feed type [default: malware_ip]:

La valeur par défaut est malware_ip. Modifiez-la uniquement si Q-Feeds vous a fourni un type de flux différent.

Limite IP```

Enter the limit of IPs to fetch (leave empty for no limit):

root@kitploit:~
Appuyez sur Entrée pour aucune limite (recommandé). Entrez un nombre pour limiter la taille du flux.

#### Blocage directionnel```
Block INCOMING connections from malicious IPs? [Y/n]:
Block OUTGOING connections to malicious IPs? [y/N]:
  • Entrant (default: yes) — bloque le trafic depuis les IP blacklistées vers votre serveur
  • Sortant (default: no) — bloque le trafic depuis votre serveur vers les IP blacklistées

Liste blanche (optionnel)```

Configure a whitelist of IPs/CIDRs that must NEVER be blocked? [y/N]: Enter IPv4 whitelist (comma-separated, e.g. 1.2.3.4,5.6.7.8): Enter IPv6 whitelist (comma-separated, e.g. 2001:db8::1):

root@kitploit:~
Ajoutez vos IP de gestion ici pour garantir que vous ne serez jamais verrouillé, même si elles apparaissent dans le flux. Les règles de liste blanche sont toujours vérifiées **avant** les règles de liste noire.

#### Planification Cron```
Enter cron schedule (e.g., '*/20 * * * *') [default: */20 * * * *]:

How often the updater checks for new data. Default is every 20 minutes. The license-based scheduling ensures the API is only called when your license allows an update.

Réexécution de l'installateur avec une crontab personnalisée : Si une entrée cron Q-Feeds existe déjà, l'installateur demande avant de la modifier :

root@kitploit:~
An existing Q-Feeds cron entry was found in the current crontab.
Replace it with a fresh default entry? Choosing 'no' keeps your crontab unchanged [y/N]:

Répondez no (par défaut) pour conserver votre crontab existante. Une première installation propre n'a aucune entrée existante et ignore cette invite. Pour les installations en mode non interactif, définissez QFEEDS_SKIP_CRON=1 pour laisser la crontab inchangée sans être invité.


⚙️ Configuration

Tous les paramètres sont stockés dans /etc/qfeeds/qfeeds_config.conf. Vous pouvez modifier ce fichier directement sans réexécuter l'installateur. Les modifications prennent effet lors de la prochaine exécution de cron.

Référence du fichier de configuration

Fichiers créés par l'installateur


🎯 Utilisation et vérification

Backend nftables```bash

Show the table structure and rules

nft list table ip qfeeds

Count loaded IPv4 IPs (individual addresses)

nft list set ip qfeeds qfeeds_blacklist_v4 | grep -oP '\d+.\d+.\d+.\d+' | wc -l

Show loaded CIDR ranges

nft list set ip qfeeds qfeeds_blacklist_v4_nets | head -20

Count loaded IPv6 addresses

nft list set ip6 qfeeds qfeeds_blacklist_v6 | wc -l

root@kitploit:~
### iptables+ipset backend```bash
# List all Q-Feeds ipsets and their sizes
ipset list -t | grep -A4 qfeeds

# Count loaded IPv4 IPs
ipset list qfeeds_blacklist_v4 | tail -n +9 | wc -l

# Show loaded CIDR ranges
ipset list qfeeds_blacklist_v4_nets | tail -n +9 | head -20

# Show the qfeeds jump rule in INPUT, then the dedicated chain's block rules
iptables -L INPUT -n --line-numbers | grep qfeeds
iptables -L QFEEDS_INPUT -n
ip6tables -L QFEEDS_INPUT -n

Commandes courantes (les deux backends)```bash

Check the log (last 20 entries)

tail -20 /var/log/qfeeds_blocklist.log

Check for errors

grep -i "error" /var/log/qfeeds_blocklist.log

Normal run (respects license schedule)

sudo /usr/local/bin/update_qfeeds_blocklist.sh

Force a full sync (ignores schedule, reloads everything)

sudo QFEEDS_FORCE_UPDATE=1 /usr/local/bin/update_qfeeds_blocklist.sh

Verify cron is set up

sudo crontab -l | grep qfeeds

root@kitploit:~
## 🔍 Dépannage

### Général

**L'installation échoue avec « Unable to locate package »**
- L'installateur détecte automatiquement votre distribution (Debian/Ubuntu, CentOS/RHEL, Fedora, Arch, Alpine). Si la détection échoue, installez les dépendances manuellement : `curl`, `jq`, `util-linux` (pour `flock`), ainsi que `nftables` ou `iptables`+`ipset`.

**Les ensembles sont vides après l'installation**
- Vérifiez le journal : `tail -50 /var/log/qfeeds_blocklist.log`
- Vérifiez que votre jeton API est correct
- Essayez une mise à jour forcée : `sudo QFEEDS_FORCE_UPDATE=1 /usr/local/bin/update_qfeeds_blocklist.sh`

**« Pas encore l'heure. Prochaine mise à jour prévue à... »**
- L'utilitaire de mise à jour respecte votre calendrier de licence. Ce message signifie que cron s'est exécuté, mais que votre licence n'autorise pas encore une mise à jour. C'est normal — la prochaine exécution de cron vérifiera à nouveau.
- L'installateur Linux conserve un index local mis en cache de `licenses.php` et utilise le `next_update` mis en cache comme porte d'entrée du planning. Après un téléchargement réussi, il actualise cet index local pour le cycle suivant.

**Les règles ne persistent pas après un redémarrage**
- Si `netfilter-persistent` est installé, les règles sont sauvegardées automatiquement
- **nftables** : si `netfilter-persistent` est absent, l'utilitaire de mise à jour écrit désormais l'ensemble des règles dans `/etc/nftables.conf` automatiquement et active le service `nftables` ; vous pouvez toujours sauvegarder manuellement avec `nft list ruleset > /etc/nftables.conf`
- **iptables** : l'utilitaire de mise à jour sauvegarde avec `ipset save > /etc/ipset.conf` et `iptables-save` ; vous pouvez aussi sauvegarder manuellement
- Même si la persistance échoue complètement, l'utilitaire de mise à jour s'auto-répare : lors de la prochaine exécution, il détecte l'ensemble vide après un redémarrage et le reconstruit avec une synchronisation complète.

### Spécifique à nftables

**« Batch nft -f failed. Falling back to per-command execution... »**
- Ceci est normal, surtout sur les conteneurs LXC où le tampon netlink du noyau (`wmem_max`) est limité. Le repli par commande fonctionne correctement et est rapide (~10 secondes pour 400k+ IPs).

**Erreur de syntaxe : « unexpected string »**
- Assurez-vous d'exécuter une version récente de nftables. Le script utilise la syntaxe `ip saddr`/`ip daddr` qui nécessite nftables 0.9+.

**« Error: Could not process rule: Message too long »**
- Il s'agit de la limite du tampon netlink, typiquement dans les conteneurs LXC. Le script revient automatiquement à une exécution par commande. Si vous voyez ceci dans le journal en même temps qu'un chargement réussi, cela fonctionne comme prévu.

### Spécifique à iptables+ipset

**« ipset restore failed »**
- Vérifiez que `ipset` est installé : `command -v ipset`
- Vérifiez le journal pour des erreurs spécifiques : `grep -i "error" /var/log/qfeeds_blocklist.log`
- Assurez-vous que le module ipset est chargé : `lsmod | grep ip_set`

**Les règles iptables n'apparaissent pas**
- Les règles de blocage se trouvent dans les chaînes dédiées `QFEEDS_INPUT` / `QFEEDS_OUTPUT` ; `INPUT`/`OUTPUT` ne contiennent qu'un saut `-j QFEEDS_INPUT` marqué avec le commentaire `qfeeds`
- Vérifiez avec : `iptables -L INPUT -n | grep qfeeds` (le saut) et `iptables -L QFEEDS_INPUT -n` (les règles de blocage)
- La règle de saut utilise `-m comment --comment "qfeeds"` pour l'identification
- Assurez-vous que le module `xt_set` est chargé : `modprobe xt_set`

**« ipset create ... a échoué »**
- Sur des noyaux très anciens, les types `hash:ip` ou `hash:net` peuvent ne pas être disponibles. Mettez à niveau votre noyau ou installez `ipset` depuis un dépôt plus récent.

---

## 🗑️ Désinstallation```bash
sudo ./qfeeds-uninstaller.sh

Le désinstalleur supprime tout en fonction du backend détecté :

Backend nftables :

  • Supprime les tables ip qfeeds et ip6 qfeeds (y compris toutes les chaînes, règles et ensembles)

Backend iptables :

  • Supprime toutes les règles iptables/ip6tables étiquetées avec le commentaire qfeeds (y compris les règles de saut)
  • Vide et supprime les chaînes QFEEDS_INPUT / QFEEDS_OUTPUT
  • Détruit tous les ensembles ipset (qfeeds_blacklist_v4, qfeeds_blacklist_v4_nets, qfeeds_whitelist_v4 et les équivalents IPv6)

Les deux backends :

  • Répertoire de configuration (/etc/qfeeds/)
  • Script de mise à jour (/usr/local/bin/update_qfeeds_blocklist.sh)
  • Tâche cron, fichier journal et fichier de verrouillage

Si le fichier de configuration est manquant, le désinstalleur tente un nettoyage pour les deux backends.

Note : Le désinstalleur ne supprime pas les paquets système (curl, jq, ipset, etc.) qui ont été installés comme dépendances.


📄 Licence

Ce projet est sous licence Apache License 2.0 - voir le fichier LICENSE pour plus de détails.


⚠️ Avertissement

Utilisation à vos propres risques.

Veuillez tester ces scripts dans votre environnement avant de les déployer en production. L'auteur n'est pas responsable des problèmes ou dommages pouvant résulter de leur utilisation.

Assistance IA : Des parties de ce projet (code, corrections et documentation) ont été écrites avec l'aide d'outils IA et ont ensuite été revues par les mainteneurs. Bien que nous testions et révisions les modifications, veuillez examiner les scripts vous-même avant de les exécuter et signalez tout ce qui vous semble anormal.


Signaler un bug · Demander une fonctionnalité

Télécharger l’outil
PrioritéDétectionSous-jacent
1èreCommande nft trouvéenftables
2èmeCommande iptables trouvéeiptables+ipset
—Aucune trouvéeErreur (arrêt)
VariableDescriptionValeur par défaut
BACKENDBackend de pare-feu (nftables ou iptables)(détection automatique)
API_TOKENVotre jeton API Q-Feeds(obligatoire)
FEED_TYPEType de flux à récupérermalware_ip
LIMITNombre max d'IP à récupérer (vide = aucune limite)(vide)
BLOCK_INCOMINGBloquer le trafic entrant depuis des IP blacklistéesyes
BLOCK_OUTGOINGBloquer le trafic sortant vers des IP blacklistéesno
WHITELIST_V4Liste blanche IPv4 séparée par des virgules(vide)
WHITELIST_V6Liste blanche IPv6 séparée par des virgules(vide)
LOG_FILEChemin vers le fichier journal/var/log/qfeeds_blocklist.log
FULL_SYNC_MAX_AGEÂge maximal en secondes avant qu'une resynchronisation complète ne soit forcée (défense en profondeur)86400 (24h)
CheminObjectif
/etc/qfeeds/qfeeds_config.confFichier de configuration
/etc/qfeeds/.last_syncFichier d'état pour le suivi de la synchronisation complète/différentielle
/etc/qfeeds/.last_countDernier nombre d'éléments réussi, utilisé pour détecter une perte de base de référence
/usr/local/bin/update_qfeeds_blocklist.shScript de mise à jour (exécuté via cron)
/var/log/qfeeds_blocklist.logFichier journal