TP PowerShell DNS – La machine dans l’Alias, inversement et dans l’autre sens aussi (c’est ce qu’elle a dit)

Bonjour à tous,

Je me suis rendu compte que c’est assez coton de récupérer un alias DNS à partir du nom d’une machine.

Kézako DNS :

DNS pour Domain Name Service est en gros (mais alors très gros, hein), un service qui permet d’associer à un nom de machine une IP et inversement (et quelques autres infos), ça date de 1983 ; et ça implémente une charrette de RFC diverses et variées.
Au final, c’est « juste » une hiérarchie de tableaux de correspondance IP<->NOM, un peu comme DHCP pourrait être vu comme un tableau @MAC<->IP.

On peut aussi définir des Alias DNS, ce qui nous intéresse pour ce TP : au lieu d’être une ligne IP<->NOM on a une ligne NOM<->NOM.

Je vous invite à lire la page Wikipédia qui expliquera tout ça beaucoup « plus mieux » que moi.

Revenons à nos enregistrements

On va commencer avec le standard et la modernité ceux qui sont encore sous XP et Seven (oui oui ça a déjà 6 ans…), connectez-vous à un serveur 2012 avec les outils d’admin dessus.
Car sous 2012 ou W8 et avec PowerShell V4, on a le module DNS à notre disposition, donc il tout simplement suffit de faire :

PS C:\> Resolve-DnsName MON-PONEY
Name Type TTL Section NameHost
 ---- ---- --- ------- --------
 SRV-EQUESTRE-TEST-1.[...] CNAME 816 Answer SRV-EQUESTRE-TEST-1.EQUESTRIA.COM
 Name : SRV-EQUESTRE-TEST-1.EQUESTRIA.COM
 QueryType : A
 TTL : 816
 Section : Answer
 IP4Address : 1.2.3.4

Pour ceux qui n’ont pas la chance d’être sur W8 ou plus, le plus simple c’est encore d’utiliser directement le .NET :

PS H:\> [System.Net.Dns]::Resolve('MON-PONEY')
 HostName Aliases AddressList
 -------- ------- -----------
 SRV-EQUESTRE-TEST-1.EQUESTRIA.COM {MON-PONEY.EQUESTRIA.COM} {1.2.3.4}
 PS C:\> #ou encore celle ci
 PS C:\> [System.Net.Dns]::GetHostEntry('MON-PONEY')
 HostName Aliases AddressList
 -------- ------- -----------
 SRV-EQUESTRE-TEST-1.EQUESTRIA.COM {} {1.2.3.4}

j’ai un nom ou/et une IP je veux récupérer tous les alias existants.

Là c’est beaucoup, beaucoup, plus coton car DNS n’est pas du tout prévu pour renvoyer cette information dans ce sens-là pour les alias (mais IP->Nom il sait faire, je vous laisse tester). Et histoire de rien arranger ça dépend en plus de l’infra DNS en place, du nombre de zone, de serveurs et de domaines, comme on va le voir un peu plus loin. Comme c’est pas natif dans DNS comme fonction : ça demande de « biaiser », un peu, le système, et donc comme souvent dans ces cas-là : des privilèges élevés.

Et pour ça on va utiliser le programme dnscmd (sous 2008R2 mieux) qui permet d’administrer le service DNS sous Windows.
Donc pour faire ça, on va lister tous les enregistrement d’une zone DNS sur un serveur (et oui, ça peut parfois être gros comme résultat), et filtrer les enregistrements.

Connectez-vous en tant qu’admin DNS à un serveur, Puis pour lister les enregistrements d’une zone :

PS C:\Users\PIQUEACHOUX> dnscmd.exe <srv-dns> /EnumRecords domain.com .
 Returned records:
 [...]
 SRV1-TOTO 86400 CNAME TOTO.
 SRV1-TOTO-APPLI2 86400 CNAME APPLI.domain.com

Les plus attentifs d’entre-vous, et les moins alcoolisés, (ça fait plus beaucoup là normalement), noterons que ça ressemble vachement à ce qu’on a dans la MMC du serveur DNS.

Ensuite il suffit juste de filtrer avec des Regex pour avoir le serveur qui nous intéresse donc :

PS C:\Users\PIQUEACHOUX> dnscmd.exe <srv-dns> /EnumRecords domain.com . | Select-String 'CNAME\tAPPLI.*'
 
 SRV1-TOTO-APPLI2 86400 CNAME APPLI.domain.com

Pour ceux qui ont des infra DNS un peu complexe, il devrait vous manquer des enregistrements,  En fait, il manque les alias des zones que vous n’avez pas interroger. DNS n’est pas centralisé, donc il faut interroger chaque serveur de zone qui pointe potentiellement sur votre serveur.
=> Et ça devient vite relou ça…

Ah noter pour terminer que sous W8 et Server 12 le module PowerShell DNS permet quand même de faire la même opération en natif PowerShell (avec les mêmes privilèges):

PS C:\Users\PIQUEACHOUX> Get-DnsServerResourceRecord -ComputerName <srv-dns> -Name . -ZoneName domain.com -RRType CName | Where-Object {$_.RecordData.HostNameAlias -like 'CNAME\tAPPLI.*'}
HostName RecordType Timestamp TimeToLive RecordData
 -------- ---------- --------- ---------- ----------
 APPLI CNAME 0 1.00:00:00 SRV1-TOTO-APPLI2.

Pour finir en ouverture, je vous laisse imaginer comme ça peut devenir récursif si les enregistrements DNS sont « mal gérées » et qu’on se retrouve avec des jeux de pointeur du type :

ALIAS1->ALIAS2->ALIAS3->NOM1->IP
        ALIAS4->ALIAS3/

Voilà, je vous laisse jouer avec le module DNS.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *