Aller au contenu principal

Guide d’intégration

Blocklist Pi-hole de domaines malveillants, en adlist authentifiée

Pi-hole transmet à curl les identifiants placés dans l’adresse d’une adlist, en HTTP Basic : gravity charge donc la liste isMalicious complète. Lancez gravity toutes les 12 heures pour suivre les régénérations.

Aucune carte bancaire requise · Clé API gratuite

Chemin des données
  1. isMalicious

    api.ismalicious.com

    blocklist-domains-critical.txt

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

    1. Relais

      Étape 6

      Garder la clé hors de Pi-hole (facultatif)

  2. Pi-hole

    Étape 3

    Ajouter la liste à Pi-hole

  3. Lancer gravity

    Étape 4
Sur cette page08

Ce que vous obtenez

Pi-hole bloque des noms, pas des adresses : seules les listes de domaines s’appliquent. Chargez une liste de niveau critical, en syntaxe simple ou adblock, puis ajoutez les listes par catégorie si vous le souhaitez.

ListeEntréesRégénéréeOffres
blocklist-domains-critical.txtPar défaut. Domaines signalés par 6 sources de menaces ou plus, ou par 3 ou plus avec une catégorie critique. Blocage du nom exact.environ 2 millionstoutes les 12 hBasic, Pro et Enterprise
blocklist-domains-critical-adguard.txtLes mêmes domaines en règles ||domaine^, qui bloquent aussi les sous-domaines. Core v5.16.1 et FTL v5.22 ou ultérieurs. Chargez celle-ci ou la liste simple, pas les deux.environ 2 millionstoutes les 12 hBasic, Pro et Enterprise
blocklist-domains-c2.txtDomaines de commande et contrôle (C2) signalés par des trackers de C2, quel que soit leur niveau.environ 22 000toutes les 12 hBasic, Pro et Enterprise
blocklist-domains-ransomware.txtDomaines de la catégorie ransomware, quel que soit leur niveau.environ 3 600toutes 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-domains-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 - Domains (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

  • Pi-hole Core v5.2.3 ou ultérieur : les versions antérieures refusent un @ dans l’adresse d’une liste. Pi-hole v6 est la branche actuelle.
  • Un shell sur l’hôte Pi-hole, ou sur l’hôte Docker, pour planifier gravity.
  • Une clé API et son secret isMalicious, dans Compte › Accès API.
  • Un accès HTTPS sortant (TCP 443) en IPv4 depuis Pi-hole 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 charge l’échantillon de 10 %.
  2. Construire l’adresse de la liste

    Placez la clé, deux-points et le secret devant l’hôte, suivis de @. Clés et secrets sont des UUID : aucun encodage n’est nécessaire. Utilisez api.ismalicious.com : le frontal d’ismalicious.com refuse certaines sources avec une erreur 403.
    Adresse de la listeURL
    https://<API_KEY>:<API_SECRET>@api.ismalicious.com/blocklist/download/blocklist-domains-critical.txt
    Adresse de la liste, sous-domaines comprisURL
    https://<API_KEY>:<API_SECRET>@api.ismalicious.com/blocklist/download/blocklist-domains-critical-adguard.txt
  3. Ajouter la liste à Pi-hole

    Pi-hole v6 : Group Management › Lists, collez l’adresse dans Address, saisissez un Comment comme isMalicious critical, gardez le groupe Default et cliquez sur Add blocklist. Pi-hole v5 : Group Management › Adlists, puis Address, Comment et Add. En v6, l’API fait la même chose : le bloc ci-dessous vérifie le certificat propre de FTL, lit le mot de passe au terminal et l’adresse dans un fichier, pour que ni l’un ni l’autre n’apparaisse dans la liste des processus ou l’historique du shell, et ferme la session à la fin.
    API de Pi-hole v6sh
    # FTL's own CA, copied from /etc/pihole/tls_ca.crt on the Pi-hole host. Add
    # --resolve pi.hole:443:<PIHOLE_IP> when pi.hole does not resolve.
    CA=./pihole-tls_ca.crt
    API=https://pi.hole/api
    
    # The password is read from the terminal: it stays out of ps and history.
    # jq escapes the quotes and backslashes it may hold.
    printf 'Pi-hole password: ' >&2; stty -echo; IFS= read -r PW; stty echo; echo >&2
    SID=$(printf '%s' "$PW" | jq -Rs '{password: .}' |
      curl -sS --cacert "$CA" -X POST "$API/auth" --data @- | jq -r .session.sid)
    
    # list.json (mode 600), written with an editor, holds the address with the key:
    # {"address":"https://<API_KEY>:<API_SECRET>@api.ismalicious.com/blocklist/download/blocklist-domains-critical.txt","comment":"isMalicious critical","groups":[0]}
    curl -sS --cacert "$CA" -X POST "$API/lists?type=block" -H "X-FTL-SID: $SID" \
      -H "Content-Type: application/json" --data @list.json
    
    curl -sS --cacert "$CA" -X POST "$API/action/gravity" -H "X-FTL-SID: $SID"
    curl -sS --cacert "$CA" -X DELETE "$API/auth" -H "X-FTL-SID: $SID"
  4. Lancer gravity

    Tools › Update Gravity › Update, ou sudo pihole -g sur l’hôte. Gravity télécharge la liste et l’écrit dans gravity.db.
  5. Lancer gravity toutes les 12 heures

    Pi-hole met ses listes à jour une fois par semaine, à une minute tirée au hasard dans la nuit. Créez votre propre fichier cron avec la ligne updateGravity de /etc/cron.d/pihole et une planification de 12 heures hors des heures 3 et 4, où tombe l’exécution hebdomadaire : gravity n’a pas de verrou. Ne modifiez pas /etc/cron.d/pihole : les mises à jour l’écrasent. La ligne s’exécute en pihole en v6 et en root en v5. Sous Docker, planifiez pihole -g via docker exec sur l’hôte.
    /etc/cron.d/ismalicious-gravitycron
    # Pi-hole v6 (user pihole; on v5, write root). The lists are rebuilt every 12 hours.
    17 5,17 * * *   pihole    PATH="$PATH:/usr/sbin:/usr/local/bin/" pihole updateGravity >/var/log/pihole/pihole_updateGravity.log || cat /var/log/pihole/pihole_updateGravity.log
  6. Garder la clé hors de Pi-hole (facultatif)

    • Pi-hole stocke l’adresse en clair dans gravity.db, l’affiche sur la page Lists et l’écrit dans chaque journal de gravity.
    • Pour l’éviter, créez le fichier netrc ci-dessous, réservé à root, récupérez la liste avec le script, qui 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, et ajoutez file:///var/lib/ismalicious/blocklist-domains-critical.txt comme adresse.
    • Le script rend la copie lisible par gravity.
    • Sous Docker, montez /var/lib/ismalicious dans le conteneur en lecture seule et gardez la même adresse file://.
    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-fetch.shsh
    #!/bin/sh
    # Runs as root, before gravity. /etc/ismalicious/netrc (mode 600) holds the key.
    # The copy is made readable for gravity, which reads it as pihole (Core
    # v6.4.2+) or as root; on Docker there is no pihole user on the host.
    set -eu
    NETRC=/etc/ismalicious/netrc
    DIR=/var/lib/ismalicious
    FILE=blocklist-domains-critical.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 "$DIR"
    tmp=$(mktemp "$DIR/.$FILE.XXXXXX")
    trap 'rm -f "$tmp"' EXIT
    fetch_list "$FILE" "$tmp"
    chmod 644 "$tmp"
    mv -f "$tmp" "$DIR/$FILE"
    
    # Schedule it before gravity, in /etc/cron.d/ismalicious-gravity:
    # 7 5,17 * * *   root   /usr/local/sbin/ismalicious-fetch.sh
    # List address in Pi-hole: file:///var/lib/ismalicious/blocklist-domains-critical.txt

Vérifier le résultat

  • Gravity affiche Status: Retrieval successful pour la liste, puis Parsed N exact domains and M ABP-style domains (à partir de Core v5.17 ; les versions antérieures affichent Imported N domains).
  • N pour une liste simple, ou M pour la liste adblock, correspond au count de la liste dans /blocklist/stats, à une régénération près. Environ un dixième, c’est l’échantillon de 10 %.
  • Group Management › Lists indique la liste comme téléchargée ou inchangée, pas en échec.
  • À partir de Core v6.1, les premières lignes de la copie en cache, dans /etc/pihole/listsCache/ (mode 0640 : lisez-la avec sudo), affichent # Total entries: sans mention Lite Version. Une liste file:// est mise en cache sous list.N.local.domains.
  • pihole -q sur un domaine de la liste nomme les listes qui le contiennent.
Vérificationssh
# Gravity's summary for the list (Core v5.17+ prints Parsed, older Imported):
sudo pihole -g | grep -E 'Retrieval|Parsed|Imported'

# Core v6.1+ keeps the raw file (mode 0640): a full list has no "Lite Version".
sudo head -12 /etc/pihole/listsCache/list.*.api.ismalicious.com.domains

# The same check without Pi-hole, with the netrc file of the local copy:
sudo curl -sS --netrc-file /etc/ismalicious/netrc -D - -o /dev/null \
  "https://api.ismalicious.com/blocklist/download/blocklist-domains-critical.txt" | grep -i '^x-blocklist-version'

Dépannage

Gravity signale une erreur 401

La clé ou le secret est faux ou incomplet. Core v6.4.2 et ultérieurs affichent The requested URL returned error: 401 ; les versions antérieures affichent l’URL, identifiants compris. Gravity garde alors sa copie précédente, et l’ancienne liste reste active : vérifiez l’état de la liste après chaque renouvellement de clé. Le corps de la réponse indique « Blocklist not found or empty » ; fiez-vous au code HTTP. Recopiez les deux valeurs depuis Compte › Accès API.

Seuls 10 % environ des domaines se chargent

L’adresse ne contient pas d’identifiants, ou l’offre est Free ou interrompue : un abonnement impayé, en retard de paiement, annulé, incomplet ou suspendu compte comme Free. Vérifiez l’en-tête de la copie en cache et votre offre.

Le script de copie locale 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 script garde la copie précédente et sort en erreur, et gravity continue de la lire.

Gravity indique « Invalid Target »

L’adresse contient un caractère que Pi-hole refuse en plus du @, souvent un chevron du modèle laissé en place ou une espace. Avant Core v5.2.3, tout @ est refusé : mettez à jour.

Erreur 502, 504 ou délai dépassé

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.

503 Service Unavailable

La liste est en cours de première génération, et la réponse porte Retry-After: 600. Gravity ne réessaie pas : il garde sa copie en cache jusqu’à l’exécution suivante.

404 Not Found

Le nom de fichier est faux. Recopiez-le depuis le tableau ci-dessus.

Gravity ignore la plupart des entrées

Les lignes d’en-tête n’y sont pour rien : Pi-hole saute les lignes # et !. Quand le nombre d’entrées ignorées approche le nombre d’entrées, le mauvais fichier est chargé : une liste -dnsmasq.txt, une liste d’URL, ou une liste -adguard.txt sur un Pi-hole antérieur à Core v5.16.1 et FTL v5.22. Une liste d’IP est sautée sans bruit à partir de Core v6.1 (0 analysée, 0 ignorée), et importée avant comme des noms que rien ne demande.

Erreurs de certificat

Le curl de gravity vérifie le magasin de certificats du système. Core v6.4.2 et ultérieurs affichent le message de curl ; les versions antérieures indiquent « Connection Refused ». Mettez à jour ca-certificates, vérifiez l’horloge du système et exemptez api.ismalicious.com de l’inspection TLS.

Limites

  • Pi-hole conserve l’adresse, identifiants compris, dans gravity.db (laissé en mode 664) et jusqu’à 10 sauvegardes sous /etc/pihole/gravity_backups/, sur la page Lists, dans la sortie de pihole -q et dans chaque journal de gravity. Le relais file:// de la dernière étape l’évite : changez la clé après être passé par lui.
  • Une liste simple ne bloque que les noms listés. La variante adblock bloque aussi chaque sous-domaine, ce qui atteint plus de noms que la liste n’en contient.
  • Pi-hole ne bloque pas d’adresses IP : à partir de Core v6.1, il saute les lignes d’IP sans bruit, et avant il les importait comme des noms que rien ne demande ; une liste d’IP ne bloque donc rien. Chargez les listes blocklist-ips-* sur un pare-feu.
  • Ni RPZ, ni CIDR, ni entrées génériques comme *.example ne sont servis ; Pi-hole n’en a pas besoin.
  • L’échantillon de 10 % est le premier dixième d’un fichier non trié, pas le dixième le plus risqué.
  • Sans votre propre fichier cron, Pi-hole lance gravity une fois par semaine et peut avoir jusqu’à 7 jours de retard sur les listes.

Questions fréquentes

Pi-hole peut-il envoyer une clé API pour une blocklist ?

Oui. Placez la clé et le secret devant l’hôte dans l’adresse de la liste, séparés par deux-points et suivis de @. Pi-hole transmet l’adresse à curl, qui les envoie en HTTP Basic. Il faut Core v5.2.3 ou ultérieur. Pi-hole stocke et affiche cette adresse en clair ; récupérer la liste avec un script et la charger en adresse file:// garde la clé sur l’hôte.

La liste bloque-t-elle les sous-domaines ?

La liste simple ne bloque que les noms exacts. Chargez plutôt blocklist-domains-critical-adguard.txt : Pi-hole lit ses règles ||domaine^ comme le domaine et tous ses sous-domaines, à partir de Core v5.16.1 et FTL v5.22.

Pi-hole peut-il bloquer des adresses IP malveillantes ?

Non. Pi-hole répond aux requêtes DNS : il ne bloque que des noms, et à partir de Core v6.1 il saute sans bruit les lignes d’IP. Chargez les listes d’IP sur un pare-feu.

À quelle fréquence lancer gravity ?

Toutes les 12 heures. Les listes sont régénérées toutes les 12 heures, et la planification propre à Pi-hole est hebdomadaire. Lancer gravity plus souvent retélécharge le même fichier.

Que charge un compte gratuit dans Pi-hole ?

Les premiers 10 % de chaque liste. Gravity les charge sans erreur : comparez donc le nombre d’entrées au nombre publié. La liste complète demande une offre Basic, Pro ou Enterprise.

Commencer

Prêt à commencer ?

Aucune carte bancaire requise · Clé API gratuite