• Technologie
  • Équipement électrique
  • Industrie des matériaux
  • La vie numérique
  • politique de confidentialité
  • Ô nom
Emplacement: Accueil / Technologie / Comprendre le DNS : anatomie d'un fichier de zone BIND

Comprendre le DNS : anatomie d'un fichier de zone BIND

Plateforme de services à guichet unique |
3264

Agrandir

/

Qu'est-ce que ce flux de chiffres binaires a à voir avec DNS ? Rien, vraiment, mais bonne chance pour trouver une jolie photo quelque part qui le fait !

Santo Heston

commentaires des lecteurs

121

avec 76 affiches participantes, y compris l'auteur de l'histoire

Partagez cette histoire

Partager sur Facebook

Partager sur Twitter

Partager sur Reddit

Si vous voulez être un administrateur système ou un administrateur réseau de quelque nature que ce soit, il existe une technologie fondamentale que vous devez vraiment comprendre : le DNS, le système de noms de domaine. Il fut un temps où un administrateur système sans ambition de gérer des services accessibles sur Internet pouvait s'en sortir sans comprendre le DNS, mais ce temps est révolu.

Vous ne pouvez pas apprendre tout ce qu'il y a à savoir sur le DNS dans un seul article. Mais ce n'est pas ce que nous cherchons à faire aujourd'hui ; au lieu de cela, nous voulons vous donner un guide clair et concis sur la structure et la signification de la partie la plus importante du système de noms de domaine : un fichier de zone, comme on le voit dans BIND, le Berkeley Internet Name Daemon.

Exemple de fichier de zone

Agrandir

/

Cet exemple de fichier de zone ne contient pas tous les types d'enregistrements possibles, mais c'est un bon début.

Jim Salter

Origine et TTL

Ci-dessus, nous avons un exemple petit mais complet d'un fichier de zone typique. En fait, il s'agit d'une version anonymisée d'un fichier de zone de production sur un domaine que je gère. Parcourons-le ligne par ligne.

$ORIGINE tld.$TTL 5m

Chaque fois que vous voyez un

$ORIGINE

ligne dans un fichier de zone, il s'agit d'un raccourci qui permet à BIND de savoir que toute référence de nom d'hôte non terminée suivant cette ligne doit être présumée se terminer par l'argument suivant

$ORIGINE

. Dans ce cas, c'est

.tld

—le domaine de premier niveau fictif pour

exemple.tld

.

La ligne suivante,

$TTL 5m

, déclare que les lignes suivantes auront une durée de vie de cinq minutes. Cette valeur relativement courte signifie que les résolveurs DNS distants ne doivent mettre en cache les enregistrements récupérés de cette zone que pendant cinq minutes avant de les redemander. Si vous êtes relativement certain que votre DNS pour un domaine donné ne changera pas très souvent, vous pouvez envisager d'augmenter cette valeur afin de réduire le nombre de fois où les hôtes distants doivent interroger votre serveur de noms, mais gardez à l'esprit qu'un TTL plus long est également signifie des périodes d'indisponibilité plus longues, lorsque vous devez apporter une modification à votre DNS (ou effectuer une modification qui le casse accidentellement).

Les deux

$ORIGINE

et

$TTL

peuvent être définis plusieurs fois dans la même zone — chaque fois que vous les redéfinissez, vous modifiez leur valeur pour toutes les lignes sous les nouvelles valeurs dans le même fichier de zone.

Enregistrement SOA

exemple DANS SOA ns1.example.tld. hostmaster.exemple.tld. ( 90 ; série 4h ; ​​rafraîchissement 15m ; réessayer 8h ; expirer 4m) ; TTL de mise en cache négative

Le premier enregistrement réel de notre exemple de fichier de zone (ou de tout fichier de zone normal) est l'enregistrement SOA, qui nous indique le Start Of Authority pour le domaine. C'est aussi facilement le type d'enregistrement le plus déroutant de tout le système DNS.

Pour toute liste d'enregistrements, y compris cet enregistrement SOA, le premier argument est le nom d'hôte auquel l'enregistrement s'applique — dans ce cas,

Exemple

. Rappelez-vous comment nous définissons

$ORIGINE tld

sur la première ligne du fichier de zone ? Cela signifie que ce nom d'hôte non terminé

Exemple

s'étend à

exemple.tld

—donc, nous définissons le SOA pour le FQDN (nom de domaine complet)

exemple.tld.

Nous faisons référence à ce nom d'hôte

Exemple

comme "non terminé" car il ne se termine pas par un point. Si nous voulions contourner le

$ORIGINE

définir et faire référence à un nom de domaine complet directement, nous le terminerions par un point final, par exemple,

exemple.tld.

serait le FQDN ici,

avec

le point de fuite.

Le prochain argument que nous voyons est

DANS

, abréviation de « Internet ». C'est la classe record. Il existe d'autres classes d'enregistrement DNS, mais vous pouvez facilement faire toute votre carrière sans en voir une (comme

CH

, pour Chaos) en production. La classe record est facultative ; s'il est omis, BIND supposera que l'enregistrement spécifié est de classe

DANS

. Nous recommandons

ne pas

en l'omettant, cependant, de peur que quelque chose ne change et que tous vos fichiers de zone soient soudainement cassés après une mise à jour BIND !

Les deux arguments suivants sont des noms de domaine complets, du moins, ils y ressemblent. Le premier FQDN est vraiment un FQDN, et il devrait être le FQDN du serveur de noms principal pour le domaine lui-même — dans ce cas,

ns1.exemple.tld.

Notez que vous

pouvez

utilisez ici des noms d'hôte non terminés - par exemple, nous aurions pu simplement utiliser

ns1.exemple

pour cet argument, qui se serait étendu à

ns1.exemple.tld.

grâce à notre

$ORIGINE .tld

ligne, mais il est probablement préférable d'être explicite ici.

Le deuxième FQDN,

hostmaster.exemple.tld.

, n'est pas du tout un FQDN. Au lieu de cela, c'est une façon perverse de réécrire une adresse e-mail.

@

est un caractère réservé dans les fichiers de zone, et le BIND d'origine utilise la première section de ce "FQDN" comme partie utilisateur d'une adresse e-mail. Cela se traduirait donc par l'adresse

hostmaster@exemple.tld

. C'est

incroyablement

courant de voir cela foutu dans les fichiers de zone de la vie réelle - heureusement, cela n'a pas beaucoup d'importance. Nous ne connaissons littéralement personne qui utilise réellement cette fonctionnalité d'une zone DNS pour contacter qui que ce soit.

En continuant, nous avons

en série

,

rafraîchir

,

réessayez

,

expirer

, et

TTL négatif

pour la zone entre parenthèses. Notez que les commentaires que vous voyez ici les étiquetant ne sont pas obligatoires et dans la vraie vie, vous les verrez rarement. Nous préférons fortement mettre ces commentaires dans des fichiers de zone de production afin de faciliter leur lecture, mais BIND lui-même s'en moque !

en série

— il s'agit d'un simple numéro de série pour le fichier de zone, qui doit être incrémenté chaque fois que le contenu de la zone est modifié. Si vous ne mettez pas à jour le numéro de série du fichier de zone, vos modifications apportées à la zone ne seront pas prises en compte par les résolveurs DNS qui ont précédemment mis en cache les enregistrements de votre zone ! Autrefois, il s'agissait d'un format AAMMJJnn, mais ce format n'est plus requis, voire même pris en charge dans certains cas. Démarrez simplement vos zones en série

1

, incrémenter à

2

la prochaine fois que vous modifiez la zone, et ainsi de suite.

rafraîchir

— après cette période, les serveurs de noms secondaires doivent interroger le serveur de noms principal pour cet enregistrement SOA, afin de détecter les changements de numéro de série. Si le numéro de série a été incrémenté, tous les enregistrements mis en cache doivent être invalidés et récupérés à nouveau à partir du serveur de noms principal.

réessayez

— si le serveur de noms principal ne répond pas à une requête SOA, un serveur de noms secondaire doit attendre aussi longtemps avant d'essayer d'interroger à nouveau le serveur de noms principal.

expirer

— si le serveur de noms principal n'a pas réussi à répondre à la demande SOA d'un serveur de noms secondaire pendant cette période, le serveur de noms secondaire doit cesser entièrement d'offrir la résolution DNS pour le domaine.

TTL de mise en cache négative

—cela contrôle la durée pendant laquelle une réponse "négative"—par exemple, "Je n'ai pas l'enregistrement que vous demandez"—doit être mise en cache.

Publicité

L'un des domaines de confusion les plus courants dans l'enregistrement SOA est l'effet

rafraîchir

,

réessayez

, et

expirer

arguments ont. Ces arguments n'affectent pas du tout les résolveurs DNS, mais uniquement les serveurs de noms secondaires faisant autorité pour le domaine. si vous n'avez pas un ou plusieurs serveurs de noms secondaires pour votre domaine, qui utilisent la réplication BIND pour récupérer les mises à jour du primaire, ces arguments n'auront aucun effet.

Une dernière remarque : les anciennes versions de BIND exigeaient que tous ces temps soient en secondes... même lorsque l'intervalle de temps réel était en jours ou en semaines. BIND9—publié il y a près de 20 ans, en octobre 2000—prend en charge les suffixes de temps lisibles par l'homme tels que "m" pour les minutes, "h" pour les heures et "d" pour les jours.

S'il te plaît

utilisez ces suffixes lisibles par l'homme lors de l'écriture des fichiers de zone ; personne ne devrait avoir à sortir une calculatrice pour comprendre que 86 400 secondes représentent un jour !

enregistrements NS

EN NS ns1.example.tld.IN NS ns2.example.tld.

Dans ces deux enregistrements, nous définissons les noms d'hôtes, qui sont des serveurs de noms faisant autorité pour notre zone. Encore une fois, nous avons utilisé des FQDN terminés par des points pour ces enregistrements. Encore une fois, nous

pourrait

ont utilisé des noms d'hôtes non terminés—

ns1.exemple

et

ns2.exemple

- et s'est appuyé sur notre

$ORIGINE .tld

pour les étendre. Cela rendrait la zone plus confuse et difficile à lire, cependant.

Notez que l'enregistrement NS spécifie

noms d'hôtes

, pas les adresses IP. C'est une source courante de confusion pour les débutants en DNS, et il est important de bien faire les choses. Tu

ne peut pas

spécifiez une adresse IP nue comme serveur de noms pour un domaine ; vous devez absolument spécifier un nom d'hôte ici.

Enfin, notez que nous n'avons spécifié le nom de domaine lui-même sur aucune des lignes, c'est parce que nous l'avons hérité du

SOA

enregistrement ci-dessus. Nous avons commencé cette ligne avec

Exemple

, qui s'étend à

exemple.tld

. Comme nous n'avons pas spécifié d'autre nom d'hôte, ces nouveaux

N.-É.

Les enregistrements s'appliquent également à ce nom d'hôte par défaut.

Dans le monde réel, vous pouvez également voir des fichiers de zone avec

$ORIGINE exemple.tld.

, et en commençant le SOA et éventuellement d'autres lignes avec le caractère réservé spécial

@

. Quand tu vois

@

en tant que nom d'hôte dans un fichier de zone, cela signifie simplement que vous utilisez le nu

$ORIGINE

sans autre qualificatif.

Enregistrement(s) MX

EN MX 10 mail.exemple.tld.

Dans ce domaine simple, nous avons un seul serveur de messagerie, et c'est

mail.exemple.tld.

L'enregistrement MX indique simplement à quiconque souhaite envoyer un e-mail à n'importe quelle adresse à

exemple.tld

pour établir leur connexion SMTP au nom d'hôte spécifié dans cet enregistrement.

L'argument précédent—

dix

dans ce cas, correspond à la priorité numérique du serveur de messagerie dans cet enregistrement spécifique. Des nombres inférieurs signifient une priorité plus élevée. Lorsque plusieurs serveurs SMTP sont disponibles pour un domaine, vous verrez plusieurs

MX

également, chacun avec une priorité différente. En théorie, les serveurs de messagerie de priorité plus élevée doivent toujours être essayés en premier, et les serveurs de messagerie de priorité plus faible ne doivent être essayés que si le serveur de priorité plus élevée échoue.

Les serveurs SMTP bien élevés suivent ce protocole, mais les spammeurs ont tendance à cibler délibérément les serveurs de messagerie de priorité inférieure en premier, en partant du principe que les serveurs à priorité élevée pourraient être des passerelles anti-spam, et que les serveurs de priorité inférieure pourraient être les serveurs nus. , serveur final non filtré. Les spammeurs sont nuls.

Un ou plusieurs enregistrements

DANS UN 127.0.0.1

Un enregistrement est la partie d'un fichier de zone qui fait en réalité ce que la plupart des gens pensent du DNS : ils traduisent un nom d'hôte en une adresse IPv4 nue. Dans ce cas, il ne s'agit que d'un exemple de fichier—et notre

UNE

enregistrer pour

exemple.tld

se résout simplement à localhost, sur le même principe que les numéros de téléphone dans les films commencent toujours par l'échange

555

. Dans la vraie vie, bien sûr, vous mettriez l'adresse IP du serveur auquel vous vous attendiez à répondre lorsque vous

exemple de ping.tld

, pointez un navigateur Web sur

https://exemple.tld/

, et ainsi de suite.

Dans ce simple fichier de zone, nous n'avons qu'un seul

UNE

enregistrer pour

exemple.tld

. Dans la vraie vie, vous pourriez en rencontrer plusieurs : il pourrait y avoir plusieurs serveurs de passerelle capables de répondre aux requêtes Web pour

https://exemple.tld/

; et si c'était le cas, chacun obtiendrait son propre enregistrement A sur sa propre ligne.

Enregistrement(s) TXT

EN TXT "v=spf1 a mx a:mail.example.tld a:www.example.tld ?all"

Cette

SMS

, ou enregistrement de texte, est toujours dans la section head de notre fichier de zone, sous le nom d'hôte

exemple.tld

. Son champ d'application est donc l'ensemble

exemple.tld

domaine. Vous pouvez mettre à peu près n'importe quoi dans un

SMS

enregistrer; celui-ci est un

FPS

enregistrement, formaté pour donner aux serveurs de messagerie des informations sur les machines autorisées à émettre du courrier au nom de

exemple.tld

.

Dans ce cas, nous disons que nous utilisons la version SPF1 du formatage. Nous informons ensuite toute personne interrogeant cet enregistrement que tout

UNE

enregistrer pour

exemple.tld

est autorisé à envoyer du courrier en son nom, comme tout

MX

pour le domaine, et enfin que les adresses IP associées au

UNE

dossiers pour

mail.exemple.tld

et

www.exemple.tld

sont autorisés à envoyer du courrier. Finalement,

?tous

dit que si une autre machine dit qu'elle veut envoyer du courrier à partir d'une adresse à

exemple.tld

, cela devrait être autorisé... mais cela devrait être examiné de plus près que ne le sont les hôtes spécifiquement autorisés.

Noms d'hôtes, sous-domaines et CNAME sous example.tld

$ORIGINE example.tld.ns1 DANS UN 127.0.0.2ns2 DANS UN 127.0.0.3www DANS CNAME example.tld.mail DANS AAAA ::1mail DANS UN 127.0.0.4

Maintenant que nous avons défini tout ce dont nous avons besoin pour le domaine, nous pouvons commencer à ajouter des enregistrements pour tous les noms d'hôtes et sous-domaines

sous

exemple.tld

lui-même. La première chose que nous faisons ici est de changer notre

$ORIGINE

à

exemple.tld.

Encore une fois, remarquez ce dernier point de terminaison : si vous l'oubliez, les choses vont devenir vraiment étranges et vous vous arracherez les cheveux en vous demandant pourquoi aucun de vos enregistrements ne se résout correctement !

Nous voyons

UNE

enregistre ici pour

ns1

,

ns2

, et

courrier

. Ces

UNE

les enregistrements fonctionnent de la même manière que les

UNE

record pour le domaine lui-même l'a fait - nous disons à BIND à quelle adresse IP résoudre les demandes pour ce nom d'hôte.

Nous avons également un

AAAA

enregistrer pour

mail.exemple.tld.

-

AAAA

les enregistrements sont comme

UNE

enregistrements, mais ils sont destinés à résoudre IPv6 plutôt qu'IPv4. Encore une fois, nous avons choisi dans notre exemple d'utiliser une adresse localhost. Vous devrez vous familiariser avec

AAAA

enregistrements si vous prévoyez de configurer votre propre serveur de messagerie : Google a cessé de vouloir parler aux serveurs de messagerie sans un DNS IPv6 pleinement fonctionnel il y a quelques années !

Publicité

Le dernier type d'enregistrement que nous voyons ici est

CNAME

, abréviation de nom canonique. Ceci est un alias—il vous permet de dire à BIND de toujours résoudre les demandes pour le

CNAME

d hôte à l'aide de l'enregistrement A ou AAAA spécifié dans l'argument cible. Dans ce cas,

www IN CNAME exemple.tld.

signifie que l'adresse IP de

exemple.tld

lui-même devrait également être remis si quelqu'un demande

www.exemple.tld.

CNAME

les disques sont pratiques, mais ils sont un peu funky. Il ne faut pas oublier que chaque niveau de

CNAME

nécessite une autre recherche DNS - dans ce cas, une machine distante qui a demandé à résoudre

www.exemple.tld

serait dit " s'il vous plaît regardez vers le haut

exemple.tld.

afin de trouver votre réponse", puis devrait émettre un

séparé

requête DNS pour le

UNE

enregistrement associé à

exemple.tld.

Si tu as

CNAME

s pointant vers

CNAME

s pointant vers

CNAME

s, vous introduirez une latence inutile dans les demandes de vos ressources, et votre domaine apparaîtra « lent » et « retardé » pour vos utilisateurs !

Il y a d'autres limitations dans

CNAME

enregistrements. Rappelez-vous comment nous vous avons dit que

MX

et

N.-É.

les enregistrements doivent pointer vers des noms d'hôtes, pas vers des adresses IP brutes ? Plus précisément, ils doivent pointer directement vers

UNE

enregistrements, de ne pas

CNAME

enregistrements. Si vous essayez de définir

MX mail.exemple.tld.

suivie par

mail.exemple.tld. CNAME exemple.tld.

, votre fichier de zone sera cassé, et

MX

les tentatives de recherche renverront des erreurs.

Outils du métier

Si vous gérez votre propre DNS, vous devrez maîtriser les outils de ligne de commande pour interroger directement votre serveur DNS et voir comment il répond aux requêtes. en mettant

https://exemple.tld/

dans un navigateur et voir ce qui se passe.

creuser

you@box:~$ dig @127.0.0.1 NS example.tld; <<>> DiG 9.16.1-Ubuntu <<>> NS example.tld;; options globales : +cmd;; Réponse obtenue : ;; ->>EN-TÊTE<

Si vous avez accès à Linux, Mac ou au sous-système Windows pour Linux, le meilleur outil de ligne de commande est de loin

creuser

. À l'aide de

creuser

est aussi simple que de spécifier un serveur à interroger, le type d'enregistrement que vous souhaitez rechercher et le nom de domaine complet auquel il doit être associé.

Dans l'exemple ci-dessus, nous avons demandé au serveur DNS à

127.0.0.1

pour tout nous montrer

N.-É.

enregistrements associés à

exemple.tld

. En plus des réponses que nous voulions, nous avons obtenu une tonne d'informations de diagnostic - le serveur DNS que nous avons interrogé n'a pas renvoyé de

ERREUR

lorsqu'il est interrogé, il dit qu'il fait autorité pour le domaine en question, et ainsi de suite.

Vous pouvez également fournir un

+court

argumente si tu veux

creuser

pour se taire et vous donner la réponse que vous cherchez sans tous les diagnostics détaillés :

you@box:~$ dig +short @127.0.0.1 NS example.tldns1.example.tld.ns2.example.tld.

Sachez cependant que s'il n'y a pas de réponses disponibles pour un

+court

requête, par exemple, si vous tapez le nom de domaine, vous n'obtiendrez aucune réponse, même si le serveur DNS interrogé a renvoyé une erreur.

you@box:~$ dig +short @127.0.0.1 NS example.tmdyou@box:~$

Si vous voulez savoir

Pourquoi

vous n'avez pas obtenu de réponse, vous devrez perdre le

+court

argument pour le savoir.

nslookup

Si vous n'avez pas accès à

creuser

, vous pouvez généralement vous en tirer avec

nslookup

. Le plus souvent, il s'agit d'une solution de contournement semi-maudite pour les utilisateurs assis devant une boîte Windows sans accès au sous-système Windows pour Linux, à cygwin ou à un autre moyen d'accéder à des outils plus avancés que ceux fournis par l'interface de ligne de commande Windows.

nslookup

est généralement invoqué sans arguments et interrogé en mode interactif. Voici un exemple de session :

C:\> nslookup> serveur 127.0.0.1 Serveur par défaut : 127.0.0.1Adresse : 127.0.0.1#53> example.tldServer : 127.0.0.1Address : 127.0.0.1#53Réponse ne faisant pas autorité : Nom : example.tldAddress : 127.0. 0,1

En définissant

serveur 127.0.0.1

, nous avons spécifié à

nslookup

d'utiliser cette machine comme serveur DNS pour interroger. Vous n'êtes pas obligé de le spécifier ; si vous ne le faites pas,

nslookup

utilisera le résolveur DNS par défaut de votre machine.

Après avoir éventuellement réglé le

serveur

, vous pouvez simplement taper un nom d'hôte nu dans

nslookup

l'invite interactive de , et il renverra n'importe quel

UNE

ou

AAAA

enregistrements qu'il peut trouver pour ce nom d'hôte.

Si vous souhaitez interroger le serveur distant pour un type d'enregistrement différent, vous devrez utiliser un

définir le type

commander.

> set type=ns> example.tldServer: 127.0.0.1Address: 127.0.0.1#53Non-authoritative answer:example.tld nameserver = ns1.example.tld.example.tld nameserver = ns2.example.tld.Les réponses faisant autorité peuvent être trouvé à partir de :> set type=mx > example.tldServer : 127.0.0.1Address : 127.0.0.1#53Réponse non autorisée :example.tld mail exchanger = 10 mail.example.tld.Les réponses faisant autorité peuvent être trouvées à partir de :example.tld nameserver = ns2.example.tld.example.tld nameserver = ns1.example.tld.mail.example.tld adresse internet = 127.0.0.4> exit

Dans les exemples ci-dessus, nous avons utilisé

définir le type=ns

et

définir le type=mx

pour interroger le serveur DNS distant pour

N.-É.

et

MX

dossiers pour

exemple.tld

. Cela fonctionne et vous obtenez vos réponses... mais la syntaxe est délicate, il y a moins d'informations de diagnostic disponibles, c'est beaucoup moins scriptable, et si vous êtes comme nous, vous maudirez probablement la chose obsolète une ou deux fois avant vous c'est fini.

La bonne façon de sortir de

nslookup

le mode interactif de est la commande

sortir

. Espérons que vous n'aurez jamais besoin de rechercher des informations sur un domaine de premier niveau également nommé

sortir

-ou si vous le faites, vous aurez un meilleur outil disponible que

nslookup

quand tu le fais.

Conclusion

J'espère que vous avez trouvé quelque chose de précieux aujourd'hui sur le fonctionnement du DNS et la manière dont ses informations sont stockées. Bien que BIND ne soit pas la seule plate-forme de serveur DNS, en particulier, les administrateurs Windows devront travailler avec Active Directory DNS, les leçons apprises ici s'appliquent presque également à toutes les plates-formes et applications.

Bien que le format de stockage puisse changer quelque peu d'un serveur à l'autre, comme un contrôleur de domaine Active Directory stockant littéralement des zones à l'intérieur d'Active Directory lui-même, plutôt qu'un fichier texte brut, les types d'enregistrement sont universels et le formatage au moins quasi universel.

Si vous êtes un administrateur système en herbe ou un passionné qui souhaite exécuter votre propre serveur DNS, je vous recommande fortement de le faire et d'utiliser la plate-forme d'origine lorsque vous le faites ; BIND sur Linux ou BSD. La charge système d'exécution d'un serveur de noms est presque inexistante à n'importe quelle échelle, à moins d'être vraiment massive ; une boîte Digital Ocean ou Linode à 5 $ peut très bien faire le travail.

En plus de la pure joie d'apprendre à gérer ces choses, vous pouvez également constater que vous appréciez la possibilité de définir vos TTL absurdement courts - la plupart des serveurs DNS gérés n'autoriseront pas un TTL de moins de 30 m, et la plupart essaieront de passer par défaut vous à des TTL allant jusqu'à une semaine. C'est très bien pour une zone DNS, qui est déjà correctement configurée et n'a pas besoin de changer... mais si votre adresse IP change et que votre DNS doit changer avec elle, un TTL de cinq minutes est très, très belle chose à avoir.