Requête DNS
Une requête DNS est inscrite dans le champ "Requête" de la tâche sous le format :
dns:[//<server>[:<port>]/]<domaine>[?<type>]
où :
– server : (facultatif) URL d’un serveur DNS particulier.
– domain (obligatoire) : le domaine de l’enregistrement dans la zone DNS.
– type : (facultatif, A) le type d’enregistrement dans la zone DNS du domaine : A, AAAA, CNAME, MX, NS, SOA, SPF, TXT. Si ce paramètre n’est pas compris, une erreur sera générée.
exemples :
dns:buy.dnc.global
dns:dnc.global?NS
dns://dns102.ovh.net/buy.dnc.global
dns:degoy.com?A
dns:degoy.com?AAAA
dns://dns200.anycast.me/degoy.com?AAAA
dns:degoy.com?MX
dns://ns-219-a.gandi.net/www.spip.net
dns://1.1.1.1/dnc.global /* Cloudflare resolver */
dns://8.8.8.8/dnc.global /* Google resolver */
dns://213.186.33.99/dnc.global?AAAA /* OVH resolver France*/
dns://5.196.123.133/dnc.global?AAAA /* OVH resolver, Spain */
dns://193.252.10.2/dnc.global /* Orange, Aubervilliers, France */
NSS émet la requête DNS sous la forme d’une commande Unix/Linux DIG de la forme suivante :
dig [<type> ][@server[:port] ] <domaine>
Par exemple la réponse à la requête dns:degoy.com?MX
sera traduite en :
dig MX degoy.com
.
Dans la plupart des cas, il vous suffira d’inscrire une requête DNS dans le champ "Requête" de la tâche comme indiqué ci-dessus. Ne lisez la suite que si vous souhaitez analyser la réponse du DNS au-delà des règles par défaut.
Réponse
Si la requête réussit, NSS analyse la réponse retournée par DIG.
Voici par exemple la réponse à la requête dns:degoy.com ?MX (traduite en dig MX degoy.com) :
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.68.rc1.el6_10.7 <<>> MX degoy.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 36151
;; flags: qr rd ra; QUERY: 1, ANSWER: 6, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;degoy.com. IN MX
;; ANSWER SECTION:
degoy.com. 600 IN MX 5 mx1.mail.ovh.net.
degoy.com. 600 IN MX 100 mx3.mail.ovh.net.
degoy.com. 600 IN MX 1 mx0.mail.ovh.net.
degoy.com. 600 IN MX 200 mail.rollernet.us.
degoy.com. 600 IN MX 200 mail2.rollernet.us.
degoy.com. 600 IN MX 50 mx2.mail.ovh.net.
;; Query time: 11 msec
;; SERVER: 213.186.33.99#53(213.186.33.99)
;; WHEN: Tue Sep 1 17:22:07 2020
;; MSG SIZE rcvd: 174
En cas d’échec, NSS enregistrera une erreur.
Règles implicites et par défaut
La réponse attendue par NSS à la suite d’une requête DNS figure dans le champ "Règles" de la tâche. Ce champ est facultatif. Qu’il soit renseigné ou non, des règles implicites s’appliquent :
status : NOERROR : NSS vérifie que la réponse du DNS comporte "status : NOERROR". Dans le cas contraire, une alerte de niveau 5 au moins est générée.
Temps de réponse : NSS surveille toujours le temps de réponse par rapport au délai moyen constaté pour la tâche.
Une alerte est générée avec un niveau égal à 2, ou le niveau indiqué dans la définition de la tâche, si le temps de réponse excède 4 fois le délai moyen.
Pour plus de détails sur ce sujet, voyez : Surveillance du temps de réponse.
Règles par défaut : de plus, si le champ règle n’est pas renseigné, NSS applique les règles suivantes, supposant une réponse attendue dans un délai inférieur à 50 ms :
TIME<50:3
TIME<100:4
TIME<500:5
Ces règles permettent déjà d’effectuer une surveillance efficace sans avoir à attribuer des règles à la tâche. Ainsi la simple requête :
dns://ns-219-a.gandi.net/www.spip.net
permet de surveiller la résolution du nom de domaine www.spip.net par un de ses serveurs DNS faisant autorité.
Règles applicables à la requête DNS
– TIME< nombre de ms : Vérifie que le serveur retourne la réponse dans un délai inférieur à la valeur indiquée en ms.
– MEAN< nombre de ms : Vérifie que le serveur retourne la réponse dans un délai moyen inférieur à la valeur indiquée en ms.
– IPV4= NNN.NNN.NNN.NNN : la règle la plus essentielle, permettant de vérifier que le nom de domaine indiqué dans la requête DNS est résolu et égal à l’adresse IPv4 indiquée.
– QUERY TIME< nombre de ms : temps de réponse du serveur DNS.
Note : les règles TIME et MEAN prennent en compte le temps de réponse total de la requête, y compris les temps de transmission, que le DNS réponde ou non) alors que QUERY TIME porte sur le temps figurant dans la réponse du DNS.
– CONTAINS chaîne de caractères : cette règle permet de vérifier la présence d’une chaîne dans la réponse brute.
– MATCH chaîne de caractères : cette règle permet de vérifier la présence d’une chaîne quelconque dans la réponse brute. La chaîne de caractère peut être une expression régulière standard, il est donc possible d’effectuer n’importe quelle vérification dans la réponse. Cependant, l’utilisation de la règle ARRAY sera le plus souvent préférable.
– ARRAY[index]= chaîne de caractères : Vérifie que la chaîne de caractères se trouve dans la valeur du tableau à l’indice A. Notons qu’il s’agit d’une inclusion et non d’une égalité, la règle se comportant comme CONTAINS. L’index peut être multidimensionnel.
– ARRAY[index]> nombre : Vérifie que la valeur du tableau à l’indice A est supérieure au nombre indiqué. L’index peut être multidimensionnel.
En savoir plus sur la règle ARRAY...
La règle ARRAY... complète le jeu de règles pour tester n’importe quelle information retournée par la requête DNS.
Comment NSS traduit les réponses
Pour effectuer une requête, NSS fait appel à DIG puis décompose la réponse dans un tableau associatif. Les règles portent sur les éléments de ce tableau.
En règle générale, vous n’aurez pas à vous occuper de ce tableau. Cependant, la formulation d’une règle ARRAY suppose de bien connaître la structure de ce tableau.
Voici comment, en interne, NSS traduit en tableau la requête précédente :
- RAW: string = " ; <<>> DiG 9.11.5-P4-5.1+deb10u2-Debian <<>> www.spip.net\n;; global options: +cmd\n;; Got answer:\n;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 594\n;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 3\n\n;; OPT PSEUDOSECTION:\n; EDNS: version: 0, flags:; udp: 4096\n; COOKIE: f182cd5130c105c8056d4eed5f50bf97a6b668e584c7b2e7 (good)\n;; QUESTION SECTION:\n;www.spip.net.\t\t\tIN\tA\n\n;; ANSWER SECTION:\nwww.spip.net.\t\t1979\tIN\tA\t151.80.20.125\n\n;; AUTHORITY SECTION:\nspip.net.\t\t34795\tIN\tNS\tns-145-c.gandi.net.\nspip.net.\t\t34795\tIN\tNS\tns-77-b.gandi.net.\nspip.net.\t\t34795\tIN\tNS\tns-219-a.gandi.net.\n\n;; ADDITIONAL SECTION:\nns-219-a.gandi.net.\t34795\tIN\tA\t173.246.100.220\nns-219-a.gandi.net.\t34795\tIN\tAAAA\t2001:4b98:aaaa::dc\n\n;; Query time: 0 msec\n;; SERVER: 127.0.0.1#53(127.0.0.1)\n;; WHEN: Thu Sep 03 10:04:07 UTC 2020\n;; MSG SIZE rcvd: 203\n"
- ; <<>> DIG 9.11.5-P4-5.1+DEB10U2-DEBIAN <<>> WWW.SPIP.NET: string = ""
- GLOBAL OPTIONS: string = " +cmd "
- GOT ANSWER: string = " "
- opcode: string = " QUERY"
- status: string = " NOERROR"
- id: string = " 594 "
- flags: string = " qr rd ra"
- QUERY: string = " 1"
- ANSWER: string = " 1"
- AUTHORITY: string = " 3"
- ADDITIONAL: string = " 3 "
- OPT PSEUDOSECTION: string = " ; EDNS: version: 0, flags:; udp: 4096 ; COOKIE: f182cd5130c105c8056d4eed5f50bf97a6b668e584c7b2e7 (good) "
- QUESTION SECTION: string = "www.spip.net. IN A "
- SERVER: string = " 127.0.0.1#53(127.0.0.1) "
- WHEN: string= "Thu Sep 03 10:04:07 UTC 2020"
- MSG SIZE RCVD: string = " 203 "
- host: string = "www.spip.net"
- class: string = "IN"
- ttl: long = 1974
- type: string = "A"
- ip: string = "151.80.20.125"
- host: string = "spip.net"
- class: string = "IN"
- ttl: long = 34790
- type: string = "NS"
- target: string = "ns-145-c.gandi.net"
- host: string = "spip.net"
- class: string = "IN"
- ttl: long = 34790
- type: string = "NS"
- target: string = "ns-77-b.gandi.net"
- host: string = "spip.net"
- class: string = "IN"
- ttl: long = 34790
- type: string = "NS"
- target: string = "ns-219-a.gandi.net"
- host: string = "spip.net"
- class: string = "IN"
- ttl: long = 34790
- type: string = "NS"
- target: string = "ns-77-b.gandi.net"
- host: string = "spip.net"
- class: string = "IN"
- ttl: long = 34790
- type: string = "NS"
- target: string = "ns-145-c.gandi.net"
- host: string = "spip.net"
- class: string = "IN"
- ttl: long = 34790
- type: string = "NS"
- target: string = "ns-219-a.gandi.net"
- host: string = "ns-219-a.gandi.net"
- class: string = "IN"
- ttl: long = 34790
- type: string = "A"
- ip: string = "173.246.100.220"
- host: string = "ns-219-a.gandi.net"
- class: string = "IN"
- ttl: long = 34790
- type: string = "AAAA"
- ipv6: string = "2001:4b98:aaaa::dc"
- host: string = "ns-219-a.gandi.net"
- class: string = "IN"
- ttl: long = 34790
- type: string = "A"
- ip: string = "173.246.100.220"
- host: string = "ns-219-a.gandi.net"
- class: string = "IN"
- ttl: long = 34790
- type: string = "AAAA"
- ipv6: string = "2001:4b98:aaaa::dc"
- IPV4: string = "151.80.20.125"
Exemples de règles ARRAY
ARRAY[HEADER][AUTHORITY]= 2 /* vérifier qu'il y a deux serveurs faisant autorité */
ARRAY[HEADER][ADDITIONAL]> 0 /* vérifier qu'il y a au moins un serveur additionnel */
ARRAY[RAW]=EDNS /* vérifie la prise en charge d'EDNS */
ARRAY[AUTHORITY SECTION][0][target]=ns-145-c.gandi.net
Le dernier exemple montre une difficulté : s’il y a plusieurs serveurs faisant autorité, quel est le rang de celui dont on veut vérifier la présence ? Le signe ’*’ dans la règle ARRAY[]= permet de tester tous les index :
ARRAY[AUTHORITY SECTION][*][target]=ns-145-c.gandi.net
Inversion, combinaison, niveau d’alerte
L’inversion des règles par NOT est possible pour les règles TIME, MEAN et CONTAINS.
La combinaison des règles et la définition du niveau d’alerte se font de la même manière que dans le cas des Règles de surveillance HTTP.
Quel serveur DNS répond ?
Une requête DNS précise le serveur à interroger en fournissant le paramètre @ comme dans les exemples suivants :
dns://ns-219-a.gandi.net/www.spip.net
dns://2001:4b98:aaaa::dc/www.spip.net
Si la requête ne précise pas le serveur, ce sera le resolver local de NSS à l’adresse 127.0.0.1 qui répondra. Bien que ce soit approprié dans certains cas, ce n’est pas la meilleure façon de s’assurer du bon fonctionnement des DNS d’un domaine, car le resolver n’effectuera pas de récursion avant que le SOA ait expiré.
De plus, quand le résolver local répond, il le fait en Query time : 0 msec. Ce n’est pas très intéressant à savoir !
Quel serveur DNS faut-il interroger ?
Pour vous assurer du bon fonctionnement des DNS, il faut s’adresser à un serveur autorité du domaine (domain authoritative nameserver). Dans l’exemple précédent, nous avons interrogé un des trois serveurs autorité pour le domaine www.spip.net.
On peut connaître la liste des serveurs autorité pour le domaine en émettant la commande suivante en mode de commande :
dig www.spip.net
</dig>
qui retourne :
<code>
; <<>> DiG 9.11.5-P4-5.1+deb10u2-Debian <<>> www.spip.net
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 3800
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 3, ADDITIONAL: 7
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
; COOKIE: 798ddf1f8a880829b2ae2fae5f4f590bd9ae0131be4067c2 (good)
;; QUESTION SECTION:
;www.spip.net. IN A
;; ANSWER SECTION:
www.spip.net. 1427 IN A 151.80.20.125
;; AUTHORITY SECTION:
spip.net. 126583 IN NS ns-219-a.gandi.net.
spip.net. 126583 IN NS ns-77-b.gandi.net.
spip.net. 126583 IN NS ns-145-c.gandi.net.
;; ADDITIONAL SECTION:
ns-77-b.gandi.net. 590 IN A 213.167.230.78
ns-145-c.gandi.net. 545 IN A 217.70.187.146
ns-219-a.gandi.net. 126583 IN A 173.246.100.220
ns-77-b.gandi.net. 590 IN AAAA 2001:4b98:aaab::4e
ns-145-c.gandi.net. 545 IN AAAA 2604:3400:aaac::92
ns-219-a.gandi.net. 126583 IN AAAA 2001:4b98:aaaa::dc
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Sep 02 08:34:19 UTC 2020
;; MSG SIZE rcvd: 291
Une bonne requête serait donc :
dns://ns-219-a.gandi.net/www.spip.net
Les resolvers publics sont également intéressants, par exemple :
dns://1.1.1.1/www.spip.net /* Cloudflare resolver */
dns://8.8.8.8/www.spip.net /* Google resolver */
Alerte
...
Note à propos des codes HTTP
...