Première rédaction de cet article le 5 août 2023
Vous le savez, l'Internet n'est pas un long fleuve tranquille. Il y a des pannes, des attaques, des erreurs… La vie des administrateurs système et réseau est donc rarement ennuyeuse. Ainsi, aujourd'hui, deux domaines importants ont eu des problèmes. Plongeons-nous un peu dans le DNS et ses particularités.
Premier domaine touché, gouv.nc, le domaine
  du gouvernement néo-calédonien. Des
  utilisateurs se plaignent qu'ils n'arrivent pas à accéder aux
  services sous ce nom, ni à ceux sous des noms hébergés sur les mêmes
  serveurs, comme prix.nc. Voyons (avec check-soa)
  les serveurs faisant
  autorité pour ce domaine :
  
% check-soa -i gouv.nc ns4.gouv.nc. 61.5.212.4: OK: 2020111850 (293 ms) ns5.gouv.nc. 61.5.212.5: OK: 2020111850 (293 ms)
Ici, tout marche. Mais ce n'est pas le cas tout le temps, on observe de nombreux timeouts :
% check-soa -i gouv.nc ns4.gouv.nc. 61.5.212.4: ERROR: read udp 192.168.2.4:33577->61.5.212.4:53: i/o timeout ns5.gouv.nc. 61.5.212.5: ERROR: read udp 192.168.2.4:41598->61.5.212.5:53: i/o timeout
On le voit aussi en utilisant les sondes RIPE Atlas (via le programme Blaeu) :
% blaeu-resolve --type A --requested 100 gouv.nc [ERROR: SERVFAIL] : 40 occurrences [61.5.212.17] : 22 occurrences Test #58257507 done at 2023-08-05T18:32:26Z
  Pourquoi ce problème ? De l'extérieur, je ne peux évidemment pas
  donner de réponse définitive mais j'observe déjà que ce domaine n'a
  que deux serveurs de noms, ce qui est souvent insuffisant, et que la
  proximité de leurs adresses
  IP fait fortement soupçonner qu'ils sont dans la même
  pièce, formant un SPOF. Y a-t-il eu une panne complète, par
  exemple une coupure de courant dans cette pièce ? Comme on observe
  que ces serveurs répondent parfois, on peut écarter cette hypothèse
  et penser plutôt, soit à une dégradation importante du réseau
  (réseau surchargé, ou bien physiquement abimé), soit à une
  attaque par déni de service. Ces attaques,
  sous leur forme la plus simple, volumétrique (l'attaquant envoie
  simplement le plus possible de requêtes), saturent le réseau ou les
  serveurs. Dans ce cas, les serveurs répondent encore parfois, mais
  pas toujours. Comme le problème a été souvent observé ces derniers
  mois, et que le domaine gouv.nc a les
  mêmes caractéristiques (domaine d'un service public français, et
  hébergement DNS très faible), il n'est pas impossible qu'il soit
  victime de la même campagne d'attaques.
Et le deuxième domaine ? C'est
  impots.gouv.fr, qui a lui aussi les mêmes
  caractéristiques, quoique moins marquées, et qui faisait déjà partie
  des victimes précédentes.
% check-soa impots.gouv.fr dns1.impots.gouv.fr. 145.242.11.22: ERROR: read udp 192.168.2.4:35263->145.242.11.22:53: i/o timeout dns2.impots.gouv.fr. 145.242.31.9: OK: 2023080400
Et, avec les sondes Atlas :
% blaeu-resolve --type A --requested 100 --country FR impots.gouv.fr [145.242.11.100] : 55 occurrences [ERROR: SERVFAIL] : 14 occurrences Test #58257393 done at 2023-08-05T18:25:42Z
On notera que gouv.nc a une autre
  caractéristique, que n'a pas le domaine des impôts : les
  TTL sont très bas. On le voit avec
  dig :
% dig @61.5.212.4 gouv.nc A ;; communications error to 61.5.212.4#53: timed out ;; communications error to 61.5.212.4#53: timed out ... ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2499 ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3 ... ;; ANSWER SECTION: gouv.nc. 30 IN A 61.5.212.17 ;; AUTHORITY SECTION: gouv.nc. 300 IN NS ns4.gouv.nc. gouv.nc. 300 IN NS ns5.gouv.nc. ... ;; Query time: 292 msec ;; SERVER: 61.5.212.4#53(61.5.212.4) (UDP)
  Le TTL pour l'adresse IP associée à gouv.nc est
  de seulement 30 secondes. Cela veut dire que, même si un client DNS,
  comme un résolveur a de la chance et
  réussit à obtenir une réponse d'un des serveurs faisant autorité,
  elle ne lui servira que pendant trente secondes, suite auxquelles il
  devra retenter sa chance, avec une forte probabilité que ça
  rate. C'est en effet un des plus gros inconvénients des TTL
  extrêmement bas, comme ceux-ci : ils aggravent considérablement les
  effets des dénis de service. Les variations d'une mesure à l'autre
  sont donc bien plus marquées pour gouv.nc que
  pour impots.gouv.fr.
Le TTL des enregistrements NS (serveurs de noms) est plus long
  (cinq minutes). Notez que celui affiché ci-dessus est le TTL indiqué
  par les serveurs faisant autorité, celui de la zone
  gouv.nc elle-même. Il y a un autre TTL (une
  heure) dans la délégation depuis
  .nc, dans la zone
  parente :
% dig @ns1.nc gouv.nc A ... ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30267 ;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 6, ADDITIONAL: 3 ... ;; AUTHORITY SECTION: gouv.nc. 3600 IN NS ns4.gouv.nc. gouv.nc. 3600 IN NS ns5.gouv.nc.
  La plupart des résolveurs enregistreront le TTL de la zone (ici,
  cinq minutes), qui, lui, fait autorité (regardez le flag
  aa - Authoritative Answer -
  dans la réponse).
  
Pour mieux évaluer l'état d'un serveur de noms (résolveur ou serveur faisant autorité) lors d'un problème comme une attaque par déni de service, j'ai fait un petit script en Python simple qui interroge le serveur plusieurs fois et affiche le taux de réussite :
% python assess-dos.py --server 145.242.31.9 impots.gouv.fr Expect an answer in more or less 300.0 seconds 2 requests among 10 (20.0 %) succeeded. Average time 0.010 s. Measurement done on 2023-08-05T18:46:30Z.
Le script dispose de plusieurs options utiles (pour l'instant, sa seule documentation est le code source) : le nombre de requêtes à faire, l'écart entre deux requêtes, la gigue à ajouter, le délai d'attente maximum, le serveur à utiliser (par défaut, c'est le résolveur habituel de votre machine), le type d'enregistrement DNS à demander, etc. Voici un exemple pendant le problème, utilisant de nombreuses options :
% python assess-dos.py --number 118 --delay 30.1 --server 145.242.31.9 --jitter 6 --type a impots.gouv.fr Expect an answer in more or less 3551.8 seconds 0 requests among 118 (0.0 %) succeeded. Average time N/A. Measurement done on 2023-08-05T18:00:16Z.
  Ici, le serveur de impots.gouv.fr ne répondait
  pas du tout pendant la mesure.
  
% python assess-dos.py --number 118 --delay 30.1 --server 61.5.212.4 --jitter 6 --type a gouv.nc Expect an answer in more or less 3551.8 seconds 19 requests among 118 (16.1 %) succeeded. Average time 0.3 s. Measurement done on 2023-08-05T17:56:51Z.
  Ici, le serveur de gouv.nc répondait encore
  dans 16 % des cas. C'est très insuffisant, la plupart des
  résolveurs ne réessaient que trois, quatre ou cinq fois.
Dans le tout premier exemple, on n'avait pas indiqué de serveur, dans ce cas, c'est le résolveur par défaut qui est utilisé. Comme il mémorise les réponses, il vaut mieux indiquer un délai qui soit supérieur au TTL :
% python assess-dos.py --number 113 --delay 30.1 --type a gouv.nc Expect an answer in more or less 3401.3 seconds 62 requests among 113 (54.9 %) succeeded. Average time 0.350 s. Measurement done on 2023-08-05T18:57:25Z.
Traditionnellement, les résolveurs DNS ne renvoyaient guère d'information à leur client en cas d'échec, on était loin de la richesse des codes de retour HTTP. Mais cela a changé avec EDE, les Extended DNS Errors du RFC 8914. Demandons au résolveur de Google, on obtient bien le code EDE 22 et une explication :
% dig @8.8.8.8 gouv.nc A ...;; ->>HEADER<<- opcode: QUERY, status: SERVFAIL, id: 26442 ;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1 ... ; EDE: 22 (No Reachable Authority): (At delegation gouv.nc for gouv.nc/a) ...
Version PDF de cette page (mais vous pouvez aussi imprimer depuis votre navigateur, il y a une feuille de style prévue pour cela)
Source XML de cette page (cette page est distribuée sous les termes de la licence GFDL)