
I. Présentation
Blocky se présente comme un ad-blocker et un proxy DNS pour le réseau local, qui va vous permettre de bloquer les publicités, les malwares et les sites web appartenant à certaines catégories (pornographie, réseaux sociaux, etc.). Léger, open source et écrit en Go, Blocky nécessite peu de ressources et sa configuration est flexible grâce à un fichier de configuration au format YAML. Vous souhaitez en savoir plus et apprendre à le configurer ? Alors, lisez la suite de cet article.
De nombreux internautes ont la volonté de bloquer les publicités sur Internet, notamment à cause de leur caractère intrusif. Pourtant, elles sont vitales pour certains sites web, comme IT-Connect où elles représentent l’une des principales sources de revenus. Pour atteindre cet objectif, il est possible d’utiliser ce que l’on appelle un ad-blocker, ou en français, un bloqueur de publicités. Il peut prendre différentes formes, notamment :
Une extension pour navigateur web comme AdBlock ou uBlock Origin.
Une application disponible sur le réseau que les clients vont utiliser comme DNS afin de filtrer certaines requêtes, et ainsi bloquer les publicités, mais aussi les sites malveillants ou ceux appartenant à certaines catégories.
Vous l’aurez compris, Blocky appartient à la seconde catégorie d’ad-blocker. Nous commencerons par une présentation globale de la solution avant d’évoquer son installation et sa configuration sur Linux.
Note : Blocky peut être installé sur Linux, FreeBSD, et même sur Windows. Il peut aussi être lancé au sein d’un conteneur Docker.
A. Blocky, un DNS sinkhole
Nous pouvons considérer Blocky comme un serveur DNS capable de contrôler et de filtrer les requêtes effectuées par les appareils connectés à un réseau. Il se comporte comme un DNS sinkhole, c’est-à-dire un DNS menteur, une technique bien connue. Elle consiste à rediriger certaines requêtes DNS vers une adresse contrôlée par l’administrateur réseau, au lieu de leur destination légitime, dans le but de bloquer certains domaines.
Par exemple, si une machine tente de se connecter à un site associé à une mauvaise réputation (malwares), le DNS sinkhole peut répondre avec une adresse IP comme 0.0.0.0 (ou l’adresse d’un serveur interne) pour que la connexion ne puisse pas aboutir. C’est une méthode efficace et reconnue pour protéger un réseau en bloquant certaines communications.
Voici quelques fonctionnalités clés de Blocky :
Écrit en Go, Blocky est une application plus légère que d’autres alternatives (le binaire fait moins de 10 Mo)
Bloquer (ou autoriser) les requêtes DNS à partir de listes externes ou directives statiques
Gérer des règles par groupe de périphériques
Blocage du domaine de la demande, du CNAME de la réponse (inspection approfondie du CNAME) et des adresses IP de la réponse
Préchargement et mise en cache des requêtes souvent sollicitées par les clients
Résolution DNS personnalisée pour certains noms de domaine
Fonction de redirecteur conditionnel (utile pour votre nom de domaine local)
Utilisation simultanée de plusieurs résolveurs externes
Prise en charge de différents protocoles : DNS (non chiffré), DNS-over-HTTPS (DoH) et DNS-over-TLS (DoT)
B. Blocky, une alternative à Pi-Hole et AdGuard
Si vous effectuez une recherche sur le web du style « network ad-blocker », vous allez forcément tomber sur deux solutions : Pi-Hole et AdGuard. Il existe de nombreux tutoriels pour installer ces solutions, qui sont à mon sens plus lourdes que Blocky.
En comparaison de ces deux solutions, Blocky a un principal inconvénient, mais qui n’est pas si gênant, c’est l’absence d’une interface web. Avec Blocky, la configuration s’effectue exclusivement à partir de la ligne de commande et d’un fichier de configuration global. Vous n’aurez pas de rapports en ligne comme avec d’autres solutions comme Pi-Hole ou AdGuard, mais il y a une solution proposée : l’intégration avec Prometheus et Grafana (avec des tableaux de bord prêts à l’emploi).
Blocky me semble parfaitement adapté pour le monde de l’entreprise grâce à son système de groupes, sa configuration YAML qui ne devrait pas effrayer les administrateurs systèmes et son intégration avec des solutions comme Prometheus et Grafana.
II. Installation et configuration de Blocky sur Linux
A. Prérequis
Pour installer Blocky, il est nécessaire de disposer d’un serveur Linux (ou d’un Raspberry Pi) fonctionnel.
Vous devez également disposer d’un accès à Internet et des droits administrateurs sur la machine (ou l’accès via sudo).
B. Installation de Blocky (sans Docker)
Dans le cadre de ce tutoriel, nous allons réaliser une installation native. Nous allons télécharger l’exécutable de Blocky sur le dépôt GitHub officiel et le déployer en tant que service système.
Commencez par créer un répertoire au sein duquel nous allons héberger Blocky, puis accédez à ce répertoire :
sudo mkdir -p /opt/blocky
cd /opt/blocky
Dans le cadre de ce tutoriel, nous allons télécharger la dernière version, à savoir Blocky v0.25 à l’heure où ces lignes sont écrites. Puis, l’archive tar.gz obtenue sera décompressée.
sudo wget https://github.com/0xERR0R/blocky/releases/download/v0.25/blocky_v0.25_Linux_arm64.tar.gz
sudo tar -xvf blocky_v0.25_Linux_arm64.tar.gz
Vous devez ensuite exécuter cette ligne pour autoriser Blocky à écouter sur le port 53 (DNS). Sinon, ce ne sera pas possible à cause des restrictions présentes par défaut sous Linux.
sudo setcap CAP_NET_BIND_SERVICE=+eip /opt/blocky/blocky
Puis, nous allons créer le compte utilisateur blocky associé au répertoire /opt/blocky pour l’associer à un service système. Créez le compte :
sudo useradd -d /opt/blocky blocky
Puis, créez ce fichier pour déclarer le service :
sudo nano /etc/systemd/system/blocky.service
Dans le fichier que vous venez de créer, copiez-collez ce code :
[Unit]
Description=Blocky
After=syslog.target
After=network.target
[Service]
RestartSec=2s
Type=simple
User=blocky
Group=blocky
WorkingDirectory=/opt/blocky/
ExecStart=/opt/blocky/blocky -c config.yml
Restart=always
[Install]
WantedBy=multi-user.target
La commande de démarrage du service est /opt/blocky/blocky -c config.yml, ce qui signifie que Blocky charge le fichier de configuration config.yml lors de son démarrage. Avant de lancer Blocky, nous devons donc le configurer…
C. Configuration de Blocky
Blocky utilise des listes de blocage pour empêcher l’accès aux domaines malveillants et aux publicités. Il est possible d’ajouter plusieurs listes reconnues, comme celles de Steven Black, en modifiant le fichier de configuration config.yml. D’une façon générale, ce fichier sert à effectuer toute la configuration de la solution. En complément de ce tutoriel, vous pouvez consulter la documentation Blocky, elle est bien détaillée.
Remarque : Blocky peut gérer des listes de blocage et/ou des listes d’autorisation, selon vos besoins.
Ci-dessous, la configuration proposée dans le cadre de ce tutoriel :
# Serveurs DNS en amont pour la résolution de noms
upstreams:
groups:
default:
# DNS over HTTPS upstreams
– https://cloudflare-dns.com/dns-query
– https://dns.google/dns-query
– https://dns.quad9.net/dns-query
# Selectionner les deux serveurs upstreams les plus rapides
strategy: parallel_best
timeout: 2s
# Connectivité IPv4 uniquement, sinon : v6, dual
connectIPVersion: v4
# Redirecteur conditionnel pour le domaine local
# Résoudre it-connect.local via le serveur 192.168.14.201
conditional:
mapping:
it-connect.local: 192.168.14.201
# Déclarer les listes, ici des « denylists » = liste de blocage
# ads : liste de Steven Black pour les publicités
# porn : liste de Steven Black pour la pornographie
blocking:
denylists:
ads:
– https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
porn:
– https://raw.githubusercontent.com/StevenBlack/hosts/master/alternates/porn-only/hosts
# Groupes de clients
# Groupe par défaut, appliquer la liste « ads »
# Groupe avec l’adresse IP 192.168.14.100, appliquer les listes « ads » et « porn »
clientGroupsBlock:
default:
– ads
192.168.14.100:
– ads
– porn
# Bloquer en retournant 0.0.0.0 comme IP
blockType: zeroIp
blockTTL: 1m
loading:
refreshPeriod: 6h
downloads:
timeout: 60s
attempts: 5
cooldown: 10s
concurrency: 16
# Répondre aux requêtes DNS dès le démarrage
strategy: fast
maxErrorsPerSource: 5
# Précharger les requêtes DNS populaires
# Pendant 24h (prefectExpires), à partir de 3 requêtes sur un nom (prefectTheshold)
# maxItemsCount – Limiter à 1000 éléments en cache (utile pour limiter la consommation en RAM, sinon 0 pour illimité)
# prefetchMaxItemsCount – Limiter à 1000 éléments à précharger (requêtes « hot »)
caching:
maxItemsCount: 1000
prefetching: true
prefetchExpires: 24h
prefetchThreshold: 3
prefetchMaxItemsCount: 1000
# Résoudre les noms des serveurs upstreams
bootstrapDns:
– https://8.8.8.8/dns-query
# Créer un fichier de log par client
# Conserver les données sur 31 jours
queryLog:
type: csv-client
logRetentionDays: 31
# Log du service Blocky
# Journaliser les erreurs uniquement, par défaut « info »
log:
level: error
Sauvegardez et fermez le fichier.
Note : Blocky va actualiser les données des listes de façon périodique. Par défaut, toutes les 4 heures. Vous pouvez ajuster ce comportement via la directive refreshPeriod. Vous pouvez aussi désactiver cette fonctionnalité, en indiquant la valeur 0 à cette directive.
Dans cette configuration, retenez ces points importants :
Résoudre les noms DNS en utilisant le protocole DNS-over-HTTPS grâce aux serveurs déclarés sous upstreams.
Bloquer les publicités + les malwares pour tous les clients en utilisant les données de la liste de Steven Black
Bloquer les publicités + les malwares + les sites pornographiques uniquement pour le client avec l’adresse IP 192.168.14.100 (vous pouvez mettre une adresse réseau)
Un fichier de log par client sera généré et il contiendra toutes les requêtes DNS du client, avec une rotation sur 31 jours
Il existe de nombreuses listes sur Internet, plus ou moins complètes, et plus ou moins spécifiques. Celles du dépôt Steven Black ont une excellente réputation, et il y a différentes listes, notamment avec des catégories (jeux de hasard, réseaux sociaux, etc.). Ici, j’utilise la liste principale pour bloquer les publicités et les malwares, ainsi que la liste pour la pornographie uniquement pour une machine spécifique.
Note : le fait que Blocky s’appuie sur un seul et unique fichier de configuration facilite la sauvegarde et la restauration de l’application. Néanmoins, il est possible de configurer Blocky pour qu’il lise plusieurs fichiers YAML.
D. Démarrer Blocky
Nous devons finaliser la configuration pour lancer Blocky et le tester. Modifiez les permissions sur le répertoire /opt/blocky pour que l’utilisateur blocky soit propriétaire.
sudo chown -R blocky:blocky /opt/blocky
Puis, activez le démarrage automatique du service, et lancez-le :
sudo systemctl enable blocky
sudo systemctl start blocky
Vérifiez le statut via la commande suivante :
sudo systemctl status blocky
Vous devriez voir apparaître des lignes similaires à celles-ci :
INFO server: UDP server is up and running on address :53
INFO server: TCP server is up and running on address :53
INFO list_cache: import succeeded count=75409 source=https://raw.githubusercontent.com/StevenBlack/hosts/master/alternates/po>
INFO list_cache: group import finished group=porn total_count=75409
INFO list_cache: import succeeded count=132370 source=https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
INFO list_cache: group import finished group=ads total_count=132368
Votre instance Blocky est en ligne ! Vous n’avez plus qu’à tester !
III. Utiliser Blocky sur un PC
Pour qu’une machine cliente effectue la résolution de noms via Blocky, vous devez modifier la configuration de la carte réseau. Enfin, ce n’est pas tout à fait vrai puisque cela dépend du mode de déploiement.
Lorsque Blocky est utilisé en tant que serveur DNS classique, vous devez indiquer l’adresse IP du serveur Blocky dans les paramètres de la carte réseau de la machine (ou modifier la configuration de votre serveur DHCP, que ce soit une box, un firewall ou autre)
Lorsque Blocky est utilisé en tant que serveur DNS-over-HTTPS, la configuration doit s’effectuer dans les paramètres de Windows 11 et/ou directement dans les paramètres du navigateur Web que vous utilisez.
Ce second cas d’usage n’est pas évoqué dans ce tutoriel. Il nécessite de disposer d’un nom de domaine et d’un certificat, ce qui peut s’avérer utile si vous souhaitez utiliser votre serveur Blocky depuis n’importe où. Si vous sollicitez uniquement votre serveur Blocky depuis le réseau local ou via un VPN, les requêtes DNS traditionnelles peuvent suffire (sans oublier qu’elles transitent en clair, car c’est le comportement du DNS). Pour rappel, le DNS-over-HTTPS présente l’avantage d’encapsuler les requêtes DNS dans du trafic HTTPS, elles sont donc chiffrées.
Ainsi, sur une machine Windows, il suffit de spécifier l’adresse IP du serveur Blocky en tant que DNS. Ici, il s’agit d’un test, sinon il serait préférable de modifier la configuration du DHCP pour distribuer cette adresse IP en tant que DNS.
Ensuite, il convient de naviguer sur le Web pour tester le filtrage…
De son côté, Blocky a créé un fichier nommé 2025-03-17_192_168_14_100.log et correspondant aux logs de la machine avec l’adresse IP 192.168.14.100.
Dans ce journal, nous pouvons voir toutes les requêtes DNS effectuées par cette machine. Par exemple, lors de l’accès à IT-Connect :
RESOLVED (https://cloudflare-dns.com/dns-query) www.it-connect.fr. CNAME (www.it-connect.fr.cdn.cloudflare.net.), A (172.67.207.30), A (104.21.22.214) NOERROR RESOLVED A srv-dns
Puis, lorsqu’il y a le blocage sur un domaine relatif à de la publicité :
BLOCKED (ads) securepubads.g.doubleclick.net. NXDOMAIN BLOCKED HTTPS srv-dns
Et, enfin, lors d’une requête DNS destinée à résoudre un nom de la zone it-connect.local. Ici, le serveur DNS déclaré dans la règle de redirecteur conditionnel a bien été sollicité.
CONDITIONAL srv-adds-01.it-connect.local. A (192.168.14.201) NOERROR CONDITIONAL A srv-dns
Dans le cas où l’on tente d’accéder à un site web pornographique à partir de la machine ayant l’adresse IP 192.168.14.100, l’accès est bloqué.
Notre Blocky fonctionne très bien !
IV. Intégration de Blocky avec Grafana
Vous pouvez déployer Grafana et Prometheus spécialement pour Blocky si vous souhaitez avoir un tableau de bord et quelques statistiques. Sinon, et là, c’est plus intéressant, vous pouvez connecter Blocky à votre installation existante puisque Grafana et Prometheus sont très utilisés par les entreprises.
Pour que Prometheus puisse collecter les informations de votre instance Blocky, qui seront ensuite lues par Grafana, vous devez ajuster la configuration de Blocky. Dans le fichier config.yml, ajoutez ces lignes :
# Prometheus
prometheus:
enable: true
path: /metrics
ports:
http: 4000
Sur cette page, vous pouvez récupérer le modèle de tableau de bord Grafana pour Blocky.
Voici un aperçu du tableau de bord de Blocky sur Grafana :
V. Conclusion
Blocky est une solution facile à déployer et à configurer, si ce n’est qu’il soit nécessaire de passer un peu de temps à étudier le fonctionnement de la configuration. Dans le cas où vous préférez effectuer un déploiement avec Docker, vous pouvez vous référer à la documentation officielle.
Même si vous n’envisagez pas de bloquer les publicités au niveau du réseau, vous pouvez utiliser Blocky pour bloquer les sites malveillants au niveau DNS. Si c’est votre unique objectif, vous pouvez aussi vous passer d’une solution comme celle-ci pour directement opter pour un DNS qui effectue du filtrage. Nous en avions parlé dans ce tutoriel :
Qu’en pensez-vous ?
Ingénieur système et réseau, cofondateur d’IT-Connect et Microsoft MVP « Cloud and Datacenter Management ». Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.