- Accueil
- Intégrations
- pfSense
Guide d’intégration
Blocklist d’IP malveillantes pour pfSense via pfBlockerNG ou un alias URL Table
Aucune carte bancaire requise · Clé API gratuite
Sur cette page
Sur cette page08
Ce que vous obtenez
pfSense garde les listes d’IP dans des tables pf. Firewall Maximum Table Entries vaut 400 000 par défaut, dont environ 160 000 déjà occupées par les tables bogons quand IPv6 est autorisé et Block bogon networks coché, deux réglages d’usine. Netgate demande de la place pour deux fois le total de toutes les tables : portez-le à 600 000 au moins avant de charger les IP de niveau critical. Les listes de domaines vont au DNSBL de pfBlockerNG.
| Liste | Entrées | Régénérée | Offres |
|---|---|---|---|
| blocklist-ips-critical.txtPar défaut. IP signalées par 6 sources de menaces ou plus, ou par 3 ou plus avec une catégorie critique : un alias URL Table, ou pfBlockerNG en IPv4 et IPv6. | environ 89 000 | toutes les 12 h | Basic, Pro et Enterprise |
| blocklist-ips-c2.txtIP de commande et contrôle (C2) signalées par des trackers de C2 : une liste d’IP plus petite. | environ 44 000 | toutes les 12 h | Basic, Pro et Enterprise |
| blocklist-domains-c2.txtDNSBL de pfBlockerNG : domaines de commande et contrôle (C2) signalés par des trackers de C2. | environ 22 000 | toutes les 12 h | Basic, Pro et Enterprise |
| blocklist-domains-ransomware.txtDNSBL de pfBlockerNG : domaines de la catégorie ransomware, quel que soit leur niveau. | environ 3 600 | toutes les 12 h | Basic, Pro et Enterprise |
| blocklist-domains-cryptomining.txtDNSBL de pfBlockerNG : domaines de la catégorie cryptomining, quel que soit leur niveau. | environ 6 100 | toutes les 12 h | Basic, Pro et Enterprise |
Nombres arrondis d’après la génération du ; chaque liste est régénérée toutes les 12 heures. Les chiffres du jour sont publics et ne demandent aucune clé.
Ce que reçoit chaque offre
- FreeCompte Free, ou aucune clé : les premiers 10 % de chaque liste, signalés par
X-Blocklist-Version: lite. - Basic, Pro et EnterpriseBasic, Pro et Enterprise : toutes les listes, complètes.
- Pro et EnterpriseCollections TAXII 2.1, pour les plateformes qui lisent les indicateurs STIX : Pro et Enterprise.
GET https:/
Liste complète ou échantillon de 10 %
| Champ | Basic, Pro et Enterprise | Free |
|---|---|---|
X-Blocklist-Version: | full | lite |
X-Blocklist-Percentage: | 100 | 10 |
Total entries: | <COUNT> | <COUNT> |
Premières lignes du fichier
# IsMalicious.com Blocklist - IPs (Critical)
# Format: Plain
# Generated: <BUILD_TIME>
# Total entries: <COUNT>
# Update frequency: every 12 hours
# Category: All
# Threat level: Critical
# Website: https://ismalicious.com
# © <YEAR> IsMalicious (compilation). Licensed to the downloading account under https://ismalicious.com/terms; redistribution of the compilation prohibited. Third-party entries remain under their providers' licences — see https://ismalicious.com/sources.
#Les valeurs entre chevrons sont fixées à chaque génération.
Prérequis
- Un hôte Linux avec systemd, curl et un serveur web HTTPS, que pfSense joint sur votre réseau.
- pfSense CE ou pfSense Plus. Pour un rafraîchissement horaire, les onglets IPv6 et le DNSBL, le paquet pfBlockerNG ou pfBlockerNG-devel (menus vérifiés sur 3.2.15_2 et 3.2.16).
- Pour le DNSBL : le DNS Resolver (Unbound) activé, et des clients qui utilisent pfSense comme serveur DNS.
- Une clé API et son secret isMalicious, dans Compte › Accès API.
- Un accès HTTPS sortant (TCP 443) en IPv4 depuis l’hôte relais vers
api.ismalicious.com, qui n’a pas d’adresse IPv6.
Mise en place
Copier la clé API et le secret
Ouvrez Compte › Accès API et copiez la Clé API et le Secret API. La liste complète demande une offre Basic, Pro ou Enterprise ; avec une clé Free, le relais reçoit l’échantillon de 10 %, et le refuse.Stocker les identifiants sur l’hôte relais
Créez/etc/ismalicious/netrc, réservé à root, avec les commandes ci-dessous, puis écrivez-y les trois lignes avec un éditeur : tapées dans un shell, elles finiraient dans son historique. curl y lit la clé et le secret : ils n’apparaissent jamais sur une ligne de commande, et pfSense ne les détient jamais.Créer le fichier, réservé à rootsh install -d -m 700 /etc/ismalicious [ -e /etc/ismalicious/netrc ] || install -m 600 /dev/null /etc/ismalicious/netrc chmod 600 /etc/ismalicious/netrc # Then write the three lines below into it with an editor, unless it holds them already./ etc/ ismalicious/ netrcnetrc machine api.ismalicious.com login <API_KEY> password <API_SECRET>Installer le script de récupération et son timer
- Enregistrez le script sous
/, en mode 755, avec les unités service et timer dansusr/ local/ sbin/ ismalicious-mirror /etc/systemd/system/, puis lancez le bloc d’activation : il crée/var/www/ismalicious, démarre le timer et lance aussitôt la première récupération, dont l’étape de l’alias a besoin. - Le service s’exécute en root pour lire le netrc et ne peut écrire que dans ce répertoire.
- Chaque heure, le script télécharge chaque liste de
LISTS, refuse un code d’erreur, un contenu qui n’est pas une liste, l’échantillon de 10 % et un fichier dont le nombre d’entrées diffère de son en-tête, et remplace chaque fichier d’un seul coup : le pare-feu ne lit jamais un fichier à moitié écrit. - Une liste refusée garde sa copie précédente, et l’exécution sort alors en erreur :
systemctl --failedla signale.
/ usr/ local/ sbin/ ismalicious-mirrorsh #!/bin/sh # Fetch the lists with your key and publish them for the firewall. # A list that fails a check keeps its previous copy, and the run exits 1. set -eu NETRC=/etc/ismalicious/netrc DEST=/var/www/ismalicious LISTS="blocklist-ips-critical.txt blocklist-domains-c2.txt" # fetch_list LIST OUT: download one list to OUT and check it. # On any failure OUT is removed and the function returns 1. fetch_list() { if ! code=$(curl --silent --show-error --fail --netrc-file "$NETRC" \ --proto '=https' --max-time 300 --retry 2 \ --output "$2" --write-out '%{http_code}' "https://api.ismalicious.com/blocklist/download/$1"); then rm -f "$2"; echo "$1: download failed" >&2; return 1 fi if [ "$code" != 200 ]; then rm -f "$2"; echo "$1: HTTP $code" >&2; return 1 fi if ! head -n 1 "$2" | grep -q '^[#!] IsMalicious.com Blocklist'; then rm -f "$2"; echo "$1: not an isMalicious list" >&2; return 1 fi if grep -q 'Lite Version' "$2"; then rm -f "$2"; echo "$1: lite list received, check the API key and the plan" >&2 return 1 fi # Every entry ends with a newline, and one header counts them: refuse a # cut, doubled or empty file. if [ -n "$(tail -c 1 "$2")" ]; then rm -f "$2"; echo "$1: cut short, no final newline" >&2; return 1 fi if [ "$(grep -c '^[#!] Total entries:' "$2")" != 1 ]; then rm -f "$2"; echo "$1: not one Total entries line" >&2; return 1 fi total=$(sed -n 's/^[#!] Total entries: \([0-9,]*\)$/\1/p' "$2" | tr -d ,) got=$(grep -c '^[^#!]' "$2" || true) if [ -z "$total" ] || [ "$total" = 0 ] || [ "$got" != "$total" ]; then rm -f "$2"; echo "$1: $got entries, the header says ${total:-none}" >&2 return 1 fi } mkdir -p "$DEST" failed=0 for f in $LISTS; do tmp=$(mktemp "$DEST/.$f.XXXXXX") if fetch_list "$f" "$tmp"; then chmod 644 "$tmp" mv -f "$tmp" "$DEST/$f" else failed=1 fi done exit "$failed"/ etc/ systemd/ system/ ismalicious-mirror. servicesystemd [Unit] Description=Fetch isMalicious blocklists Wants=network-online.target After=network-online.target [Service] Type=oneshot ExecStart=/usr/local/sbin/ismalicious-mirror # Root, to read the root-only netrc; it may write only the published directory. NoNewPrivileges=yes ProtectSystem=strict ProtectHome=yes PrivateTmp=yes ReadWritePaths=/var/www/ismalicious/ etc/ systemd/ system/ ismalicious-mirror. timersystemd [Unit] Description=Fetch isMalicious blocklists every hour [Timer] OnCalendar=hourly RandomizedDelaySec=15min Persistent=true [Install] WantedBy=timers.targetActiver le timer et lancer la première récupérationsh install -d -m 755 /var/www/ismalicious systemctl daemon-reload systemctl enable --now ismalicious-mirror.timer systemctl start ismalicious-mirror.service # the first fetch, now ls -l /var/www/ismalicious/- Enregistrez le script sous
Servir les listes en HTTPS sur votre réseau
- Publiez
/var/www/ismalicioussoushttps:/avec un certificat que pfSense reconnaît : un certificat public, ou une autorité privée ajoutée dans System › Certificates › Authorities avec Add this Certificate Authority to the Operating System Trust Store coché./ RELAY_HOST/ ismalicious/ - Refusez dans le serveur web les fichiers dont le nom commence par un point, car les téléchargements en cours s’y trouvent, et n’autorisez que l’adresse du pare-feu, comme dans l’exemple nginx ci-dessous.
- Gardez le relais interne : chaque fichier est licencié au compte qui le télécharge, et son en-tête interdit de redistribuer la compilation.
nginx, dans le bloc server du relaisnginx location /ismalicious/ { allow <FIREWALL_IP>; deny all; # Downloads in progress are dot files: never serve them. location ~ /\. { deny all; } }- Publiez
Charger les IP en alias URL Table
- Dans System › Advanced › Firewall & NAT, cochez Check certificate of aliases URLs, qui vaut pour tous les alias d’URL, et portez Firewall Maximum Table Entries à 600 000 ou plus : deux fois le total de toutes les tables, tables bogons comprises.
- Puis Firewall › Aliases › URLs › Add : nom
isMalicious_IPs, type URL Table (IPs), URLhttps:/, 1 jour dans la liste après la barre oblique ; Save puis Apply Changes./ RELAY_HOST/ ismalicious/ blocklist-ips-critical. txt - Dans Firewall › Rules › WAN, ajoutez une règle Action Block, Address Family IPv4+IPv6, Protocol Any, Source
isMalicious_IPs; dans LAN, la même avec l’alias en Destination, ajoutée avec Add rule to the top of the list pour passer au-dessus de la règle d’autorisation par défaut. - Cochez Log packets that are handled by this rule sur les deux, puis Apply Changes.
Ou charger les listes avec pfBlockerNG
- Activez pfBlockerNG dans Firewall › pfBlockerNG › General.
- Dans IP, sous IP Interface/Rules Configuration, sélectionnez WAN dans Inbound Firewall Rules et LAN dans Outbound Firewall Rules, puis Save : sans eux, Deny Both ne crée aucune règle.
- Dans IP › IPv4 › Add, ajoutez une source en Format Auto, State ON, avec l’URL relais de
blocklist-ips-critical.txtet le libelléisMalicious; réglez l’Action sur Deny Both et l’Update Frequency sur toutes les heures ou toutes les 12 heures, puis recommencez dans l’onglet IPv6 avec la même source. - Pour les domaines, cochez Enable DNSBL dans DNSBL, puis DNSBL › DNSBL Groups › Add : Name
isMalicious_C2, une source en Format Auto, State ON avec l’URL relais deblocklist-domains-c2.txt, Action Unbound (la valeur par défaut, Disabled, ne bloque rien), Update Frequency toutes les heures ; Save. - Lancez Update après chaque changement.
Vérifier le résultat
- Sur le relais, le nombre d’entrées de chaque fichier publié correspond au
countde la liste dans /blocklist/stats, à une régénération près. - Diagnostics › Tables, avec
isMalicious_IPssélectionné, affiche le nombre d’entrées et les adresses. - Status › System Logs › System › General affiche
Updatedaprès chaque rafraîchissement quotidien (12 h 30 par défaut) ; Update dans Diagnostics › Tables en force un tout de suite.isMalicious_IPs content from - Avec pfBlockerNG, la sortie d’Update et l’onglet Logs rendent compte de chaque téléchargement, les tables d’IP apparaissent dans Diagnostics › Tables, et les correspondances DNSBL dans Reports.
- Les journaux du pare-feu montrent les sessions que bloquent les règles Block.
# The relay: next run, last runs, and the entries it published.
systemctl list-timers ismalicious-mirror.timer
journalctl -u ismalicious-mirror.service
grep -c -v '^#' /var/www/ismalicious/blocklist-ips-critical.txtDépannage
Le relais affiche « download failed »
Un 401 signifie que la clé ou le secret du fichier netrc est faux ou incomplet : curl sort avec le code 22 et le relais garde le fichier précédent, que pfSense continue de servir. Recopiez les deux valeurs depuis Compte › Accès API : y régénérer la clé invalide l’ancienne paire.
Seules 10 % des entrées environ se chargent
pfSense ou pfBlockerNG pointe directement vers api.ismalicious.com : aucun des deux n’a d’option d’identifiants pour une liste (une clé placée dans l’URL est écrite dans le journal système). Ou l’offre est Free ou interrompue : un abonnement impayé, en retard de paiement, annulé, incomplet ou suspendu compte comme Free. Le relais refuse l’échantillon ; un flux direct montre Lite Version dans son en-tête.
Le relais affiche « entries, the header says », « cut short, no final newline » ou « not one Total entries line »
Le fichier était vide, tronqué ou n’était pas une des listes, comme quand un proxy ou un portail captif répond. Le relais garde la copie précédente et l’exécution suivante réessaie.
Le jeu de règles ne se charge pas
Les tables pf sont trop petites : Netgate avertit que le pare-feu peut alors échouer à charger les règles. Portez Firewall Maximum Table Entries au double du total de toutes les tables, tables bogons comprises (environ 160 000 entrées), ou chargez une liste plus petite.
Délais dépassés sur une grande liste
Un téléchargement qui prend plus de 30 secondes de notre côté finit en délai dépassé ou en 502 : prenez une liste par niveau ou par catégorie du tableau.
Le DNSBL marque toutes les entrées comme invalides
Les lignes d’en-tête # sont des commentaires pour les deux analyseurs : elles n’y sont pour rien, un fichier -adguard ou -dnsmasq si. Pointez le DNSBL vers le fichier de domaines simple.
« Unable to fetch usable data from URL » à l’enregistrement
pfSense télécharge l’URL quand vous enregistrez l’alias. Vérifiez l’URL du relais, son certificat, et que le fichier existe.
Erreurs de certificat
Avec Check certificate of aliases URLs coché, le certificat du relais doit remonter à une autorité du magasin de pfSense. Dans pfBlockerNG, corrigez le certificat plutôt que de passer la source en FLEX, qui cesse de le vérifier après une erreur.
403 depuis ismalicious.com
Le frontal d’ismalicious.com refuse certaines sources. Pointez le relais vers api.ismalicious.com.
Limites
- Ni pfSense ni pfBlockerNG n’ont d’option d’identifiants pour une liste (une clé placée dans l’URL est écrite dans le journal système) : la liste complète passe par l’hôte relais.
- Un alias URL Table se rafraîchit en jours, vérifiés une fois par jour. Pour un rafraîchissement toutes les heures, utilisez pfBlockerNG.
- Un alias d’IP résout par DNS chaque ligne qui ressemble à un nom d’hôte : ne le pointez jamais vers une liste de domaines.
- Aucun CIDR n’est servi : les alias URL Table prennent des adresses et des CIDR, pas des plages, et les listes d’IP contiennent des adresses seules.
- La mémoire du DNSBL grandit avec la liste, et pfBlockerNG ne documente aucune limite : commencez par les listes par catégorie plutôt que par les 2 millions de domaines de niveau critical.
- L’échantillon de 10 % est le premier dixième d’un fichier non trié, pas le dixième le plus risqué.
Questions fréquentes
pfSense ou pfBlockerNG peuvent-ils envoyer une clé API ?
Non. Aucun des deux ne propose de champ d’identifiants pour une liste : pointés directement vers api.ismalicious.com, ils reçoivent l’échantillon de 10 %. Un hôte que vous contrôlez récupère la liste complète avec votre clé et la sert au pare-feu en HTTPS.
Faut-il un alias URL Table ou pfBlockerNG ?
L’alias URL Table est intégré et se rafraîchit au plus une fois par jour. pfBlockerNG se rafraîchit jusqu’à toutes les heures, prend les listes IPv6 dans son propre onglet et bloque les domaines par le DNSBL.
À quelle fréquence pfBlockerNG doit-il mettre à jour les listes ?
Toutes les heures ou toutes les 12 heures. Les listes sont régénérées toutes les 12 heures, et le relais les récupère toutes les heures.
La liste d’IP de niveau critical tient-elle dans les tables de pfSense ?
Pas avec la valeur par défaut d’une installation standard. Les 400 000 entrées par défaut sont dimensionnées pour la table bogons IPv6 (environ 158 000 entrées), et Netgate demande de la place pour deux fois le total de toutes les tables : avec les IP de niveau critical, environ 500 000. Portez Firewall Maximum Table Entries à 600 000 ou plus ; Netgate compte environ 1 Ko de RAM par entrée.
pfSense peut-il bloquer les listes de domaines ?
Avec le DNSBL de pfBlockerNG, en utilisant les fichiers de domaines simples du relais. Ne chargez pas une liste de domaines dans un alias URL Table : pfSense résoudrait chaque nom par DNS.
À voir aussi
Flux d’IP et de domaines en authentification Basic
External Dynamic Lists adaptées aux limites de PAN-OS
Alias URL Table avec autorisation Basic
Domaines malveillants en adlist DNS RouterOS
IP malveillantes en sets nftables sur tout hôte Linux
Des blocklists de pare-feu à jour
Toutes les listes, niveaux et catégories
Collections TAXII 2.1 pour SIEM et TIP
Authentification, endpoints et limites
Vérifier une adresse avant de la bloquer
Commencer
Prêt à commencer ?
Aucune carte bancaire requise · Clé API gratuite