Règles de surveillance DNS

, par Administrateur

NSS permet d’émettre régulièrement une requête DNS, attend une réponse et l’interprète en appliquant des règles. Si une situation d’erreur est détectée, NSS génère une alerte.

Les règles de surveillance DNS offertes par NSS Lite vous permettent de vérifier tous les aspects de la configuration DNS du domaine considéré, en plus de la vérification du temps de réponse.

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.
 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.
 domain (obligatoire) : le domaine de l’enregistrement dans la zone DNS.

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

Réponse

NSS émet la requête DNS sous la forme d’une commande Unix/Linux DIG de la forme suivante :
dig [<type> ][@server[:port] ] <domaine>

Si la requête réussit, la réponse analysée par NSS est la forme littérale 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 NSS traduit en tableau la requête précédente :

  1. : array =
  2.   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"
  3.   ; <<>> DIG 9.11.5-P4-5.1+DEB10U2-DEBIAN <<>> WWW.SPIP.NET: string = ""
  4.   GLOBAL OPTIONS: string = " +cmd "
  5.   GOT ANSWER: string = " "
  6.   HEADER: array =
  7.     opcode: string = " QUERY"
  8.     status: string = " NOERROR"
  9.     id: string = " 594 "
  10.     flags: string = " qr rd ra"
  11.     QUERY: string = " 1"
  12.     ANSWER: string = " 1"
  13.     AUTHORITY: string = " 3"
  14.     ADDITIONAL: string = " 3  "
  15.   OPT PSEUDOSECTION: string = " ; EDNS: version: 0, flags:; udp: 4096 ; COOKIE: f182cd5130c105c8056d4eed5f50bf97a6b668e584c7b2e7 (good) "
  16.   QUESTION SECTION: string = "www.spip.net.   IN A  "
  17.   QUERY TIME: string = " 0 msec "
  18.   SERVER: string = " 127.0.0.1#53(127.0.0.1) "
  19.   WHEN: string= "Thu Sep 03 10:04:07 UTC 2020"
  20.   MSG SIZE  RCVD: string = " 203 "
  21.   ANSWER SECTION: array =
  22.     0: array =
  23.       host: string = "www.spip.net"
  24.       class: string = "IN"
  25.       ttl: long = 1974
  26.       type: string = "A"
  27.       ip: string = "151.80.20.125"
  28.   AUTHORITY SECTION: array =
  29.     0: array =
  30.       host: string = "spip.net"
  31.       class: string = "IN"
  32.       ttl: long = 34790
  33.       type: string = "NS"
  34.       target: string = "ns-145-c.gandi.net"
  35.     1: array =
  36.       host: string = "spip.net"
  37.       class: string = "IN"
  38.       ttl: long = 34790
  39.       type: string = "NS"
  40.       target: string = "ns-77-b.gandi.net"
  41.     2: array =
  42.       host: string = "spip.net"
  43.       class: string = "IN"
  44.       ttl: long = 34790
  45.       type: string = "NS"
  46.       target: string = "ns-219-a.gandi.net"
  47.     3: array =
  48.       host: string = "spip.net"
  49.       class: string = "IN"
  50.       ttl: long = 34790
  51.       type: string = "NS"
  52.       target: string = "ns-77-b.gandi.net"
  53.     4: array =
  54.       host: string = "spip.net"
  55.       class: string = "IN"
  56.       ttl: long = 34790
  57.       type: string = "NS"
  58.       target: string = "ns-145-c.gandi.net"
  59.     5: array =
  60.       host: string = "spip.net"
  61.       class: string = "IN"
  62.       ttl: long = 34790
  63.       type: string = "NS"
  64.       target: string = "ns-219-a.gandi.net"
  65.   ADDITIONAL SECTION: array =
  66.     0: array =
  67.       host: string = "ns-219-a.gandi.net"
  68.       class: string = "IN"
  69.       ttl: long = 34790
  70.       type: string = "A"
  71.       ip: string = "173.246.100.220"
  72.     1: array =
  73.       host: string = "ns-219-a.gandi.net"
  74.       class: string = "IN"
  75.       ttl: long = 34790
  76.       type: string = "AAAA"
  77.       ipv6: string = "2001:4b98:aaaa::dc"
  78.     2: array =
  79.       host: string = "ns-219-a.gandi.net"
  80.       class: string = "IN"
  81.       ttl: long = 34790
  82.       type: string = "A"
  83.       ip: string = "173.246.100.220"
  84.     3: array =
  85.       host: string = "ns-219-a.gandi.net"
  86.       class: string = "IN"
  87.       ttl: long = 34790
  88.       type: string = "AAAA"
  89.       ipv6: string = "2001:4b98:aaaa::dc"
  90.   IPV4: string = "151.80.20.125"

Télécharger

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