Pour ceux qui ne connaissent pas:
Les ordinateurs communiquent par adresse IP uniquement, donc quand vous souhaitez aller sur google.fr par exemple, votre navigateur contacte le dns et lui demande l’adresse IP de google.fr .
C’est transparent pour vous, seulement les requêtes DNS ne sont pas chiffrées et peuvent être interceptées voire modifiées. De plus, le DNS de votre opérateur peut vous mentir, pour bloquer un site de téléchargement par exemple.
Donc mettre en place DNS over TLS c’est s’assurer d’un surf anonyme et non censuré.

Sous linux, il faut installer Stubby, qui est un serveur DNS de type relai, qui interrogera un serveur DNS par TLS sur internet.

Donc on installe Stubby:
sudo apt install -y stubby

Si vous souhaitez configurer stubby:
sudo vi /etc/stubby/stubby.yml

Pour ignorer les serveurs standards et ajouter, au hasard, les serveurs AdGuard (décommentez les standards ou les family pour les enfants):
## Adguard Default servers
- address_data: 176.103.130.130
tls_auth_name: "dns.adguard.com"
- address_data: 176.103.130.131
tls_auth_name: "dns.adguard.com"
## Adguard Family Protection servers
# - address_data: 176.103.130.132
# tls_auth_name: "dns-family.adguard.com"
# - address_data: 176.103.130.134
# tls_auth_name: "dns-family.adguard.com"

Comme d’habitude, les serveurs security vous protègent de certaines véroles, et les family bloquent les sites pour adulte et paramètrent les moteurs de recherche et youtube en mode enfant.

Ensuite, soit par l’interface graphique, soit en ligne de commande, vous devez éditer toutes vos connexions (wifi, filaire, téléphone en usb…) pour forcer le serveur DNS à utiliser.

On installe crudini pour modifier les fichiers ini
apt install -f crudini

Puis on demande à crudini de modifier les connexions réseau, et enfin on demande à sed de virer les espaces créés par crudini
Désolé, j’ai eu la flemme de chercher si crudini est paramétrable…
for f in /etc/NetworkManager/system-connections/*; do
conf=$f
crudini --set "$conf" ipv4 dns "127.0.0.1"
crudini --set "$conf" ipv4 ignore-auto-dns "true"
sed 's/[[:space:]]//g' "$conf"
done

Ensuite on va redémarrer Stubby pour qu’il prenne les changements en compte, ainsi que le gestionnaire réseau:
sudo systemctl restart Stubby
sudo systemctl restart NetworkManager

Attention, si vous êtes en mode strict (DROP) sur iptables, il faudra ouvrir le port 853 en sortie en tcp:
iptables -A OUTPUT -p tcp --dport 853 -m state --state NEW -j ACCEPT

Pour info, voici le contenu de mon fichier sans les commentaires:
cat /etc/stubby/stubby.yml | grep -o '^[^#]*'
resolution_type: GETDNS_RESOLUTION_STUB
dns_transport_list:
- GETDNS_TRANSPORT_TLS
tls_authentication: GETDNS_AUTHENTICATION_REQUIRED
tls_query_padding_blocksize: 128
edns_client_subnet_private : 1
round_robin_upstreams: 1
idle_timeout: 10000
listen_addresses:
- 127.0.0.1
- 0::1
upstream_recursive_servers:
- address_data: 176.103.130.130
tls_auth_name: "dns.adguard.com"
- address_data: 176.103.130.131
tls_auth_name: "dns.adguard.com"