Wiki » Historique » Révision 11
Révision 10 (sacha, 26/12/2022 01:18) → Révision 11/35 (sacha, 26/12/2022 01:32)
{{>toc}}
# DNS récursif Ouvert DoH DoT & haute disponibilité
Aquilenet propose deux serveurs DNS ouverts cf https://www.aquilenet.fr/services/dns/
On a mis aussi un DNS ouvert sur l'IP 45.67.81.23 car facile à retenir, avec l'adresse de dns.aquilenet.fr (voir [http://dns.aquilenet.fr](http://dns.aquilenet.fr)) . Nous en avons profité pour ajouter [DoH](https://fr.wikipedia.org/wiki/DNS_over_HTTPS) et [DoT](https://fr.wikipedia.org/wiki/DNS_over_TLS) et d'avoir cette adresse en IP Virtuelle partagée entre Gaia et Hades.
Cette IP virtuelle est portée par Keepalived sur Hades le primaire et Gaia le secondaire. Si le démon Keepalived est arrêté sur Hades, l'ip bascule sur Gaia. Si on redémarre le démon sur Hades, ce dernier reprend l'IP: pratique pour les mises à jour, le service continue à fonctionner.
Une configuration spécifique pour l'ip de ce vlan a été fait sur les switches et les hyperviseurs, ce qui permet au final à Hades et Gaia d'avoir une seconde interface qui porte l'IP virtuelle, elle n'est pas abordée dans ce document.
## Configurations communes à Gaia et Hades
### Apache2
* /etc/apache2/ports.conf
Pour que l'ip 45.67.81.23 puisse répondre en http sur le port 80 et que les autres sites fonctionnent en 443 sur l'ip de d'hades/gaia
~~~
Listen 80
NameVirtualHost 185.233.100.2:443
NameVirtualHost [2a0c:e300::2]:443
<IfModule ssl_module>
Listen 185.233.100.2:443
Listen [2a0c:e300::2]:443
</IfModule>
<IfModule mod_gnutls.c>
Listen 185.233.100.2:443
Listen [2a0c:e300::2]:443
</IfModule>
~~~
* /etc/apache2/sites-enabled/dns.aquilenet.fr.conf
~~~
<VirtualHost *:80>
ServerAdmin webmaster@aquilenet.fr
ServerName dns.aquilenet.fr
DocumentRoot /srv/www/dns.aquilenet.fr
ErrorLog ${APACHE_LOG_DIR}/dns.aqln.error.log
LogLevel warn
CustomLog ${APACHE_LOG_DIR}/dns.aqln.access.log combined
Alias /.well-known/acme-challenge /srv/letsencrypt/challenges/dns.aquilenet.fr
<Directory /srv/letsencrypt/challenges/dns.aquilenet.fr>
Require all granted
</Directory>
<Directory />
Options FollowSymLinks
AllowOverride None
Require all granted
</Directory>
</VirtualHost>
~~~
### Bind9
BIND 9.17.10 implémente DoH, au jour de l'installation il n'est disponible que dans les backports bullseye (A changer quand il sera dans main).
https://www.isc.org/blogs/bind-implements-doh-2021/
* /etc/bind/named.conf.options
Dans la catégorie "options {"
~~~
listen-on-v6 { 2a0c:e300::101; };
listen-on { 185.233.100.101; 45.67.81.23; };
# DOH
listen-on port 443 tls local-tls http default { 45.67.81.23; };
# DoT
listen-on port 853 tls local-tls { 45.67.81.23; };
recursion yes;
dnssec-validation auto;
~~~
~~~
# DoH DoT
tls local-tls {
key-file "/etc/letsencrypt/live/dns.aquilenet.fr/privkey.pem";
cert-file "/etc/letsencrypt/live/dns.aquilenet.fr/fullchain.pem";
dhparam-file "/etc/bind/dhparam.pem";
protocols { TLSv1.2; TLSv1.3; };
prefer-server-ciphers yes;
session-tickets no;
};
~~~
### AppArmor
* /etc/apparmor.d/local/usr.sbin.named
~~~
/etc/letsencrypt/** r,
~~~
appliquer avec: `apparmor_parser -r /etc/apparmor.d/usr.sbin.named`
### Iptables
~~~
# Web
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
~~~
~~~
-A INPUT -d 45.67.81.23 -p tcp -m tcp --dport 53 -j dns_limit
-A INPUT -d 45.67.81.23 -p udp -m udp --dport 53 -j dns_limit
-A INPUT -d 45.67.81.23 -p tcp -m tcp --dport 443 -j dns_limit
-A INPUT -d 45.67.81.23 -p tcp -m tcp --dport 853 -j dns_limit
~~~
## Configurations spécifiques
### Génération du certificat SSL sur Hades
~~~
certbot --apache --agree-tos --email sysop@aquilenet.fr -d dns.aquilenet.fr
chgrp bind /etc/letsencrypt/live/dns.aquilenet.fr/privkey.pem
chmod 0640 /etc/letsencrypt/live/dns.aquilenet.fr/privkey.pem
openssl dhparam -out /etc/bind/dhparam.pem 4096
~~~
Copie du certificat sur gaia
* /etc/letsencrypt/renewal-hooks/post/sync-cert.sh
~~~
#!/bin/bash
rsync -aPHSA /etc/letsencrypt/archive/dns.aquilenet.fr gaia:/etc/letsencrypt/archive/
~~~
### Keepalived
#### Hades Master
* /etc/keepalived/keepalived.conf
~~~
global_defs {
notification_email {
sysop@aquilenet.fr
}
notification_email_from vrrp-dns@aquilenet.fr.fr
smtp_server localhost
smtp_connect_timeout 30
}
vrrp_instance DNS {
state MASTER
interface eth0
virtual_router_id 101
priority 100
advert_int 2
smtp_alert
unicast_src_ip 185.233.100.16
unicast_peer {
185.233.100.2
}
virtual_ipaddress {
45.67.81.23/32 dev eth1 scope global # VIP
}
}
~~~
#### Gaia Slave
* /etc/keepalived/keepalived.conf
~~~
global_defs {
notification_email {
sysop@aquilenet.fr
}
notification_email_from vrrp-dns@aquilenet.fr.fr
smtp_server localhost
smtp_connect_timeout 30
}
vrrp_instance DNS {
state BACKUP
interface eth0
virtual_router_id 101
priority 50
advert_int 2
smtp_alert
unicast_src_ip 185.233.100.2
unicast_peer {
185.233.100.16
}
virtual_ipaddress {
45.67.81.23/32 dev eth1 scope global # VIP
}
}
~~~
## Validation
* test du service
~~~
dig +https +short x.org @45.67.81.23
131.252.210.176
dig +tls +short x.org @45.67.81.23
131.252.210.176
dig +short dns.aquilenet.fr @45.67.81.23
45.67.81.23
~~~
* bascule keepalived
sur hades: `systemctl stop keepalived`
sur gaia: `ip a |grep /32`doit donner "inet 45.67.81.23/32 scope global eth1"
http://dns.aquilenet.fr/host permet de savoir sur quel est le serveur qui porte l'IP virtuelle
## Indexes de serveurs DNS ouverts:
https://github.com/curl/curl/wiki/DNS-over-HTTPS#publicly-available-servers <= fait
https://diyisp.org/dokuwiki/doku.php?id=technical:dnsresolver <= fait
https://diyisp.org/dokuwiki/doku.php?id=technical:dnsresolver <= fait
https://dnsprivacy.org/public_resolvers/