DNS Server Windows
Le service DNS Windows est essentiel pour Active Directory et la résolution de noms en entreprise.
Architecture DNS Windows
Intégration Active Directory
DNS ET ACTIVE DIRECTORY
══════════════════════════════════════════════════════════
AD-Integrated DNS (recommandé) :
────────────────────────────────
• Zones stockées dans AD (pas de fichiers)
• Réplication via AD (sécurisée)
• Multi-master (tous les DCs peuvent écrire)
• Secure Dynamic Updates
┌─────────────────────────────────────────────────────────┐
│ Active Directory │
│ ┌─────────────────────────────────────────────────┐ │
│ │ DNS Zone: corp.local │ │
│ │ │ │
│ │ DC01 ◄───────────────────────► DC02 │ │
│ │ │ Réplication │ │ │
│ │ └───────────────┬──────────────┘ │ │
│ │ │ │ │
│ │ ┌────────────────┼────────────────┐ │ │
│ │ ▼ ▼ ▼ │ │
│ │ _ldap._tcp _kerberos._tcp A records │ │
│ │ _gc._tcp _kpasswd._tcp SRV records │ │
│ └─────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────┘
Types de Zones
| Type | Description | Cas d'usage |
|---|---|---|
| Primary | Zone maître, lecture/écriture | Serveur principal |
| Secondary | Copie lecture seule | Redondance, performance |
| Stub | NS et SOA uniquement | Délégation, résolution |
| AD-Integrated | Stockée dans AD | Domaines AD (recommandé) |
Installation et Configuration
Installer le Rôle DNS
# Installer le rôle DNS Server
Install-WindowsFeature -Name DNS -IncludeManagementTools
# Vérifier l'installation
Get-WindowsFeature DNS
# Sur un DC, DNS est généralement installé automatiquement
Créer des Zones
# Créer une zone primaire intégrée AD
Add-DnsServerPrimaryZone -Name "corp.local" `
-ReplicationScope "Forest" `
-DynamicUpdate "Secure"
# Créer une zone de recherche inversée
Add-DnsServerPrimaryZone -NetworkId "10.10.0.0/16" `
-ReplicationScope "Forest" `
-DynamicUpdate "Secure"
# Créer une zone secondaire
Add-DnsServerSecondaryZone -Name "partner.com" `
-ZoneFile "partner.com.dns" `
-MasterServers 10.20.1.10
# Créer une zone stub
Add-DnsServerStubZone -Name "subsidiary.corp" `
-MasterServers 10.30.1.10 `
-ReplicationScope "Forest"
# Lister les zones
Get-DnsServerZone
Configurer les Enregistrements
# Enregistrement A (Host)
Add-DnsServerResourceRecordA -Name "srv-web-01" `
-ZoneName "corp.local" `
-IPv4Address "10.10.1.100"
# Enregistrement AAAA (IPv6)
Add-DnsServerResourceRecordAAAA -Name "srv-web-01" `
-ZoneName "corp.local" `
-IPv6Address "2001:db8::100"
# Enregistrement CNAME (Alias)
Add-DnsServerResourceRecordCName -Name "www" `
-ZoneName "corp.local" `
-HostNameAlias "srv-web-01.corp.local"
# Enregistrement MX (Mail)
Add-DnsServerResourceRecordMX -Name "." `
-ZoneName "corp.local" `
-MailExchange "mail.corp.local" `
-Preference 10
# Enregistrement TXT
Add-DnsServerResourceRecordTxt -Name "_dmarc" `
-ZoneName "corp.local" `
-DescriptiveText "v=DMARC1; p=quarantine;"
# Enregistrement SRV
Add-DnsServerResourceRecord -ZoneName "corp.local" `
-Name "_http._tcp" `
-Srv `
-DomainName "srv-web-01.corp.local" `
-Priority 0 `
-Weight 100 `
-Port 80
# Enregistrement PTR (reverse)
Add-DnsServerResourceRecordPtr -Name "100" `
-ZoneName "1.10.10.in-addr.arpa" `
-PtrDomainName "srv-web-01.corp.local"
Gérer les Enregistrements
# Lister les enregistrements d'une zone
Get-DnsServerResourceRecord -ZoneName "corp.local"
# Filtrer par type
Get-DnsServerResourceRecord -ZoneName "corp.local" -RRType A
Get-DnsServerResourceRecord -ZoneName "corp.local" -RRType CNAME
# Rechercher un enregistrement
Get-DnsServerResourceRecord -ZoneName "corp.local" -Name "srv-web-01"
# Modifier un enregistrement
$old = Get-DnsServerResourceRecord -ZoneName "corp.local" -Name "srv-web-01" -RRType A
$new = $old.Clone()
$new.RecordData.IPv4Address = [System.Net.IPAddress]::Parse("10.10.1.101")
Set-DnsServerResourceRecord -ZoneName "corp.local" -OldInputObject $old -NewInputObject $new
# Supprimer un enregistrement
Remove-DnsServerResourceRecord -ZoneName "corp.local" -Name "old-server" -RRType A -Force
Forwarders et Conditional Forwarders
Forwarders (Redirecteurs)
# Configurer les forwarders (DNS externes)
Set-DnsServerForwarder -IPAddress "8.8.8.8","8.8.4.4" -PassThru
# Ajouter un forwarder
Add-DnsServerForwarder -IPAddress "1.1.1.1"
# Supprimer un forwarder
Remove-DnsServerForwarder -IPAddress "8.8.4.4"
# Voir les forwarders
Get-DnsServerForwarder
# Désactiver les root hints si forwarders configurés
Set-DnsServerForwarder -UseRootHint $false
Conditional Forwarders
# Forwarder conditionnel pour un domaine partenaire
Add-DnsServerConditionalForwarderZone -Name "partner.com" `
-MasterServers 10.20.1.10,10.20.1.11 `
-ReplicationScope "Forest"
# Pour un trust AD
Add-DnsServerConditionalForwarderZone -Name "trusted-forest.com" `
-MasterServers 172.16.1.10 `
-ReplicationScope "Forest"
# Lister les conditional forwarders
Get-DnsServerZone | Where-Object { $_.ZoneType -eq "Forwarder" }
# Modifier
Set-DnsServerConditionalForwarderZone -Name "partner.com" `
-MasterServers 10.20.1.10,10.20.1.11,10.20.1.12
# Supprimer
Remove-DnsServerZone -Name "old-partner.com" -Force
Dynamic Updates
Configuration
DYNAMIC UPDATES
══════════════════════════════════════════════════════════
Types :
• None - Pas de mise à jour dynamique
• NonsecureAndSecure - Tous peuvent mettre à jour (risqué!)
• Secure - Authentification Kerberos requise (recommandé)
Secure Dynamic Update (AD-Integrated) :
• Seuls les comptes AD authentifiés peuvent créer/modifier
• Le créateur devient propriétaire de l'enregistrement
• Utilise GSS-TSIG (Kerberos)
# Configurer Secure Dynamic Updates (recommandé)
Set-DnsServerPrimaryZone -Name "corp.local" -DynamicUpdate Secure
# Vérifier la configuration
Get-DnsServerZone -Name "corp.local" | Select-Object ZoneName, DynamicUpdate
# Configurer le scavenging (nettoyage des enregistrements obsolètes)
Set-DnsServerZoneAging -Name "corp.local" `
-Aging $true `
-NoRefreshInterval (New-TimeSpan -Days 7) `
-RefreshInterval (New-TimeSpan -Days 7)
# Activer le scavenging au niveau serveur
Set-DnsServerScavenging -ScavengingState $true -ScavengingInterval (New-TimeSpan -Days 7)
# Forcer le scavenging
Start-DnsServerScavenging
Enregistrement des Clients
# Sur un client, forcer l'enregistrement DNS
ipconfig /registerdns
# Vérifier l'enregistrement
nslookup pc001.corp.local
# Sur le serveur DNS, voir les enregistrements dynamiques
Get-DnsServerResourceRecord -ZoneName "corp.local" |
Where-Object { $_.Timestamp -ne $null } |
Select-Object HostName, RecordType, Timestamp
DNSSEC
Signer une Zone
# Signer une zone avec DNSSEC
Invoke-DnsServerZoneSign -ZoneName "corp.local" -SignWithDefault
# Vérifier la signature
Get-DnsServerDnsSecZoneSetting -ZoneName "corp.local"
# Voir les clés
Get-DnsServerSigningKey -ZoneName "corp.local"
# Configurer le rollover automatique des clés
Set-DnsServerSigningKey -ZoneName "corp.local" `
-KeyType KeySigningKey `
-RolloverPeriod (New-TimeSpan -Days 365)
Trust Anchors
# Configurer les Trust Anchors (pour validation DNSSEC)
Add-DnsServerTrustAnchor -Name "corp.local" `
-CryptoAlgorithm RsaSha256 `
-KeyTag 12345 `
-DigestType Sha256 `
-Digest "ABCD1234..."
# Lister les Trust Anchors
Get-DnsServerTrustAnchor
# Activer la validation DNSSEC
Set-DnsServerRecursion -SecureResponse $true
DNS Policies
Filtrage par Requête
# Bloquer un domaine (malware, etc.)
Add-DnsServerQueryResolutionPolicy -Name "Block-Malware" `
-Action DENY `
-Fqdn "EQ,*.malware.com"
# Rediriger vers un sinkhole
Add-DnsServerQueryResolutionPolicy -Name "Sinkhole-Phishing" `
-Action DENY `
-Fqdn "EQ,*.phishing-domain.com" `
-ZoneName "corp.local"
# Lister les policies
Get-DnsServerQueryResolutionPolicy
# Supprimer une policy
Remove-DnsServerQueryResolutionPolicy -Name "Block-Malware"
Split-Brain DNS
# Réponse différente selon le subnet source
# Créer les scopes de zone
Add-DnsServerZoneScope -ZoneName "corp.local" -Name "Internal"
Add-DnsServerZoneScope -ZoneName "corp.local" -Name "External"
# Ajouter des enregistrements par scope
Add-DnsServerResourceRecord -ZoneName "corp.local" -ZoneScope "Internal" `
-A -Name "www" -IPv4Address "10.10.1.100"
Add-DnsServerResourceRecord -ZoneName "corp.local" -ZoneScope "External" `
-A -Name "www" -IPv4Address "203.0.113.100"
# Créer les subnets clients
Add-DnsServerClientSubnet -Name "InternalSubnet" -IPv4Subnet "10.0.0.0/8"
Add-DnsServerClientSubnet -Name "ExternalSubnet" -IPv4Subnet "0.0.0.0/0"
# Créer les policies de résolution
Add-DnsServerQueryResolutionPolicy -Name "InternalPolicy" `
-Action ALLOW `
-ClientSubnet "EQ,InternalSubnet" `
-ZoneScope "Internal,1" `
-ZoneName "corp.local"
Add-DnsServerQueryResolutionPolicy -Name "ExternalPolicy" `
-Action ALLOW `
-ClientSubnet "EQ,ExternalSubnet" `
-ZoneScope "External,1" `
-ZoneName "corp.local"
Diagnostic et Troubleshooting
Commandes de Base
# Tester la résolution
Resolve-DnsName "srv-web-01.corp.local"
Resolve-DnsName "srv-web-01.corp.local" -Server DC01
Resolve-DnsName "corp.local" -Type SOA
# nslookup interactif
nslookup
> server DC01.corp.local
> set type=any
> corp.local
# Vérifier les enregistrements SRV AD
Resolve-DnsName "_ldap._tcp.dc._msdcs.corp.local" -Type SRV
Resolve-DnsName "_kerberos._tcp.dc._msdcs.corp.local" -Type SRV
# Test de connectivité DNS
Test-DnsServer -IPAddress 10.10.1.10 -ZoneName "corp.local"
Statistiques et Cache
# Statistiques du serveur DNS
Get-DnsServerStatistics
# Voir le cache
Show-DnsServerCache
# Vider le cache
Clear-DnsServerCache
# Sur un client
ipconfig /displaydns
ipconfig /flushdns
Event Logs
# Activer le logging DNS
Set-DnsServerDiagnostics -All $true
# Ou logging sélectif
Set-DnsServerDiagnostics -Queries $true `
-Answers $true `
-Notifications $true `
-Update $true `
-LogFilePath "C:\DNS-Logs\dns.log" `
-MaxMBFileSize 100
# Voir les événements DNS
Get-WinEvent -LogName "DNS Server" -MaxEvents 50
# Événements d'erreur
Get-WinEvent -FilterHashtable @{
LogName = "DNS Server"
Level = 2 # Error
} -MaxEvents 20
DCDiag pour DNS
# Tests DNS via DCDiag
dcdiag /test:dns /v
# Test spécifique d'enregistrement
dcdiag /test:RegisterInDNS
# Vérifier les enregistrements AD
nltest /dsgetdc:corp.local
nltest /dclist:corp.local
Haute Disponibilité
Configuration Recommandée
HAUTE DISPONIBILITÉ DNS
══════════════════════════════════════════════════════════
Option 1 : AD-Integrated (recommandé)
─────────────────────────────────────
• Tous les DCs = serveurs DNS
• Réplication automatique via AD
• Multi-master writes
Option 2 : Primary + Secondary
──────────────────────────────
• 1 Primary (read/write)
• N Secondary (read-only)
• Zone transfer pour réplication
Configuration clients :
───────────────────────
• 2 serveurs DNS minimum par client
• DNS primaire = DC local
• DNS secondaire = DC autre site
# Configurer les transferts de zone (si non AD-integrated)
Set-DnsServerPrimaryZone -Name "corp.local" `
-SecureSecondaries TransferToSecureServers `
-SecondaryServers 10.10.2.10,10.10.2.11
# Notifier les secondaires
Set-DnsServerPrimaryZone -Name "corp.local" `
-Notify NotifyServers `
-NotifyServers 10.10.2.10,10.10.2.11
# Sur le secondaire, configurer le transfert
Set-DnsServerSecondaryZone -Name "corp.local" `
-MasterServers 10.10.1.10
Bonnes Pratiques
Checklist DNS Windows:
Configuration:
- [ ] DNS intégré AD (pas de fichiers de zone)
- [ ] Réplication scope = Forest ou Domain
- [ ] Secure Dynamic Updates uniquement
- [ ] Scavenging activé (7 jours)
Sécurité:
- [ ] Forwarders = DNS de confiance
- [ ] Conditional forwarders pour trusts
- [ ] DNSSEC si exposition externe
- [ ] Policies de blocage malware
Performance:
- [ ] DNS sur tous les DCs
- [ ] 2 DNS par client (sites différents)
- [ ] Cache suffisamment grand
Monitoring:
- [ ] Logs activés
- [ ] Alertes sur erreurs
- [ ] Test régulier des résolutions
Références
Voir aussi :
- Active Directory - DNS et AD
- DHCP Server - Configuration DHCP
- Network Troubleshooting - Diagnostic réseau