Aller au contenu principal

Guide d’intégration

Blocklist OPNsense d’IP malveillantes, en alias URL Table authentifié

OPNsense 25.1 et ultérieur envoie l’autorisation Basic d’un alias URL Table : le pare-feu récupère lui-même la liste d’IP isMalicious complète. Ses blocklists DNS Unbound ne savent pas s’authentifier : les listes de domaines passent par un relais que vous contrôlez.

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

    1. Relais

      Étape 5

      Mettre en place un relais pour les listes de domaines (facultatif)

  2. OPNsense

    Étape 3

    Ajouter l’alias URL Table

  3. Bloquer l’alias dans les règles de pare-feu

    Étape 4
Sur cette page08

Ce que vous obtenez

Les listes d’IP vont dans un alias URL Table (IPs), qu’OPNsense récupère avec votre clé. Les listes de domaines vont dans les blocklists DNS d’Unbound, qui ne prennent pas d’identifiants : elles viennent d’un relais.

ListeEntréesRégénéréeOffres
blocklist-ips-critical.txtAlias par défaut. IP signalées par 6 sources de menaces ou plus, ou par 3 ou plus avec une catégorie critique.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 : un alias plus petit.environ 44 000toutes les 12 hBasic, Pro et Enterprise
blocklist-domains-c2.txtBlocklist Unbound, via le relais : 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.txtBlocklist Unbound, via le relais : domaines de la catégorie ransomware, quel que soit leur niveau.environ 3 600toutes les 12 hBasic, Pro et Enterprise
blocklist-domains-cryptomining.txtBlocklist Unbound, via le relais : 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

  • OPNsense 25.1 ou ultérieur, la première version à autoriser l’authentification des alias URL ; menus vérifiés de 25.1 à 26.7.
  • Pour les listes de domaines seulement : un hôte Linux avec systemd, curl et un serveur web HTTPS, qu’OPNsense joint sur votre réseau.
  • Une clé API et son secret isMalicious, dans Compte › Accès API.
  • Un accès HTTPS sortant (TCP 443) en IPv4 depuis OPNsense, et depuis l’hôte relais pour la blocklist DNS, 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 ; une clé Free, ou une offre interrompue, charge l’échantillon de 10 %.
  2. Activer la vérification des certificats des alias

    Dans Firewall › Settings › Advanced (sur la branche de développement, Firewall › Advanced), cochez Check certificate of aliases URLs avant d’enregistrer l’alias. Le réglage est global, désactivé dans la configuration d’usine, et sans lui OPNsense envoie le secret API à n’importe quel serveur qui répond. Save.
  3. Ajouter l’alias URL Table

    Firewall › Aliases, puis + : activez-le, nommez-le isMalicious_IPs, choisissez le type URL Table (IPs), réglez Refresh Frequency sur 0 jour et 1 heure (12 heures suffisent : les listes sont régénérées toutes les 12 heures), collez l’URL de la liste dans Content, et réglez Authorization sur Basic avec la clé API en Username et le secret API en Password. Save, puis Apply.
    Champs de l’aliasGUI
    Type
    URL Table (IPs)
    Refresh Frequency
    0 days, 1 hour
    Content
    https://api.ismalicious.com/blocklist/download/blocklist-ips-critical.txt
    Authorization
    Basic
    Username
    <API_KEY>
    Password
    <API_SECRET>
    Type:               URL Table (IPs)
    Refresh Frequency:  0 days, 1 hour
    Content:            https://api.ismalicious.com/blocklist/download/blocklist-ips-critical.txt
    Authorization:      Basic
    Username:           <API_KEY>
    Password:           <API_SECRET>
  4. Bloquer l’alias dans les règles de pare-feu

    • 25.1 à 26.1 : dans Firewall › Rules › WAN, ajoutez une règle Block avec isMalicious_IPs en source ; dans Firewall › Rules › LAN, une règle Block avec l’alias en destination, au-dessus de la règle d’autorisation ; Apply.
    • 26.7 : Firewall › Rules, sélectionnez WAN, +, Action Block, Version any, Source isMalicious_IPs, Save ; sélectionnez LAN, +, Action Block, Version any, Destination isMalicious_IPs, Save, puis Move selected rule before this rule sur la règle d’autorisation par défaut ; Apply.
    • La version TCP/IP vaut IPv4 par défaut sur toutes les versions : réglez-la sur IPv4+IPv6, ou any.
  5. Mettre en place un relais pour les listes de domaines (facultatif)

    • Les blocklists d’Unbound se téléchargent sans identifiants : un hôte que vous contrôlez récupère donc les listes de domaines avec votre clé et les sert en HTTPS.
    • Créez /etc/ismalicious/netrc, réservé à root, avec les commandes ci-dessous et écrivez-y les trois lignes avec un éditeur ; installez le script sous /usr/local/sbin/ismalicious-mirror, en mode 755, avec ses unités service et timer, et lancez le bloc d’activation, qui crée /var/www/ismalicious et lance aussitôt la première récupération.
    • Le service s’exécute en root pour lire le netrc et ne peut écrire que dans ce répertoire.
    • Le script refuse une 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.
    • Publiez /var/www/ismalicious sous https://RELAY_HOST/ismalicious/ avec un certificat qu’OPNsense reconnaît (une autorité privée va dans System › Trust › Authorities), refusez dans le serveur web les fichiers dont le nom commence par un point, comme dans l’exemple nginx, et 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.
    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>
    /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-domains-c2.txt blocklist-domains-ransomware.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/
    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; }
    }
  6. Ajouter l’URL du relais aux blocklists d’Unbound

    • 25.7.8 et ultérieur : Services › Unbound DNS › Blocklists, onglet Blocklists, +.
    • Activez le mode avancé, cochez Enable, ajoutez https://RELAY_HOST/ismalicious/blocklist-domains-c2.txt et https://RELAY_HOST/ismalicious/blocklist-domains-ransomware.txt à URLs of Blocklists, réglez Cache TTL sur 43200 (12 heures), cochez Return NXDOMAIN ou saisissez une Destination Address, tapez une Description, Save, puis Apply.
    • 25.1 à 25.7.7 : Services › Unbound DNS › Blocklist, mode avancé, Enable, les mêmes URL, Return NXDOMAIN ou une Destination Address, Apply ; ces versions n’ont pas de champ Cache TTL et retéléchargent une liste après 20 heures.
  7. Planifier la mise à jour des blocklists

    Les blocklists d’Unbound ne se rafraîchissent que par une tâche cron : System › Settings › Cron, puis +, avec la commande Update Unbound DNSBLs toutes les heures (minute 15, heure *) et une Description, obligatoire. Save, puis Apply. Une liste est retéléchargée dès que sa copie en cache dépasse le Cache TTL.

Vérifier le résultat

  • Firewall › Diagnostics › Aliases, avec isMalicious_IPs sélectionné, liste les entrées actuelles : environ le count de la liste dans /blocklist/stats.
  • L’API d’OPNsense renvoie les mêmes entrées, avec une clé API OPNsense : à partir de 25.7, une requête renvoie au plus 9 999 lignes, lisez donc total.
  • Firewall › Log Files › General affiche fetch alias url avec le nombre de lignes après chaque téléchargement, ou error fetching alias url avec le code HTTP.
  • Services › Unbound DNS › Log File affiche blocklist download avec les lignes téléchargées pour chaque URL ; à partir de 25.7.8, le Blocklist Tester vérifie un domaine selon vos réglages.
API d’OPNsensesh
# The alias entries, through the OPNsense API: an OPNsense API key with the
# "Diagnostics: PF Table IP addresses" privilege. curl asks for its secret;
# the GUI CA (System › Trust › Authorities) verifies the firewall.
curl -s --cacert opnsense-gui-ca.pem -u '<OPN_KEY>' \
  "https://<FIREWALL>/api/firewall/alias_util/list/isMalicious_IPs" | grep -o '"total":[0-9]*'

Dépannage

error fetching alias url … [http_code:401]

La clé ou le secret est faux ou incomplet, et l’alias garde son contenu précédent. Le corps de la réponse indique « Blocklist not found or empty » ; fiez-vous au code HTTP. Saisissez à nouveau 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

Authorization n’est pas réglé, OPNsense est antérieur à 25.1, ou l’offre est Free ou interrompue (un abonnement impayé, en retard de paiement, annulé, incomplet ou suspendu compte comme Free). La ligne Total entries du fichier indique alors Lite Version. Pour une blocklist Unbound pointée directement vers api.ismalicious.com, c’est attendu : passez par le relais.

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.

« Error loading alias [isMalicious_IPs] »

Firewall › Log Files › General signale que la table n’a pas pu prendre les entrées. Relevez Firewall Maximum Table Entries au-dessus du total de vos alias, ou prenez 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.

La blocklist Unbound ne charge rien

Les deux analyseurs ignorent les lignes d’en-tête # : elles n’y sont pour rien, un fichier -adguard ou -dnsmasq si. Pointez Unbound vers le fichier de domaines simple.

Erreurs de certificat après avoir coché la vérification

api.ismalicious.com utilise un certificat Let’s Encrypt : le magasin de certificats du pare-feu doit faire confiance à ISRG Root X1 ou X2. Pour le relais, son certificat doit remonter à une autorité qu’OPNsense reconnaît.

403 depuis ismalicious.com

Le frontal d’ismalicious.com refuse certaines sources. Utilisez api.ismalicious.com.

Limites

  • La vérification des certificats des alias est désactivée par défaut : sans elle, les identifiants Basic partent vers qui répond. Cochez-la avant d’enregistrer l’alias.
  • OPNsense stocke la clé et le secret en clair dans config.xml, ses sauvegardes, /usr/local/etc/filter_tables.conf et les exports d’alias : utilisez une clé dédiée à ce pare-feu, et chiffrez les sauvegardes.
  • Les blocklists DNS d’Unbound n’ont pas de champ d’identifiants : les listes de domaines complètes passent par le relais.
  • Un alias d’IP résout par DNS chaque ligne qui n’est pas une adresse : ne le pointez jamais vers une liste de domaines.
  • Ni CIDR ni plages ne sont servis : l’alias les accepterait, mais les listes d’IP contiennent des adresses seules.
  • L’échantillon de 10 % est le premier dixième d’un fichier non trié, pas le dixième le plus risqué.

Questions fréquentes

OPNsense peut-il envoyer une clé API pour un alias URL Table ?

Oui, depuis OPNsense 25.1. Réglez l’Authorization de l’alias sur Basic, avec la clé API en nom d’utilisateur et le secret API en mot de passe : OPNsense les envoie dès la première requête, et l’alias charge la liste complète.

Pourquoi cocher Check certificate of aliases URLs ?

L’option est désactivée dans la configuration d’usine, et sans elle OPNsense ne vérifie pas le serveur auquel il envoie les identifiants. Cochez-la avant d’enregistrer un alias qui porte le secret API.

La blocklist DNS Unbound peut-elle utiliser la clé API ?

Non. Les blocklists d’Unbound se téléchargent sans identifiants et reçoivent l’échantillon de 10 %. Servez-leur les listes de domaines complètes depuis un relais qui les récupère avec votre clé.

Quelle fréquence de rafraîchissement donner à l’alias ?

1 heure, ou 12 heures. Les listes sont régénérées toutes les 12 heures ; OPNsense vérifie chaque minute et récupère à nouveau un alias dès que sa fréquence est écoulée.

La liste tiendra-t-elle dans les tables d’OPNsense ?

La taille de table par défaut est d’au moins 1 million d’entrées en 25.1, et grandit avec la mémoire à partir de 25.7. OPNsense remplace la table d’un alias sur place : le total de vos alias doit rester sous Firewall Maximum Table Entries.

Commencer

Prêt à commencer ?

Aucune carte bancaire requise · Clé API gratuite