Projet

Général

Profil

Wiki » Historique » Révision 16

Révision 15 (sacha, 26/12/2022 14:34) → Révision 16/35 (sacha, 26/12/2022 19:35)

{{>toc}} 

 # DNS récursif Ouvert DoH DoT & haute disponibilité 
 **45.67.81.23 - dns.aquilenet.fr** 



 


 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/ 
 ~~~ 

 ### Clée sdns (auth par épinglage de la clé / key pining) 

 * A partir de la clé 
 ~~~ 
 hades|19:21:08|:~# openssl rsa -in /etc/letsencrypt/live/dns.aquilenet.fr/privkey.pem -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64 
 writing RSA key 
 lBk09CRIPJ+J4O9rmbvJkEiGYoH5r9rxOIQdxkYxyII= 
 ~~~ 
 * ou à partir du certificat 
 ~~~ 
 hades|19:22:21|:~# openssl x509 -in /etc/letsencrypt/live/dns.aquilenet.fr/cert.pem -pubkey -noout | openssl rsa -pubin -outform der | openssl dgst -sha256 -binary | openssl enc -base64 
 writing RSA key 
 lBk09CRIPJ+J4O9rmbvJkEiGYoH5r9rxOIQdxkYxyII= 
 ~~~ 

 ### 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 +short dns.aquilenet.fr @45.67.81.23  
 45.67.81.23 
 dig +https +short dns.aquilenet.fr @45.67.81.23       
 45.67.81.23 
 dig +tls +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 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/ 

 ## Ressources 

 https://www.bortzmeyer.org/doh-bortzmeyer-fr-policy.html 
 https://www.bortzmeyer.org/7858.html 
 https://kb.isc.org/docs/aa-01386