Aller au contenu principal

Guide d’intégration

Blocklist d’IP malveillantes pour pfSense via pfBlockerNG ou un alias URL Table

pfSense et pfBlockerNG n’envoient pas d’identifiants : un hôte que vous contrôlez récupère la liste isMalicious complète avec votre clé API et la sert au pare-feu en HTTPS. Chargez-la en alias URL Table, ou en flux pfBlockerNG, qui peut se rafraîchir toutes les heures et ajoute le DNSBL.

Aucune carte bancaire requise · Clé API gratuite

Chemin des données
  1. isMalicious

    api.ismalicious.com

    blocklist-ips-critical.txt

    Régénérée toutes les 12 h

  2. Relais

    Étape 3

    Installer le script de récupération et son timer

  3. pfSense

    Étape 5

    Charger les IP en alias URL Table

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.

ListeEntréesRégénéréeOffres
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 000toutes les 12 hBasic, 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 000toutes les 12 hBasic, 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 000toutes les 12 hBasic, Pro et Enterprise
blocklist-domains-ransomware.txtDNSBL de pfBlockerNG : domaines de la catégorie ransomware, quel que soit leur niveau.environ 3 600toutes les 12 hBasic, Pro et Enterprise
blocklist-domains-cryptomining.txtDNSBL de pfBlockerNG : domaines de la catégorie cryptomining, quel que soit leur niveau.environ 6 100toutes les 12 hBasic, 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.

Comparer les offres

Ce que renvoie un téléchargementHTTP

GET https://api.ismalicious.com/blocklist/download/blocklist-ips-critical.txt

Liste complète ou échantillon de 10 %

ChampBasic, Pro et EnterpriseFree
X-Blocklist-Version:fulllite
X-Blocklist-Percentage:10010
Total entries:<COUNT><COUNT> (Lite Version - 10% of <TOTAL>)

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

  1. 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.
  2. 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>
  3. Installer le script de récupération et son timer

    • Enregistrez le script sous /usr/local/sbin/ismalicious-mirror, en mode 755, avec les unités service et timer dans /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 --failed la 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.target
    Activer 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/
  4. Servir les listes en HTTPS sur votre réseau

    • Publiez /var/www/ismalicious sous https://RELAY_HOST/ismalicious/ 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é.
    • 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; }
    }
  5. 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), URL https://RELAY_HOST/ismalicious/blocklist-ips-critical.txt, 1 jour dans la liste après la barre oblique ; Save puis Apply Changes.
    • 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.
  6. 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.txt et 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 de blocklist-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 count de la liste dans /blocklist/stats, à une régénération près.
  • Diagnostics › Tables, avec isMalicious_IPs sélectionné, affiche le nombre d’entrées et les adresses.
  • Status › System Logs › System › General affiche Updated isMalicious_IPs content from après chaque rafraîchissement quotidien (12 h 30 par défaut) ; Update dans Diagnostics › Tables en force un tout de suite.
  • 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.
Vérifications sur le relaissh
# 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.txt

Dé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.

Commencer

Prêt à commencer ?

Aucune carte bancaire requise · Clé API gratuite