AdGuard Home un excellent bloqueur de publicité

Installation de AdGuard Home un excellent bloqueur de publicité avec docker en quelques minutes pour rendre votre internet plus propre.

AdGuard Home un excellent bloqueur de publicité

Bonjour,

Je suis en train de transférer mes VMs qui me servent de DNS Blacklist vers des containers LXC sous Alpine. L'intérêt principal est le gain de performance en terme d'utilisation de la RAM. En gros mes VMs tournaient sous debian 11 et utilisaient entre 600 et 900Mo de RAM. Avec LXC/Alpine j'utilise entre 100-200Mo de RAM!! J'adore le côté minimaliste d'Alpine et son "secure by design".

La création des containers LXC fera l'objet d'un guide plus tard, ce n'est pas le sujet de ce post. Aujourd'hui nous allons voir comment installer AdGuard Home avec Docker en quelques minutes.

AdGuard Home est un logiciel qui permet de filtrer vos requêtes DNS et élimine à la racine les publicités et autres requêtes des trackers. Il a l'avantage d'avoir toutes les dernières technologies à sa disposition concernant les requêtes DNS à savoir DOH/DOT (DNS over HTTPS & DNS over TLS) qui permettent un chiffrement de bout en bout de vos données. Et cerise sur le gâteau, si vous ne disposez pas d'un routeur performant ou si vous avez une box pourrie (pléonasme) de chez Orange, il permet de gérer le DHCP.

Les prérequis pour l'installation:
- Docker
- Docker Compose

Dans votre répertoire principal ou sont vos dockers, on va commencer par créer le réseau "backend".

docker network create backend

Le réseau "backend" chez moi est le réseau qui n'est pas sensé être en frontal avec internet et dans lequel les services n'ont pas de frontend exposés. Dès que j'ai un frontend exposé, j'utilise un reverse-proxy + authentification pour sécuriser (et Cloudflare pour rajouter une couche).

Le docker compose qui va bien (je ne m'amuse pas à faire un docker-compose par service, je ne vois pas l'intérêt à part perdre du temps quand on veut faire des modifications / relancer des applications, après libre à vous de le découper suivant vos besoins / installations ):

version: "3.9"

########################### NETWORKS ###############################################
networks:
  #traefik:
  #  external: true
  backend:
    external: true
    #name: backend if external false
    #driver: bridge

########################### SERVICES ###############################################
services:
############################### PORTAINER #######################################################     
  portainer:
    # Installer Portainer / Interface graphique docker
    # https://hub.docker.com/r/portainer/portainer-ce
    container_name: portainer
    image: portainer/portainer-ce:latest
    restart: unless-stopped
    command: -H unix:///var/run/docker.sock
    security_opt:
      - no-new-privileges:true      
    networks:
      - backend
    ports:
      - "$PORTAINER_PORT:9000"
      - "$PORTAINERSERVER_PORT:8000"   
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - $USERDIR/Portainer:/data 
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
      
 ############################## MAINTENANCE ################################################### 
  watchtower:
    # Watchtower detects if any linked containers have a new image available, automatically updating & restarting them if needed.
    # https://hub.docker.com/r/containrrr/watchtower
    container_name: watchtower
    image: containrrr/watchtower:latest
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - backend
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
    environment:
      - TZ=$TZ
      - WATCHTOWER_CLEANUP=true
      - WATCHTOWER_INCLUDE_RESTARTING=true
      #- WATCHTOWER_POLL_INTERVAL=60
      - WATCHTOWER_DEBUG=false
      - WATCHTOWER_SCHEDULE=0 0 3 * * *  
      
 ########################### UTILITIES #################################################
  dozzle:
    # Dozzle - Real-time Docker Log Viewer
    # https://hub.docker.com/r/amir20/dozzle
    image: amir20/dozzle:latest
    container_name: dozzle
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - backend
    ports:
      - "$DOZZLE_PORT:8080"
    environment:
      DOZZLE_LEVEL: info
      DOZZLE_TAILSIZE: 300
      DOZZLE_FILTER: "status=running"
      # DOZZLE_FILTER: "label=log_me" # limits logs displayed to containers with this label     
      TZ: "$TZ"      
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock     

 ###################################### DNS ################################################# 
  adguardhome:
    # AdGuard - DNS Blocker
    # https://hub.docker.com/r/adguard/adguardhome
    image: adguard/adguardhome:latest
    container_name: adguard
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - backend
    ports:
      - $ADGUARDDNS_PORT:53/tcp
      - $ADGUARDDNS_PORT:53/udp
      - $ADGUARDDHCP1_PORT:67/udp
      - $ADGUARDDHCP2_PORT:68/tcp
      - $ADGUARDDHCP2_PORT:68/udp      
      - $ADGUARD1_PORT:784/udp
      - $ADGUARD2_PORT:853/tcp
      - $ADGUARDADMIN_PORT:3000/tcp
      - $ADGUARDHTTP_PORT:80/tcp
      - $ADGUARDHTTPS_PORT:443/tcp  
    volumes:
      - $USERDIR/Adguard/work:/opt/adguardhome/work
      - $USERDIR/Adguard/conf:/opt/adguardhome/conf     
    environment:
      TZ: $TZ  

J'utilise toujours la même structure pour mes VMs / containers. En plus de AdGuard, j'ai ajouté les containers suivant (vous pouvez les enlever si ils ne vous intéressent pas) que je considère comme indispensables pour une utilisation / debugging plus simple:
- Portainer: il me permet de gérer simplement mes containers, les relancer / détruire, virer les images, etc...
- Dozzle est un utilitaire qui permet de lire très facilement les logs des containers.
- Watchtower permet quand à lui de mettre à jour automatiquement les containers quand une nouvelle image est disponible (ici à 3h du matin chaque jour). Le but c'est de tout automatiser, pas de s'amuser à faire les mises à jour à la main ou tous les deux ans avec une version spécifique d'où le "latest" pour tous les containers. Alors oui, il peut arriver que lors d'une mise à jour automatique ça casse tout mais bon ça doit arriver 2x par an au maximum alors que j'ai en permanence plus d'une quarantaine de containers qui tournent. Not worth the hassle comme on dit chez Sam.

Toutes mes variables sont des $qqch. Elles sont toutes stockées dans un fichier .env à la racine de mes dockers pour plus de simplicité.  On ouvre donc ce fichier :

nano .env

Et voici à quoi ça ressemble en exemple dans ce fichier .env :

################## SYSTEM ########################
PUID=1001 
PGID=1001
TZ=Europe/Paris 
USERDIR=/home/docker
[email protected] 
[email protected]
SERVER_IP=192.160.125.101
COMPOSE_PROJECT_NAME=AdGuard

############## PORTS ###########################
PORTAINER_PORT=9000 
PORTAINERSERVER_PORT=8000
DOZZLE_PORT=8071 
ADGUARDDNS_PORT=53
ADGUARDHTTP_PORT=80
ADGUARDHTTPS_PORT=443
ADGUARDADMIN_PORT=3000
ADGUARD1_PORT=784
ADGUARD2_PORT=853
ADGUARDDHCP1_PORT=7067
ADGUARDDHCP2_PORT=7068

Rien de transcendant ici, faites bien attention à bien définir votre USERDIR là ou seront les répertoires permanents des containers.

C'est terminé ? Pour docker oui, il ne reste plus qu'à lancer les containers:

docker-compose up -d

Pour configurer AdGuard, il suffit de se rendre sur http://votreip:3000. A noter que le port 3000 ne sert que pour la configuration. Une fois réalisée, il n'est plus utilisé par le container.

Bon ensuite il suffit de répondre aux questions qui sont posées, rien de compliqué, je ne vais pas vous faire l'affront de vous mettre des screens inutiles. Ne touchez pas au port 53 pour la configuration, c'est le port standard.

Et à partir de maintenant, ça devrait déjà fonctionner. Pour vous rendre sur le tableau de bord il suffit d'aller sur http://votreip.

Pour définir le serveur DNS de votre choix, il faut vous rendre dans le menu Paramètre/Paramètre DNS. Je vous conseille d'utiliser pour votre "Serveurs DNS upstream" soit Quad 9, soit Cloudflare et pour "Serveurs DNS d'amorçage" celui de Cloudflare.

Pour le choix des filtres, il faut se rendre dans "Filtre/Listes de blocage DNS". On clique ensuite sur le bouton en bas à gauche "Ajouter liste de blocage"/"Choisissez dans la liste".

Pour être tranquille, je vous conseille de cocher tout ce qu'il y a dans Général / Sécurité et Autre. Si vous voulez rajouter des filtres personnalisés pourquoi pas ceux de Blocklistproject.

Dans les "Paramètres DNS", tout cocher c'est pas mal:

Et bien sur, pour que votre installation soit utilisée, vous devez définir dans votre DHCP ou sur vos machines de façon individuel (beurk, mettez tout en DHCP, qui voudrait s'ennuyer à gérer chaque téléphone / portable / tablette à la maison un par un ! Mon dieu !!) votre nouveau serveur DNS (au lieu de 8.8.8.8 par exemple ça sera "192.168.1.25").

Est-ce que ça permet de supprimer les addons des navigateurs comme par exemple uBlock & uMatrix ? Pour votre fille de 14 ans qui veut regarder des vidéos tiktok ou de chatons sur Youtube, oui, pour un geek, les deux sont complémentaires. Et est-ce que ça va virer les publicités sur votre téléphone et votre tablette ? Malheureusement non car la plupart du temps les DNS sont en "dur". Le seul moyen c'est de rerouter le port 53 sortant vers votre AdGuard ou alors d'utiliser un VPN vers votre propre serveur (c'est la solution que j'utilise avec Wireguard pour mon téléphone et ça fonctionne parfaitement).

Maintenant il ne vous reste plus qu'à profiter d'un internet plus performant et beaucoup moins pollué ! C'est beau la technologie quand ça fonctionne !

@+