Installer unbound + dnscrypt sur son raspberry pi.
dns infrastructure raspberry

Afin d’optimiser et de fiabiliser votre accès internet à la maison, je vous propose d’installer un resolveur DNS unbound comme relai à dnscrypt-proxy permettant de faire des requêtes DNS chiffrées (en attendant la généralisation de DNSSEC).

Pour cela, vous aurez besoin :

DNSCrypt c’est quoi ? :

DNSCrypt est un protocole qui tente de sécuriser le protocole DNS à l’aide de la librairie Sodium (NaCl), utilisée notamment dans le chiffrement et l’authentification pour ZMQ.

Le protocole DNSCrypt utilise un résolveur sur internet avec lequel il communique en utilisant les ports TCP 443, et UDP 443, souvent moins filtrés par les firewall et/ou fournisseurs d’accès internet.

Il faut installer un agent local qui va transférer en chiffré les requêtes DNS au serveur DNSCrypt qui va résoudre et retransmettre les réponses en chiffré à l’agent.

(local host) <– [dns] –> (agent) <– [dnscrypt] -> (server) <– [dns] –> (resolver)

C’est un peu comme si on faisait passer les requêtes DNS dans un VPN pour masquer le traffic. Ou plutôt HTTP est au DNS, ce que HTTPS est à DNSCrypt. Ce tunneling permet d’éviter les soucis de man in the middle et d’espionnage de trame.

DNSCrypt ne remplace pas DNSSEC, mais peut être utilisé en parallèle. DNSSEC permet entre autres de vérifier qu’un enregistrement n’a pas été modifié, alors que DNSCrypt ne permet que de protéger la vie privée d’un utilisateur en chiffrant le contenu des requêtes DNS envoyées vers le serveur de noms.

Dans notre cas nous utiliserons DNSCrypt comme système de résolution distant.

Unbound c’est quoi ?

Unbound est un serveur DNS faisant office de :

Vous me direz, biensûr, mais il y a dnsmasq aussi … certes … mais là je parle de unbound !

Avec unbound, on a la possibilité de le configurer pour aller consulter les serveurs DNS ROOT (La matrice de l’internet ! Les alpha serveurs.)

Le service DNS est hiérarchisé en arbre. Par exemple :

C’est à dire qu’il existe un service DNS permettant de diriger les requêtes de plus bas niveau vers des serveurs DNS d’une autre branche.

Pour résoudre zenithar.org :

On parle alors de forwarder puisque mon résolveur local fait confiance au DNS parent auquel il est configuré.

Le problème est que si le DNS du FAI vient falsifier la réponse, vous n’aurez aucune preuve de la mauvaise fois du serveur DNS du FAI sans DNSSEC. Le principe de DNSSEC est en gros de signer les requêtes et les réponses pour garantir la non-répudiation d’un requête DNS.

Nous allons donc mettre en place unbound avec les mécanismes DNSSEC afin de garantir (quand le domaine le supporte) les échanges DNS.

Installation de Unbound

Tout d’abord veuillez procéder à l’installation du service Unboud sur votre Raspberry PI.

$> pacman -S unbound
$> systemctl enable unbound

Il faut ensuite configurer le service avec le fichier de configuration (/etc/unbound) suivant :

Vous pouvez configurer une zone locale c’est-à-dire que vous pouvez donner à vos machines un nom DNS local privé à votre zone.

Il faut aussi configurer le reverse dns qui permet depuis une IP d’obtenir le DNS associé :

Cette configuration permet de mettre en place un serveur DNS local pour un réseau mappé en 192.168.0.0/24, et utilise les DNS de OpenDNS comme résolveur distant. Vous n’utiliserez plus les DNS de vos fournisseurs d’accès, cependant il est possible que l’accès soit restreint, voir contrôlé, il faut donc mettre en place le chiffrement du traffic DNS à l’aide du proxy DNSCrypt.

$> systemctl start unbound

Installation de DNSCrypt

Nous allons mettre en place le service dnscrypt-proxy sur le Raspberry PI.

$> pacman -S dnscrypt-proxy
$> systemctl enable dnscrypt-proxy

Vous devez procéder à la configuration (/etc/conf.d/dnscrypt-proxy) du proxy DNS :

Il suffit de démarrer votre relai DNSCrypt.

$> systemctl start dnscrypt-proxy

Pour terminer

$> netstat -lnp

Vous devriez voir les services unbound et dnscrypt-proxy s’exécuter.

udp   0 0 0.0.0.0:53       0.0.0.0:*   LISTEN      ****/unbound
tcp   0 0 127.0.0.1:9053   0.0.0.0:*   LISTEN      ****/dnscrypt-proxy
udp   0 0 127.0.0.1:9053   0.0.0.0:*               ****/dnscrypt-proxy

Il suffit de décommenter la ligne 81 de unbound.conf, et de commenter les forward sur OpenDNS.

$> systemctl restart unbound

Quelques tests

$> drill -D zenithar.org

Vous devriez voir les requêtes ainsi que la résolution DNSSEC effectuée par Unbound au travers de DNSCrypt.

$> drill router.home

Vous devriez voir l’adresse IP résolue configurée dans vore zone locale.

Si tout fonctionne bien, votre résolveur DNS local est configuré. Si vous souhaitez définir le résolveur local comme résolveur par défaut pour votre réseau, ce qui rendra votre RPI indispensable à l’infrastructure locale, vous devez configurer votre serveur DHCP (la box) pour fournir en serveur DNS l’adresse IP (au préalable fixée) de votre résolveur local.

Problèmes

Vous venez de faire la mise à jour et maintenant DNSCrypt fonctionne avec Systemd ?

Il suffit d’éditer le fichier /usr/lib/systemd/system/dnscrypt-proxy.socket

[Unit]
Description=dnscrypt-proxy listening socket
After=network.target

[Socket]
ListenStream=127.0.0.1:9053
ListenDatagram=127.0.0.1:9053

[Install]
WantedBy=sockets.target

Ainsi que le fichier de service /usr/lib/systemd/system/dnscrypt-proxy.service :

[Unit]
Description=DNSCrypt client proxy
Requires=dnscrypt-proxy.socket
Before=unbound.service

[Install]
Also=dnscrypt-proxy.socket
WantedBy=multi-user.target

[Service]
Type=simple
NonBlocking=true
ExecStart=/usr/bin/dnscrypt-proxy \
	       --resolver-name=dnscrypt.org-fr

Un petit reload des services :

$> systemctl daemon-reload
$> systemctl restart dnscrypt-proxy
$> systemctl restart unbound

Et refaire les tests.

Mon Raspberry n’arrive plus à avoir l’heure correctement au démarrage :

Pour cela, j’ai une solution un peu crade mais elle fonctionne, il faut éditer le fichier /etc/ntp.conf et y remplacer les DNS par les IPs des pool utilisés :

# Associate to Arch's NTP pool
server 195.154.97.57 # 0.arch.pool.ntp.org
server 212.83.131.33 # 0.arch.pool.ntp.org
server 91.121.90.6   # 0.arch.pool.ntp.org
server 188.165.39.130 # 0.arch.pool.ntp.org
# Il faudrait le faire pour chaque serveur ...

Ce problème peut aussi être simplement résolu (moyennant finance) par l’achat d’une carte d’extension avec une horloge interne - Avant l’heure, c’est pas l’heure ! Après l’heure… Offrez une horloge temps réel (RTC) à votre Raspberry Pi .

Ajoutez le support Spotify à votre serveur Mopidy.
python mopidy raspberry linux spotify

Voici le photobooth Quick & Dirty (sanchez) de mon mariage...
python flask raspberry linux github

J'ai galéré à trouver une image 'ready-to-burn' d'archlinux pour mon raspberry pi, du coup voici comment en créer une.
linux raspberry