- Modifié
Wireguard + adguard + unbound + cloudflared = DoT / DoH !
Faut que je l'update ! (06/06/2022)
Préface :
"Coucou Youtute c'est Super..."
Euhhh non, Salut les gens
Depuis quelque temps j'utilise mon résolveur DNS directement à la maison.
Résultat à la maison c'est propre mais quid de quand je me déplace, ou depuis les smartphones...
Du coup dans l'idée, installer Wireguard sur une VM avec adGuard pour le dns des clients vpn, s'appuyant sur Unbound avec cloudlfared en plugin pour avoir le DNS over HTTPS et le DNS over TLS !
Donc on va installer :
- Wireguard
- Adguard
- Unbound
- cloudflared
Installation Wireguard
On va faire simple :
wget https://git.io/wireguard -O wireguard-install.sh
Juste on va effectuer une modification dans ce script, on va mettre notre dns
nano wireguard-install.sh
et on modifie dans cette section :
echo "Select a DNS server for the client:"
echo " 1) Current system resolvers"
echo " 2) Google"
echo " 3) 1.1.1.1"
echo " 4) OpenDNS"
echo " 5) Quad9"
echo " 6) AdGuard"
read -p "DNS server [1]: " dns
until [[ -z "$dns" || "$dns" =~ ^[1-6]$ ]]; do
echo "$dns: invalid selection."
read -p "DNS server [1]: " dns
done
# DNS
case "$dns" in
1|"")
# Locate the proper resolv.conf
# Needed for systems running systemd-resolved
if grep -q '^nameserver 127.0.0.53' "/etc/resolv.conf"; then
resolv_conf="/run/systemd/resolve/resolv.conf"
else
resolv_conf="/etc/resolv.conf"
fi
# Extract nameservers and provide them in the required format
dns=$(grep -v '^#\|^;' "$resolv_conf" | grep '^nameserver' | grep -oE '[0-9]{1,3}(\.[0-9]{1,3}){3}' | xargs | sed -e 's/ /, /g')
;;
2)
dns="8.8.8.8, 8.8.4.4"
;;
3)
dns="1.1.1.1, 1.0.0.1"
;;
4)
dns="208.67.222.222, 208.67.220.220"
;;
5)
dns="9.9.9.9, 149.112.112.112"
;;
6)
dns="94.140.14.14, 94.140.15.15"
;;
esac
}
Ceci :
echo " 2) Google"
par
echo " 2) MonDNS"
Et
dns="8.8.8.8, 8.8.4.4"
par
dns="10.7.0.1"
Alors pourquoi 10.7.0.1, tout simplement parce que le script d'installation de wireguard va attribuer à notre serveur cette ip et que nos clients seront dans cette plage. Donc une fois que les clients sont générés, la conf importera cette adresse comme dns joignable uniquement par nos clients.
Maintenant qu'on a fait cette modification, on va pouvoir lancer le script et installer.
bash wireguard-install.sh
What port should WireGuard listen to? Port [51820]: <-- on laisse par défaut
Enter a name for the first client: Name [client]: <-- On donne un nom au premier client, dans mon cas pour le test : SAMSUNG-S9
Ici on va choisir le 2) MONDNS, celui qu'on à modifier.
Select a DNS server for the client:
1) Current system resolvers
2) MONDNS
3) 1.1.1.1
4) OpenDNS
5) Quad9
6) AdGuard
DNS server [1]: 2
Plus qu'à lancer l'installation
WireGuard installation is ready to begin.
Press any key to continue...
Et attendre la fin, avec l'apparition d'un beau QR code dans le terminal pour les clients mobiles
█████▄▄█▄█▄█▀█ ▄ ▀ ▄██▀█▄ █▄ ▀ █▀ ▄▄▄ ▀▄▄ ▀██ ▄▄ ▄█▄▄ ██▀ ▄▄▄ ▄ ▄▀████
████ ▄▄▄▄▄ █▄ ▄▄▄▀█ ▀▄▄▄▄ ▄ ▀ ▀▀▀ █▄█ ▀▀█ ▄▄▄ █▀▀ █▄▄ ▄▀█▄▀ █▄█ █▄██████
████ █ █ █ ██ ▀███▄██▀▄ ██ █▄ ▄ ▀▄█ ▄▀▀▀ ██▄ ▄██▀ ▀ ▄██ █████
████ █▄▄▄█ █ █▄█▄▄█▀█▀ ▄█▄ ▄ ▀▄ ▀▀▄▀▄▀▀▀ ▀ ██▄▀█▀▀▀▄█▀ ██ ▀█▄ ▀ █████
████▄▄▄▄▄▄▄█▄▄█▄█▄██▄▄▄█▄▄███▄▄▄█████████▄██▄▄▄██▄▄█▄▄█▄█▄▄█▄█▄▄▄▄███████
█████████████████████████████████████████████████████████████████████████
█████████████████████████████████████████████████████████████████████████
↑ That is a QR code containing the client configuration.
Finished!
The client configuration is available in: /root/SAMSUNG-S9.conf
New clients can be added by running this script again.
Une fois terminé le script vous génére donc un qrcode pour les clients mobile à scanner directment dans l'application Wireguard sous Iphone ou Android.
Et il vous indiques aussi où trouver le fichier de conf à importer dans wireguard sur votre pc/serveur...
Suite dans le prochain chapitre.
Installation Adguard
Maintenant que Wireguard est installé, nous avons une nouvelle interface : WG0 qui est dédiée au VPN et donc sur laquelle Adguard devra écouter les requetes DNS.
Lançons l'installation :
curl -sSL https://raw.githubusercontent.com/AdguardTeam/AdGuardHome/master/scripts/install.sh | sh
L'installation est rapide en cli, il nous indiques où nous rendre pour continuer l'installation :
Go to http://x.x.x.x:3000
On se laisse guider : C'est parti !
Ici on va choisir pour l'interface d'écoute pour l'interface web administrateur, on va choisir eth0 (ou votre interface internet).
Pour l'interface DNS on va choisir wg0 - 10.7.0.1
J'explique :
- on pourra accéder à l'interface web d'admin depuis l'extérieur
- les requêtes DNS ne sont écoutées que dans le tunnel vpn
Sur la page suivante vous devez définir un nom d'utilisateur et un mot de passe pour accéder à l'administration.
Suivant ! Ouvrir le tableau de bord !
Voila pour Adguard pour le moment, on y reviendra après.
Installation Unbound
Maintenant on va se mettre, unbound pour résoudre localement.
apt install unbound
On va ajouter la liste des serveurs racine root.
wget -O root.hints https://www.internic.net/domain/named.root
mv root.hints /var/lib/unbound/
On va faire un cron pour garder cette liste à jour tout les 6 mois :
crontab -e
et on colle ces deux lignes :
1 0 1 */6 * wget -O root.hints https://www.internic.net/domain/named.root
2 0 1 */6 * mv root.hints /var/lib/unbound/
Fini pour unbound pour le moment...
Installation Cloudflared pour le DoH et DoT
Pour la doc de cloudflared --> ici
On télécharge cloudflared et on l'extrait ( je pars du principe que ta machine tourne en x64 si archi differente fouille le github https://github.com/cloudflare/cloudflared/releases/) :
PS: au fur a mesure du temps les version évolue donc aujourd'hui on est sur 2022.3.1 en avril on sera surement sur 2022.4.1
cd /tmp
wget https://github.com/cloudflare/cloudflared/releases/download/2022.3.1/cloudflared-linux-amd64
On va le copier et lui donner les permissions :
mv cloudflared-linux-amd64 /usr/local/bin/cloudflared
chmod +x /usr/local/bin/cloudflared
Pour être sur de sa bonne installation la commande :
cloudflared -v
doit retourner quelques lignes.
Créer un utilisateur pour faire tourner cloudflared
useradd -s /usr/sbin/nologin -r -M cloudflared
On va mettre un fichier de conf pour cloudflared dans /etc/default
cd /etc/default
echo "CLOUDFLARED_OPTS=--port 5053 --upstream https://1.1.1.1/dns-query" >> cloudflared
Corriger les permissions :
chown cloudflared:cloudflared /etc/default/cloudflared
chown cloudflared:cloudflared /usr/local/bin/cloudflared
Créer le fichier de service pour cloudflared :
cd /lib/systemd/system
nano cloudflared.service
et coller ça dedans :
[Unit]
Description=Cloudflare with DNS over HTTPS proxy
After=syslog.target network-online.target
[Service]
Type=simple
User=cloudflared
EnvironmentFile=/etc/default/cloudflared
ExecStart=/usr/local/bin/cloudflared proxy-dns $CLOUDFLARED_OPTS
Restart=on-failure
RestartSec=10
KillMode=process
[Install]
WantedBy=multi-user.target
Démarrer cloudflared :
systemctl enable cloudflared
systemctl start cloudflared
systemctl status cloudflared
Voila ! une bonne chose de faite !
Configuration Unbound avec Cloudflared (DoT)
On va configurer unbound pour utiliser cloudflared.
nano /etc/unbound/unbound.conf.d/unbound.conf
et collez ça dedans :
server:
# The verbosity number, level 0 means no verbosity, only errors.
# Level 1 gives operational information. Level 2 gives detailed
# operational information. Level 3 gives query level information,
# output per query. Level 4 gives algorithm level information.
# Level 5 logs client identification for cache misses. Default is
# level 1.
verbosity: 0
interface: 127.0.0.1
port: 53
do-ip4: yes
do-udp: yes
do-tcp: yes
# May be set to yes if you have IPv6 connectivity
do-ip6: no
# You want to leave this to no unless you have *native* IPv6. With 6to4 and
# Terredo tunnels your web browser should favor IPv4 for the same reasons
prefer-ip6: no
# Use this only when you downloaded the list of primary root servers!
# Read the root hints from this file. Make sure to
# update root.hints evry 5-6 months.
root-hints: "/var/lib/unbound/root.hints"
# Trust glue only if it is within the servers authority
harden-glue: yes
# Ignore very large queries.
harden-large-queries: yes
# Require DNSSEC data for trust-anchored zones, if such data is absent, the zone becomes BOGUS
# If you want to disable DNSSEC, set harden-dnssec stripped: no
harden-dnssec-stripped: yes
# Number of bytes size to advertise as the EDNS reassembly buffer
# size. This is the value put into datagrams over UDP towards
# peers. The actual buffer size is determined by msg-buffer-size
# (both for TCP and UDP).
edns-buffer-size: 1232
# Rotates RRSet order in response (the pseudo-random
# number is taken from Ensure privacy of local IP
# ranges the query ID, for speed and thread safety).
# private-address: 192.168.0.0/16
rrset-roundrobin: yes
# Time to live minimum for RRsets and messages in the cache. If the minimum
# kicks in, the data is cached for longer than the domain owner intended,
# and thus less queries are made to look up the data. Zero makes sure the
# data in the cache is as the domain owner intended, higher values,
# especially more than an hour or so, can lead to trouble as the data in
# the cache does not match up with the actual data anymore
cache-min-ttl: 300
cache-max-ttl: 86400
# Have unbound attempt to serve old responses from cache with a TTL of 0 in
# the response without waiting for the actual resolution to finish. The
# actual resolution answer ends up in the cache later on.
serve-expired: yes
# Harden against algorithm downgrade when multiple algorithms are
# advertised in the DS record.
harden-algo-downgrade: yes
# Ignore very small EDNS buffer sizes from queries.
harden-short-bufsize: yes
# Refuse id.server and hostname.bind queries
hide-identity: yes
# Report this identity rather than the hostname of the server.
identity: "Server"
# Refuse version.server and version.bind queries
hide-version: yes
# Prevent the unbound server from forking into the background as a daemon
do-daemonize: no
# Number of bytes size of the aggressive negative cache.
neg-cache-size: 4M
# Send minimum amount of information to upstream servers to enhance privacy
qname-minimisation: yes
# Deny queries of type ANY with an empty response.
# Works only on version 1.8 and above
deny-any: yes
# Do no insert authority/additional sections into response messages when
# those sections are not required. This reduces response size
# significantly, and may avoid TCP fallback for some responses. This may
# cause a slight speedup
minimal-responses: yes
# Perform prefetching of close to expired message cache entries
# This only applies to domains that have been frequently queried
# This flag updates the cached domains
prefetch: yes
# Fetch the DNSKEYs earlier in the validation process, when a DS record is
# encountered. This lowers the latency of requests at the expense of little
# more CPU usage.
prefetch-key: yes
# One thread should be sufficient, can be increased on beefy machines. In reality for
# most users running on small networks or on a single machine, it should be unnecessary
# to seek performance enhancement by increasing num-threads above 1.
num-threads: 1
# more cache memory. rrset-cache-size should twice what msg-cache-size is.
msg-cache-size: 50m
rrset-cache-size: 100m
# Faster UDP with multithreading (only on Linux).
so-reuseport: yes
# Ensure kernel buffer is large enough to not lose messages in traffix spikes
so-rcvbuf: 4m
so-sndbuf: 4m
# Set the total number of unwanted replies to keep track of in every thread.
# When it reaches the threshold, a defensive action of clearing the rrset
# and message caches is taken, hopefully flushing away any poison.
# Unbound suggests a value of 10 million.
unwanted-reply-threshold: 100000
# Minimize logs
# Do not print one line per query to the log
log-queries: no
# Do not print one line per reply to the log
log-replies: no
# Do not print log lines that say why queries return SERVFAIL to clients
log-servfail: no
# Do not print log lines to inform about local zone actions
log-local-actions: no
# Do not print log lines that say why queries return SERVFAIL to clients
logfile: /dev/null
# Ensure privacy of local IP ranges
private-address: 192.168.0.0/16
private-address: 169.254.0.0/16
private-address: 172.16.0.0/12
private-address: 10.0.0.0/8
private-address: fd00::/8
private-address: fe80::/10
# CLOUDFLARE SETTINGS
server:
tls-cert-bundle: /etc/ssl/certs/ca-certificates.crt
forward-zone:
name: "."
forward-tls-upstream: yes
# Cloudflare DNS
forward-addr: 2606:4700:4700::1111@853#cloudflare-dns.com
forward-addr: 1.1.1.1@853#cloudflare-dns.com
forward-addr: 2606:4700:4700::1001@853#cloudflare-dns.com
forward-addr: 1.0.0.1@853#cloudflare-dns.com
# ADBLOCKING
server:
local-zone: "doubleclick.net" static
local-zone: "googlesyndication.com" static
local-zone: "googleadservices.com" static
local-zone: "google-analytics.com" static
local-zone: "ads.youtube.com" static
local-zone: "adserver.yahoo.com" static
local-zone: "ad-mediation.tuanguwen.com" static
local-zone: "ad.adsrvr.org" static
local-zone: "ad.doubleclick.net" static
local-zone: "ad.lkqd.net" static
local-zone: "adc-ad-assets.adtilt.com" static
local-zone: "admarvel-d.openx.net" static
local-zone: "admediator.unityads.unity3d.com" static
local-zone: "adproxy.fyber.com" static
local-zone: "ads-roularta.adhese.com" static
local-zone: "ads-secure.videohub.tv" static
local-zone: "ads.adadapted.com" static
local-zone: "ads.adecosystems.net" static
local-zone: "ads.admarvel.com" static
local-zone: "ads.api.vungle.com" static
local-zone: "ads.flurry.com" static
local-zone: "ads.heyzap.com" static
local-zone: "ads.mopub.com" static
local-zone: "ads.nexage.com" static
local-zone: "ads.superawesome.tv" static
local-zone: "adtrack.king.com" static
local-zone: "adwatch.appodeal.com" static
local-zone: "amazon-adsystem.com" static
local-zone: "adcolony.com" static
local-zone: "api.salmonads.com" static
local-zone: "app.adjust.com" static
local-zone: "init.supersonicads.com" static
local-zone: "live.chartboost.com" static
local-zone: "marketing-ssl.upsight-api.com" static
local-zone: "track.appsflyer.com" static
local-zone: "ws.tapjoyads.com" static
local-zone: "telemetry.microsoft.com" static
local-zone: "data.microsoft.com" static
Configuration d'Adguard avec Unbound & Cloudflared (DoT&DoH)
Plus qu'à configurer Adguard.
Dans Adguard, allez sur Paramètres -> Paramètres DNS
Maintenant on efface la totalité de la case Serveurs DNS upstream :
Et on remplace par
127.0.0.1:53
127.0.0.1:5053
Et on coche "Demandes en parallèle".
Pareil pour les Serveurs DNS d'amorçage:
on efface et on remplace par
127.0.0.1:53
127.0.0.1:5053
On continue plus bas,
On remplace la valeur dans la case Taille du cache par 0 pour la désactiver.
Et on enregistre les configurations.
Plus qu'à
service unbound restart
Connexion au vpn et vérification
Bon maintenant que tout ça est installer, plus qu'à se connecter.
On va partir du principe que vous avez scanner le qrcode depuis votre smartphone, et donc activer la connexion wireguard.
Plus qu'à vous rendre sur https://1.1.1.1/help
Et si après le checking vous avez cette écran :
C'est que c'est bon !
Pour pousser le bouchon un peu plus loin et être sur que c'est bien adguard de votre vpn qui répond, en local sur un terminal :
dig -t -A google.fr
Nous montres bien que la requete DNS passe par 10.7.0.1.
Tadaa !!!
Bonne lecture.
Matt