Aller au contenu
Freebox Ultra : Créer et configurer un serveur DNS depuis une machine virtuelle via FreeboxOS (Épisode 02)
  1. Posts/

Freebox Ultra : Créer et configurer un serveur DNS depuis une machine virtuelle via FreeboxOS (Épisode 02)

Fabien ALLAMANCHE
Auteur
Fabien ALLAMANCHE
Géomaticien @ Vienne Condrieu Agglomération
Sommaire
FreeboxOS & serveur DNS via Dnsmasq - Cet article fait partie d'une série.
Partie 2: Cet article

La possibilité de créer et de gérer des machines virtuelles (VM) directement depuis l’interface d’administration Freebox OS est l’une des fonctionnalités avancées les plus intéressantes pour les utilisateurs de Freebox Delta et Ultra. Cette option permet de transformer votre Freebox en véritable mini-serveur capable d’héberger un système d’exploitation distinct pour des usages variés.

Ici, ce sera pour la création d’un serveur de noms (serveur DNS) via l’outil DnsMasq.

L’objectif de cette article est de trouver une alternative à Pihole via DnsMasq, et éventuellement voir si on peut configurer DnsMasq afin qu’il joue aussi le rôle de bloqueur de publicité en filtrant les noms de domaine indésirables.

Vous retrouverez dans cette partie l’ensemble de la configuration de DnsMasq.

DNSMASQ
#

Installation
#

Première étape, installer dnsmasq :

[allfab@dnsmasq ~]$ sudo dnf install -y dnsmasq

L’installation n’est pas bien compliquée finalement ! Mettons maintenant les 🫱mains🫱 dans le camboui pour configurer dnsmasq !

Configuration minimale
#

Nous allons mettre en place une configuration minimale de dnsmasq avant d’essayer d’implémenter le filtrage de noms de domaine indésirables qui jouera le rôle de bloqueur de publicité.

Au préalable, il est toujours conseillé de se faire un petite sauvegarde du fichier /etc/dnsmasq.conf avant de tout casser !

[allfab@dnsmasq ~]$ sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.ori

Références : https://thekelleys.org.uk/dnsmasq/docs/dnsmasq.conf.example

Pour mettre en place la configuration que je désire, il va nous falloir éditer et/ou créer plusieurs fichiers de configurations.

Voici le détail :

  • Édition :

    1. /etc/hosts :
    # /etc/hosts
    127.0.0.1     localhost.localdomain localhost
    192.168.0.53  dns.mondomain.lan dns
    

    Cette configuration du fichier /etc/hosts, nous permet de mapper le nom de la machine locale, en l’occurence dnsmasq avec son adresse IP au sein de notre réseau local.

    1. /etc/NetworkManager/NetworkManager.conf : Dans la section [main] du fichier, ajoutez ces 2 lignes :
    ...
    [main]
    dns=none
    rc-manager=unmanaged
    ...
    

    Indique à NetworkManager de ne pas gérer la résolution DNS et de ne pas interférer dans la gestion des interfaces réseau.

    1. /etc/dnsmasq.conf : Configuration permettant à dnsmasq de servir de serveur DNS local pour le domaine mondomain.lan, d’utiliser des serveurs DNS en amont de Cloudflare, et de journaliser les requêtes DNS pour le suivi et le débogage. Voici la configuration .
  • Création :

    1. /etc/dnsmasq-hosts.conf : Permet de définir les enregistrements A et AAAA de notre réseau local.
    2. /etc/dnsmasq-resolv.conf : Si vous faites le choix de définir un fichier de configuration différent que /etc/resolv.conf.
[allfab@dnsmasq ~]$ sudo vi /etc/dnsmasq.conf

/etc/dnsmasq.conf
#

# /etc/dnsmasq.conf
domain-needed
bogus-priv
local=/mondomain.lan/
domain=mondomain.lan
addn-hosts=/etc/dnsmasq-hosts.conf
expand-hosts
strict-order
server=1.1.1.1
server=1.0.0.1
no-resolv
#resolv-file=/etc/dnsmasq-resolv.conf
log-facility=/var/log/dnsmasq.log
log-queries
log-async

Détails :

domain-needed : Indique à dnsmasq de ne pas résoudre les requêtes qui ne contiennent pas de nom de domaine. Évite les requêtes inutiles pour des noms d’hôtes qui ne sont pas valides.

bogus-priv : Empêche la résolution des adresses IP privées (comme celles définies par les plages RFC 1918) en tant que noms de domaine. Éviter les fuites d’informations sur le réseau local.

local=/mondomain.lan/ : Directive qui définit un domaine local. Tous les noms d’hôtes qui se terminent par .mondomain.lan seront considérés comme locaux et résolus par dnsmasq.

domain=mondomain.lan : Définit le domaine par défaut pour les requêtes DNS. Cela signifie que si un nom d’hôte est fourni sans domaine, dnsmasq complétera automatiquement .mondomain.lan à la fin.

addn-hosts=/etc/dnsmasq-hosts.conf : Permet de définir les enregistrements A et AAAA supplémentaires. Ce fichier contient les mappages d’adresses IP à des noms d’hôtes. Typiquement, c’est ici que nous allons/pouvons définir le mappage des noms de nos serveurs locaux vers leurs adresses IP.

expand-hosts : Permet d’étendre les noms d’hôtes en ajoutant le domaine local aux noms d’hôtes qui ne contiennent pas de domaine. Cela fonctionne en conjonction avec l’option addn-hosts.

server=1.1.1.1 et server=1.0.0.1 : Ces lignes spécifient les serveurs DNS en amont que dnsmasq doit utiliser pour résoudre les requêtes DNS. Dans mon cas, j’utilise les serveurs DNS de Cloudflare.

no-resolv : Indique à dnsmasq de ne pas lire le fichier /etc/resolv.conf pour les serveurs DNS en amont. Cela signifie que seuls les serveurs spécifiés dans la configuration via l’option server= seront utilisés.

#resolv-file=/etc/dnsmasq-resolv.conf : Permet de définir un fichier de configuration différent que /etc/resolv.conf. Dans notre cas, nous allons nous servir du fichier par défaut /etc/resolv.conf, c’est pourquoi nous avons édité le fichier /etc/NetworkManager/NetworkManager.conf afin que NetworkManager ne gère pas la résolution DNS et n’interfère pas dans la gestion des interfaces réseau. La directive est commentée pour cela.

strict-order : Indique à dnsmasq de respecter l’ordre des serveurs DNS spécifiés. Si un serveur échoue, il ne passera pas au suivant avant que le premier ne soit de nouveau disponible.

log-facility=/var/log/dnsmasq.log : Définit le fichier de log où dnsmasq écrira ses messages de log. Dans ce cas, les logs seront écrits dans /var/log/dnsmasq.log.

log-queries : Active la journalisation des requêtes DNS. Cela signifie que toutes les requêtes reçues par dnsmasq seront enregistrées dans le fichier de log spécifié.

log-async : Indique à dnsmasq d’écrire les logs de manière asynchrone, ce qui peut améliorer les performances en évitant que le processus principal ne soit bloqué par l’écriture des logs.

En résumé, cette configuration permet à dnsmasq de servir de serveur DNS local pour le domaine mondomain.lan, d’utiliser des serveurs DNS en amont de Cloudflare, et de journaliser les requêtes DNS pour le suivi et le débogage du serveur le cas échéant.

/etc/dnsmasq-hosts.conf
#

Les enregistrements A et AAAA supplémentaires à renseigner pour mon réseau local :

[allfab@dnsmasq ~]$ sudo vi /etc/dnsmasq-hosts.conf

```ini
# /etc/dnsmasq-hosts.conf
192.168.0.53    dns dns.mondomain.lan
192.168.10.110  frontend frontend.mondomain.lan
192.168.10.120  elephant elephant.mondomain.lan
192.168.10.130  smarthome smarthome.mondomain.lan
192.168.10.140  webapps webapps.mondomain.lan
...

Démarrage du service
#

Nous sommes prêts à activer le service et à le démarrer :

[allfab@dnsmasq ~]$ sudo systemctl enable dnsmasq.service --now

Vérifions que tout va bien :

[allfab@dnsmasq ~]$ sudo systemctl status dnsmasq.service

Jetons un oeil au log par la même occasion :

[allfab@dnsmasq ~]$ sudo tail -f -n 500 /var/log/dnsmasq.log

Filtrage DNS
#

Finalement, il est assez simple d’implémenter dnsmasq dans le but de filter les noms de domaine indésirables.

Tout d’abord, il faut récupérer une liste d’adresses que l’on veut filtrer. Il existe des projets qui font cela très bien, je pense notamment au dépôt Hosts de Steven Black que l’on retrouve su GitHub :

Ce référentiel consolide plusieurs fichiers hosts réputés et les fusionne dans un fichier d’hôtes unifié en supprimant les doublons. C’est en autre le fichier d’hôtes filtré par défaut par PiHole.

Voici à quoi ressemble ce fichier pour les adresse IPV4 :

# Title: StevenBlack/hosts
#
# This hosts file is a merged collection of hosts from reputable sources,
# with a dash of crowd sourcing via GitHub
#
# Date: 13 March 2025 21:33:05 (UTC)
# Number of unique domains: 132,356
#
# Fetch the latest version of this file: https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts
# Project home page: https://github.com/StevenBlack/hosts
# Project releases: https://github.com/StevenBlack/hosts/releases
#
# ===============================================================

127.0.0.1 localhost
127.0.0.1 localhost.localdomain
127.0.0.1 local
255.255.255.255 broadcasthost
::1 localhost
::1 ip6-localhost
::1 ip6-loopback
fe80::1%lo0 localhost
ff00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts
0.0.0.0 0.0.0.0

# Custom host records are listed here.


# End of custom host records.
# Start StevenBlack

#=====================================
# Title: Hosts contributed by Steven Black
# http://stevenblack.com

0.0.0.0 ad-assets.futurecdn.net
0.0.0.0 ck.getcookiestxt.com
0.0.0.0 eu1.clevertap-prod.com
0.0.0.0 wizhumpgyros.com
0.0.0.0 coccyxwickimp.com
0.0.0.0 webmail-who-int.000webhostapp.com
0.0.0.0 010sec.com
0.0.0.0 01mspmd5yalky8.com
0.0.0.0 0byv9mgbn0.com
0.0.0.0 ns6.0pendns.org
0.0.0.0 dns.0pengl.com
0.0.0.0 12724.xyz
0.0.0.0 21736.xyz

Afin qu’il soit interprétable par dnsmasq, il faut qu’on l’adapte quelque peu. Pour cela, nous allons exécuter un petit script bash qui va parser le fichier et le ré-écrire pour dnsmasq :

[allfab@dnsmasq ~]$ wget -O- https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts | awk '$1 == "0.0.0.0" { print "address=/"$2"/0.0.0.0/"}' > /etc/dnsmasq-adblock.conf

Que fait ce petit script :

  • On télécharge le fichier d’hôtes brut sur github,
  • Et awk formatte la sortie que l’on redirige dans le fichier /etc/dnsmasq-adblock.conf.
address=/0.0.0.0/0.0.0.0/
address=/ad-assets.futurecdn.net/0.0.0.0/
address=/ck.getcookiestxt.com/0.0.0.0/
address=/eu1.clevertap-prod.com/0.0.0.0/
address=/wizhumpgyros.com/0.0.0.0/
address=/coccyxwickimp.com/0.0.0.0/
address=/webmail-who-int.000webhostapp.com/0.0.0.0/
address=/010sec.com/0.0.0.0/

Il n’y a plus qu’à ajouter une ligne de configuration au fichier /etc/dnsmasq.conf (conf-file=/etc/dnsmasq-adblock.conf) :

# /etc/dnsmasq.conf
domain-needed
bogus-priv
local=/mondomain.lan/
domain=mondomain.lan
addn-hosts=/etc/dnsmasq-hosts.conf
conf-file=/etc/dnsmasq-adblock.conf
expand-hosts
strict-order
server=1.1.1.1
server=1.0.0.1
no-resolv
#resolv-file=/etc/dnsmasq-resolv.conf
log-facility=/var/log/dnsmasq.log
log-queries
log-async

Maintenant, il n’y plus qu’à récupérer ce fichier d’hôtes brut automatiquement.

Ce fichier évolue au fil du temps et il est opportun d’automatiser la procédure de récupération et de formattage de ce dernier.

Pour cela, nous allons utiliser le planificateur de tâches cron et crontab qui permet de lancer des tâches de façon régulière sur des systèmes Linux. Si vous avez besoin de plus amples informations, je vous redirige sur la page qui traite du sujet sur Linuxtricks.

Nous allons effectué cete tâche de manière récurente tous les jours à 3h00 du matin. Pour cela, je vous invite à vous rendre sur https://crontab.guru/examples.html pour récupérer la syntaxe qui va bien !

Editons notre fichier de configuration crontab :

[allfab@dnsmasq ~]$ sudo crontab -e

0 3 * * * wget -O- https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts | awk '$1 == "0.0.0.0" { print "address=/"$2"/0.0.0.0/"}' > /etc/dnsmasq-adblock.conf && systemctl restart dnsmasq 2>> /var/log/dnsmasq-adblock.log

Notez qu’on redémarre bien dnsmasq afin qu’il prenne en compte les modifications apportées au fichier /etc/dnsmasq-adblock.conf.

Trucs & Astuces
#

[allfab@dnsmasq ~]$ vi ~/.bashrc
...
alias dns-log="sudo tail -f -n 500 /var/log/dnsmasq.log"
alias dns-start="sudo systemctl start dnsmasq.service"
alias dns-status="sudo systemctl status dnsmasq.service"
alias dns-stop="sudo systemctl stop dnsmasq.service"
alias dns-restart="sudo systemctl restart dnsmasq.service"
alias dns-adblock="sudo wget -O- https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts | awk '$1 == "0.0.0.0" { print "address=/"$2"/0.0.0.0/"}' > /etc/dnsmasq-adblock.conf"

Pensez à recharger la configuration de votre shell Bash sans à avoir à redémarrer le terminal avant d’exécuter un alias :

[allfab@dnsmasq ~]$ source ~/.bashrc
FreeboxOS & serveur DNS via Dnsmasq - Cet article fait partie d'une série.
Partie 2: Cet article

Articles connexes