Projet

Général

Profil

Wiki » Historique » Version 17

sacha, 26/12/2022 19:54

1 5 sacha
{{>toc}}
2
3 9 sacha
# DNS récursif Ouvert DoH DoT & haute disponibilité
4 15 sacha
**45.67.81.23 - dns.aquilenet.fr**
5 14 sacha
6 1 sacha
7 16 sacha
8 1 sacha
Aquilenet propose deux serveurs DNS ouverts cf https://www.aquilenet.fr/services/dns/
9 4 sacha
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.
10
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.
11 1 sacha
12 7 sacha
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.
13 6 sacha
14 3 sacha
## Configurations communes à Gaia et Hades
15 1 sacha
16 3 sacha
### Apache2
17 6 sacha
18
* /etc/apache2/ports.conf
19
20
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
21
~~~
22
Listen 80
23
NameVirtualHost 185.233.100.2:443
24
NameVirtualHost [2a0c:e300::2]:443
25
<IfModule ssl_module>
26
        Listen 185.233.100.2:443
27
        Listen [2a0c:e300::2]:443
28
</IfModule>
29
30
<IfModule mod_gnutls.c>
31
        Listen 185.233.100.2:443
32
        Listen [2a0c:e300::2]:443
33
</IfModule>
34
~~~
35 1 sacha
36
* /etc/apache2/sites-enabled/dns.aquilenet.fr.conf 
37
~~~
38
<VirtualHost *:80>
39
        ServerAdmin webmaster@aquilenet.fr
40
        ServerName dns.aquilenet.fr
41
        DocumentRoot /srv/www/dns.aquilenet.fr 
42
43
        ErrorLog ${APACHE_LOG_DIR}/dns.aqln.error.log 
44
        LogLevel warn
45
        CustomLog ${APACHE_LOG_DIR}/dns.aqln.access.log combined
46
47
        Alias /.well-known/acme-challenge /srv/letsencrypt/challenges/dns.aquilenet.fr
48
        <Directory /srv/letsencrypt/challenges/dns.aquilenet.fr>
49
            Require all granted
50
        </Directory>
51
        <Directory />
52
                Options FollowSymLinks 
53
                AllowOverride None
54
                Require all granted
55
        </Directory>
56
</VirtualHost>
57
~~~
58
59 3 sacha
### Bind9
60 1 sacha
61
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).
62 9 sacha
https://www.isc.org/blogs/bind-implements-doh-2021/
63 1 sacha
64
* /etc/bind/named.conf.options
65
66
 Dans la catégorie "options {"
67
~~~
68
        listen-on-v6 { 2a0c:e300::101; };
69
        listen-on { 185.233.100.101; 45.67.81.23; };
70
        # DOH
71
        listen-on port 443 tls local-tls http default { 45.67.81.23; };
72
        # DoT
73
        listen-on port 853 tls local-tls { 45.67.81.23; };
74
        recursion yes;
75
        dnssec-validation auto;
76
~~~
77
78
~~~
79
# DoH DoT
80
tls local-tls {
81
    key-file "/etc/letsencrypt/live/dns.aquilenet.fr/privkey.pem";
82
    cert-file "/etc/letsencrypt/live/dns.aquilenet.fr/fullchain.pem";
83
    dhparam-file "/etc/bind/dhparam.pem";
84
    protocols { TLSv1.2; TLSv1.3; };
85
    prefer-server-ciphers yes;
86
    session-tickets no;
87
};
88
~~~
89
90 3 sacha
### AppArmor
91 1 sacha
92
*  /etc/apparmor.d/local/usr.sbin.named
93
94
~~~
95
/etc/letsencrypt/** r,
96
~~~
97
appliquer avec: `apparmor_parser -r /etc/apparmor.d/usr.sbin.named`
98 7 sacha
99
### Iptables
100
101
~~~
102
# Web
103
-A INPUT -p tcp --dport 80 -j ACCEPT
104
-A INPUT -i eth0 -p tcp --dport 443 -j ACCEPT
105
~~~
106
~~~
107
-A INPUT -d 45.67.81.23 -p tcp -m tcp --dport 53 -j dns_limit
108
-A INPUT -d 45.67.81.23 -p udp -m udp --dport 53 -j dns_limit
109
-A INPUT -d 45.67.81.23 -p tcp -m tcp --dport 443 -j dns_limit
110
-A INPUT -d 45.67.81.23 -p tcp -m tcp --dport 853 -j dns_limit
111
~~~
112 3 sacha
113
## Configurations spécifiques
114
115
### Génération du certificat SSL sur Hades
116
117
~~~
118
certbot --apache --agree-tos --email sysop@aquilenet.fr -d dns.aquilenet.fr
119
chgrp bind /etc/letsencrypt/live/dns.aquilenet.fr/privkey.pem
120
chmod 0640 /etc/letsencrypt/live/dns.aquilenet.fr/privkey.pem
121
openssl dhparam -out /etc/bind/dhparam.pem 4096
122
~~~
123
124
Copie du certificat sur gaia
125
126
* /etc/letsencrypt/renewal-hooks/post/sync-cert.sh
127
~~~
128
#!/bin/bash
129
rsync -aPHSA /etc/letsencrypt/archive/dns.aquilenet.fr gaia:/etc/letsencrypt/archive/
130
~~~
131
132 16 sacha
### Clée sdns (auth par épinglage de la clé / key pining)
133
134
* A partir de la clé
135
~~~
136
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
137
writing RSA key
138
lBk09CRIPJ+J4O9rmbvJkEiGYoH5r9rxOIQdxkYxyII=
139
~~~
140
* ou à partir du certificat
141
~~~
142
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
143
writing RSA key
144
lBk09CRIPJ+J4O9rmbvJkEiGYoH5r9rxOIQdxkYxyII=
145
~~~
146
147 3 sacha
### Keepalived
148
149
#### Hades Master
150
151
* /etc/keepalived/keepalived.conf
152
153
~~~
154
global_defs {
155
  notification_email {
156
    sysop@aquilenet.fr
157
  }
158
  notification_email_from vrrp-dns@aquilenet.fr.fr
159
  smtp_server localhost
160
  smtp_connect_timeout 30
161
}
162
163
vrrp_instance DNS {
164
  state MASTER 
165
  interface eth0
166
  virtual_router_id 101 
167
  priority 100
168
  advert_int 2
169
  smtp_alert
170
  unicast_src_ip 185.233.100.16 
171
  unicast_peer {
172
    185.233.100.2
173
  }
174
  virtual_ipaddress {
175
    45.67.81.23/32 dev eth1 scope global # VIP
176
  }
177
}
178
~~~
179
180
#### Gaia Slave
181
182
* /etc/keepalived/keepalived.conf
183
184
~~~
185
global_defs {
186
  notification_email {
187
    sysop@aquilenet.fr
188
  }
189
  notification_email_from vrrp-dns@aquilenet.fr.fr
190
  smtp_server localhost
191
  smtp_connect_timeout 30
192
}
193
194
vrrp_instance DNS {
195
  state BACKUP
196
  interface eth0
197
  virtual_router_id 101
198
  priority 50
199
  advert_int 2
200
  smtp_alert
201
  unicast_src_ip 185.233.100.2
202
  unicast_peer {
203
    185.233.100.16
204
  }
205
  virtual_ipaddress {
206
    45.67.81.23/32 dev eth1 scope global # VIP
207
  }
208
}
209
210 1 sacha
~~~
211 4 sacha
212
## Validation
213
214
* test du service
215
~~~
216 1 sacha
dig +short dns.aquilenet.fr @45.67.81.23 
217 13 sacha
45.67.81.23
218
dig +https +short dns.aquilenet.fr @45.67.81.23      
219
45.67.81.23
220
dig +tls +short dns.aquilenet.fr @45.67.81.23      
221 8 sacha
45.67.81.23
222 4 sacha
~~~
223
224
* bascule keepalived
225 8 sacha
226
sur hades: `systemctl stop keepalived`
227 1 sacha
sur gaia: `ip a |grep /32`doit donner "inet 45.67.81.23/32 scope global eth1"
228 12 sacha
http://dns.aquilenet.fr/host permet de savoir quel est le serveur qui porte l'IP virtuelle
229 9 sacha
230
## Indexes de serveurs DNS ouverts:
231
232
https://github.com/curl/curl/wiki/DNS-over-HTTPS#publicly-available-servers <= fait
233 10 sacha
https://diyisp.org/dokuwiki/doku.php?id=technical:dnsresolver <= fait
234
https://diyisp.org/dokuwiki/doku.php?id=technical:dnsresolver <= fait
235 9 sacha
https://dnsprivacy.org/public_resolvers/
236 16 sacha
237 17 sacha
## Ressources
238 16 sacha
239
https://www.bortzmeyer.org/doh-bortzmeyer-fr-policy.html
240
https://www.bortzmeyer.org/7858.html
241
https://kb.isc.org/docs/aa-01386