Comment fonctionne la résolution de noms DNS, en principe?

En ce moment, je prends un cours en ligne pour Linux sysadmin et on m'a posé une question que je ne comprends généralement pas. Je sais comment searchr un server de noms, si au less j'utilise la command dig pour find l'adresse dans la command de section supplémentaire, mais je me suis un peu perdu quand on m'a posé la question suivante.

En supposant que votre server de noms configuré ne dispose pas de résultats mis en cache, combien de servers de noms doivent interroger votre server de noms pour résoudre maps.google.com? Quelle (s) command (s) utiliseriez-vous pour find tous ces servers de noms? Énumérez-en un de chaque niveau et expliquez pourquoi ce niveau est nécessaire.

Je ne veux pas la réponse, je voudrais juste savoir ce qu'on me request de faire exactement.

En supposant que votre server de noms configuré ne dispose pas de résultats mis en cache, combien de servers de noms doivent interroger votre server de noms pour résoudre maps.google.com? Quelle (s) command (s) utiliseriez-vous pour find tous ces servers de noms? Énumérez-en un de chaque niveau et expliquez pourquoi ce niveau est nécessaire.

Eh bien, choisissons celui-ci séparément.

"En supposant que votre server de noms configuré n'a pas de résultats mis en cache à sa disposition" – tout d'abord, s'il n'a pas de données mises en cache du tout, il ne peut pas résoudre quoi que ce soit. Pour amorcer le cache du résolveur, vous devez disposer des loggings NS et adresse (A, AAAA) pour le cache . (AKA root). Ce sont les servers de noms racine, qui se trouvent dans root-servers.net. zone. Il n'y a rien de magique dans cette zone ou ces servers DNS. Cependant, ces données sont souvent fournies "hors bande" au résolveur DNS, précisément pour amorcer le cache du résolveur. Les servers de noms faisant autorité seulement n'ont pas besoin de ces données, mais la résolution des servers de noms.

Aussi, "résoudre" à quoi? Tout RRtype à ce nom? Un A RR? Ou autre chose? Quelle class ( CH / Chaosnet, IN / Internet, …)? Le process exact sera différent, mais l'idée générale rest la même.

Si nous pouvons supposer que nous soaps comment find les servers de noms racines mais rien de plus, et que par «résoudre» nous voulons dire get le contenu de n'importe quel RR IN A associé au nom, cela devient beaucoup plus pratique.

Pour résoudre un nom DNS, vous divisez le nom en labels et travaillez de droite à gauche. N'oublie pas le . à la fin; vous seriez vraiment en maps.google.com. résoudre maps.google.com. plutôt que maps.google.com . Cela nous oblige à résoudre (nous le soaps, mais une implémentation du résolveur DNS ne le sera probablement pas):

  • .
  • com.
  • google.com.
  • maps.google.com.

Commencez par find où requestr le contenu de . . C'est facile; nous avons déjà cette information: les noms de server de noms racines et les adresses IP . Nous avons donc un server de noms racine. Disons que nous décidons d'utiliser 198.41.0.4 ( a.root-servers.net , aussi 2001: 503: ba3e :: 2: 30) pour continuer la résolution du nom. En pratique, l'une des premières tâches du résolveur sera probablement d'utiliser datatables du server racine fournies pour requestr à l'un des servers de la zone racine une list précise des servers de noms pour la zone racine, garantissant ainsi que si les noms et les adresses IP sont valides et accessibles, ils disposeront d'un set de données complet et complet pour la zone racine lorsque la résolution commencera.

Extrayez une requête DNS pour maps.google.com. IN A maps.google.com. IN A à 198.41.0.4. Il vous dira en réponse "non, ne va pas le faire, mais voici quelqu'un qui pourrait savoir"; c'est un renvoi. Il contient des loggings NS pour la zone la plus proche que le server en question connaît, ainsi que tous les loggings de colle disponibles par le server. Si aucune donnée de colle n'est disponible, vous devez d'abord résoudre l'hôte nommé dans l'logging NS que vous avez sélectionné, afin de générer une résolution de nom distincte pour get l'adresse IP; si datatables de la colle sont disponibles, vous aurez l'adresse IP d'un server de noms qui est au less "plus proche" de la réponse. Dans ce cas, ce sera l'set des servers pour le com. la zone et la colle sont également fournies.

Répétez le process, en demandant à l'un des com. servers de noms la même question. Ils ne savent pas non plus, mais vous référeront aux servers de noms faisant autorité de Google. À ce stade dans le cas général, il sera difficile de savoir si datatables de colle sont fournies ou non; rien n'empêche un domaine com d'avoir des servers de noms uniquement dans nl , par exemple, auquel cas il est peu probable que des données de colle soient disponibles auprès des servers gTLD. Les données de colle fournies peuvent également être incomplètes, ou si vous êtes vraiment malchanceux, cela peut même être incorrect! Vous devez toujours être prêt à développer cette résolution de nom distincte que j'ai mentionnée ci-dessus.

Fondamentalement, vous continuez jusqu'à ce que vous obtenez une réponse avec le drapeau aa (réponse autorisée). Cette réponse vous dira ce que vous requestz, ou que le RR que vous avez demandé n'existe pas (soit NXDOMAIN , soit NOERROR avec zéro logging des données de réponse). Continuez à chercher des réponses comme SERVFAIL (et reculer d'une étape et essayez un autre server si vous en obtenez un, si tous les servers nommés returnnent SERVFAIL , échouez le process de résolution de nom et returnnez SERVFAIL vous-même au client).

L'alternative à requestr le nom complet de chaque server (ce qui pourrait être considéré comme une mauvaise pratique) consiste à utiliser la list des labels que nous avons déterminée précédemment, requestr les servers de noms donnés par le server vers la racine pour IN NS et IN A / IN AAAA RR pour cette label, et les utiliser pour favoriser le process de résolution de noms. Ce n'est que marginalement différent dans la pratique, et le même process s'applique toujours.

Vous pouvez simuler l'set du process en utilisant l'option +trace dans l'utilitaire dig , qui fait partie de BIND, ou set debug dans nslookup .

Il vaut également la peine de callbacker que certains types RR (notamment NS , MX et quelques autres, A6 était raisonnablement bien utilisé pendant un certain time mais ont été dépréciés) peuvent et font reference à d'autres RR. Dans ce cas, vous devrez peut-être lancer un autre process de résolution de noms pour donner une réponse complète et utile à votre client.

Il y a une command dnstracer (vous devrez peut-être l'installer, au less sur Debian, c'est aussi le nom du package) qui va suivre la résolution du nom. Vous pouvez aussi (comme le souligne Koveras dans un commentaire) utiliser dig .

Voici avec dnstracer. -s . signifie commencer par la racine; -4 signifie utiliser IPv4 (v6 est cassé ici …); -o signifie montrer réellement les adresses IP résolues à la fin (j'ai omis cette partie de la sortie, il y en a beaucoup).

 anthony@Zia:~$ dnstracer -s . -4 -o maps.google.com Tracing to maps.google.com[a] via A.ROOT-SERVERS.NET, maximum of 3 resortinges A.ROOT-SERVERS.NET [.] (198.41.0.4) |\___ m.gtld-servers.net [com] (192.55.83.30) | |\___ ns4.google.com [google.com] (216.239.38.10) Got authoritative answer | |\___ ns3.google.com [google.com] (216.239.36.10) Got authoritative answer | |\___ ns1.google.com [google.com] (216.239.32.10) Got authoritative answer | \___ ns2.google.com [google.com] (216.239.34.10) Got authoritative answer ⋮ 

Cette sortie continue, car dnstracer trace tous les paths (vous pouvez donc voir si, par exemple, certains servers de noms ont une zone obsolète).

Ainsi, vous pouvez voir qu'il faut une requête au server de noms racine, puis un aux servers gtld (le server pour la zone .com), enfin à un server de noms Google.

Avec dig , la sortie est beaucoup plus verbeuse (donc je vais faire beaucoup de découpage):

 dig -4 maps.google.com. +norecurse +trace ; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> maps.google.com. +norecurse +trace ;; global options: +cmd . 425379 IN NS b.root-servers.net. ⋮ com. 172800 IN NS f.gtld-servers.net. ⋮ google.com. 172800 IN NS ns2.google.com. ⋮ maps.google.com. 300 IN A 74.125.228.70 ⋮ 

dig montre en outre qu'il a fait une requête pour get la list actuelle des servers de noms racine. C'est quelque chose qu'un server DNS fera généralement très rarement. Je ne suis donc pas sûr que vous le comptiez dans votre cache.

Vous pouvez bien sûr également regarder les requêtes réelles sur le fil avec, par exemple, wireshark .