2) Services Réseau & DNS
DNS (résolution, zones, DNSSEC, RPZ), DHCP(v4/v6) & IPAM, NTP/Chrony/PTP, **Cloud DNS & GSLB**, **CoreDNS/K8s**, **observabilité & sécurité**.
DNS DHCP & IPAM NTP/PTP Cloud DNS CoreDNS/Kubernetes RPZ/DNSSEC
DNS — Principes & Résolution (itératif/récursif, cache, EDNS, glue)
Itératif vs Récursif
- Itératif : client (ou résolveur) interroge root → TLD → autoritatif.
- Récursif : résolveur fait tout pour le client + **cache**.
TTL & negative cache
- Respect TTL, SOA.MINIMUM pour NXDOMAIN.
- Prefetch / serve-stale pour résilience.
Éléments clés
- Glue records pour délégation interne au domaine.
- QNAME minimization pour confidentialité.
Client → Résolveur (récursif) → Root → TLD (.com) → Authority (example.com) → A/AAAA
↑ cache TTL ──────────────────────────────────────────────────────────┘Stub resolver (OS)
- /etc/resolv.conf, systemd-resolved, /etc/nsswitch.conf
Recursor
- Unbound/Knot/PDNS Recursor · DoH/DoT · RPZ/policy.
Autoritatif
- BIND/NSD/PowerDNS · AXFR/IXFR + NOTIFY · DNSSEC.
- EDNS(0) : taille UDP, options (ECS…).
- Glue : A/AAAA des NS dans la zone parente.
- QNAME-min : n’envoie que la partie nécessaire à chaque délégation.
# Linux — résolution
cat /etc/resolv.conf
grep hosts /etc/nsswitch.conf
resolvectl status; resolvectl flush-caches# Résolutions courantes
dig +trace example.com
dig NS example.com +noall +answer
dig A example.com +short
# Validation DNSSEC (si résolveur valide)
delv example.com A- Bloquer ICMP “Fragmentation Needed” casse PMTUD → re-quêtes lentes.
- Firewalls L7 qui cassent DoH/DoT sans fallback.
Zones & Enregistrements — SOA/NS, A/AAAA, CNAME/MX, TXT, SRV, CAA, PTR
| Record | Champs | Notes |
|---|---|---|
| SOA | mname, rname, serial, refresh/retry/expire, negative TTL | Serial style: YYYYMMDDnn |
| NS | min. 2 NS, idéalement anycast | Coller au registrar |
| TTL | Apex élevé, dynamiques bas | Réduire TTL avant migration |
- A/AAAA : adr IPv4/IPv6.
- CNAME : alias (pas à l’apex) ; utiliser **ALIAS/ANAME** pour apex.
- MX : prio 10/20… ; prévoir SPF/DKIM/DMARC.
# SPF/DKIM/DMARC (exemples)
_dmarc TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com"
selector._domainkey TXT "v=DKIM1; k=rsa; p=BASE64..."
@ TXT "v=spf1 ip4:203.0.113.0/24 include:_spf.example.net ~all"- SRV : `_service._proto.domain` → host, port, prio/weight.
- CAA : autoriser AC (ex:
0 issue "letsencrypt.org").
- PTR : in-addr.arpa/ip6.arpa (reverse), important pour mail/anti-spam.
- Délégation reverse par FAI/Cloud.
$ORIGIN example.com.
$TTL 3600
@ IN SOA ns1.example.com. hostmaster.example.com. (2025092101 3600 600 1209600 300)
IN NS ns1.example.com.
IN NS ns2.example.com.
@ IN A 203.0.113.10
www IN CNAME @
mail IN A 203.0.113.20
@ IN MX 10 mail.example.com.
_dmarc IN TXT "v=DMARC1; p=quarantine; rua=mailto:dmarc@example.com"
@ IN CAA 0 issue "letsencrypt.org"DNSSEC — Signature & Validation (KSK/ZSK, RRSIG, NSEC/NSEC3)
- DNSKEY/DS : ancre parent via DS. RRSIG signe RRsets.
- Existence prouvée via NSEC/NSEC3.
- ZSK (RR) ; KSK (DNSKEY). Rollover avec double signature + publication DS.
# BIND — clés & signature
dnssec-keygen -a ECDSAP256SHA256 -b 256 -n ZONE example.com
dnssec-keygen -f KSK -a ECDSAP256SHA256 -b 512 -n ZONE example.com
dnssec-signzone -o example.com db.example.com Kexample.com.*.key
# Publier DS au registrar# Unbound — validation
server:
auto-trust-anchor-file: "/var/lib/unbound/root.key"
harden-dnssec-stripped: yes
val-clean-additional: yesdig A example.com +dnssec +multi
delv example.com A
# Problèmes fréquents : DS absent, horloge fausse, serial non incrémentéRésolveur récursif — Unbound/Knot/PDNS, Cache, DoT/DoH, QNAME-min, ECS
# /etc/unbound/unbound.conf (extrait)
server:
interface: 0.0.0.0
interface: ::0
access-control: 10.0.0.0/8 allow
cache-max-ttl: 86400
cache-min-ttl: 30
prefetch: yes
serve-expired: yes
qname-minimisation: yes
harden-glue: yes
harden-dnssec-stripped: yes
forward-zone:
name: "."
forward-tls-upstream: yes
forward-addr: 1.1.1.1@853
forward-addr: 9.9.9.9@853# Knot (kresd)
policy.add(policy.all(policy.FORWARD({'1.1.1.1', '9.9.9.9'})))
cache.size = 200*MB
modules = {'stats', 'policy', 'cache'}
# PDNS Recursor
webserver=yes
allow-from=10.0.0.0/8
max-cache-ttl=86400
dnssec=validate- DoT 853 (TLS), DoH 443 (HTTPS). Confidentialité vs latence.
- Proxy DoH d’entreprise pour clients nomades.
- QNAME-min ON (privacy). ECS pour CDN (au détriment de la confidentialité).
# Unbound
unbound-control stats_noreset | head
# PDNS Recursor
rec_control get-all
# Capture
tcpdump -ni any port 53DNS Autoritatif — Design, BIND/NSD/PowerDNS, AXFR/IXFR, Anycast
- Master/Secondary (hidden master possible), no recursion sur authorities.
- Limiter allow-transfer + TSIG, activer RRL.
options {
recursion no;
allow-transfer { key axfr-key; };
rate-limit { responses-per-second 20; };
};
key "axfr-key" { algorithm hmac-sha256; secret "BASE64=="; };
zone "example.com" IN {
type master; file "db.example.com";
also-notify { 198.51.100.2; };
};# NSD
server: hide-version: yes
zone: { name: "example.com", zonefile: "example.com.zone" }
# PowerDNS Authoritative
allow-axfr-ips=198.51.100.2
disable-axfr=no
api=yes
api-key=secret# AXFR/IXFR/Notify
dig AXFR example.com @ns1.example.com
rndc notify example.com- Anycast : même IP servie depuis plusieurs POP, contrôle santé + BGP.
- Régions/AS différents pour résilience.
Split-Horizon & Vues — Interne/Externe, Private DNS, Search domains
- Zones **interne** (adresses privées) vs **externe** (public).
- Résolveur interne qui “voit” les private zones + forwarders spécifiques.
- Éviter split-brain · documentation stricte.
acl "corp" { 10.0.0.0/8; };
view "internal" {
match-clients { "corp"; };
recursion yes;
zone "corp.local" { type master; file "corp.local.zone"; };
};
view "external" {
match-clients { any; };
recursion no;
zone "example.com" { type master; file "example.com.zone"; };
};- Private zones en cloud privé/hybride ; proxies DoH pour nomades.
Performance & Caching — TTL, Negative cache, Anycast/GeoDNS, RRL, Apex ALIAS
- Réduire TTL avant migration; contrôler NXDOMAIN TTL.
- Prefetch & serve-stale pour haute dispo.
- Anycast NS + health-checks routing.
- GeoDNS par vue/policy/ECS.
# BIND RRL
options { rate-limit { responses-per-second 20; }; };- Apex ne supporte pas CNAME → **ALIAS/ANAME** côté provider.
# Bench résolveur
kdig -d @127.0.0.1 example.com
resperf -s 127.0.0.1 -l 30 -q 20000Sécurité DNS — Cache poisoning, Rebinding, Amplification, TSIG, RPZ
- Poisoning : random port/ID, DNSSEC.
- Rebinding : bloquer résolutions vers RFC1918 en recursor.
- Amplification : limiter ANY/records lourds, RRL, BCP38 anti-spoof.
# BIND — authorities durcis
options { recursion no; };
zone "example.com" { type master; allow-transfer { key axfr-key; }; };
# Unbound — durcissement
server:
harden-glue: yes
harden-dnssec-stripped: yes
hide-identity: yes
hide-version: yes# Unbound RPZ simple
local-zone: "malware.local" redirect
local-data: "malware.local A 0.0.0.0"
# PDNS/BIND supportent des feeds externes# Journaux & métriques
journalctl -u unbound | tail
rndc querylog on; tail -f /var/log/named/query.log
# Export Prometheus selon résolveurDHCP(v4/v6), Options, Relais & IPAM — Kea/dnsmasq, Snooping & PXE
- DHCPv4 : DORA · DHCPv6 : Solicit/Advertise/Request/Reply.
- Réservations (MAC/DUID), options (router/DNS/NTP/domain-search).
# /etc/kea/kea-dhcp4.conf (extrait)
{
"interfaces-config": {"interfaces": ["eth0"]},
"subnet4": [{
"subnet": "10.10.10.0/24",
"pools": [{"pool": "10.10.10.100 - 10.10.10.200"}],
"routers": ["10.10.10.1"],
"option-data": [
{"name": "domain-name-servers", "data": "10.10.10.5"},
{"name": "domain-name", "data": "corp.local"}
]
}],
"lease-database": {"type": "memfile"}
}# dnsmasq
dhcp-range=10.10.10.100,10.10.10.200,12h
dhcp-option=option:router,10.10.10.1
dhcp-option=option:dns-server,10.10.10.5
domain=corp.local- Relay (ip helper) vers serveur central.
- DHCP Snooping sur switches → bloque **rogue DHCP**.
- IPAM : cohérence plan d’adressage + réservations documentées.
# PXE (dnsmasq)
dhcp-match=set:efi-x86_64,option:client-arch,7
dhcp-boot=tag:efi-x86_64,grubx64.efi,pxe.example.com,10.10.10.20
# DHCPv6 Kea (extrait)
"subnet6":[{"subnet":"2001:db8:a::/64",
"pools":[{"pool":"2001:db8:a::100-2001:db8:a::1ff"}],
"option-data":[{"name":"dns-servers","data":"2001:db8:a::53"}]}]NTP/Chrony & PTP — Synchronisation, offset/jitter, PHC/NIC
- Stratum 0→1→… · multiples sources proches.
- Offset/jitter impacte Kerberos, logs, TLS, DNSSEC.
- VM/containers : préférer chrony.
# /etc/chrony/chrony.conf
server time1.example.net iburst
server time2.example.net iburst
driftfile /var/lib/chrony/chrony.drift
makestep 1.0 3
allow 10.0.0.0/8
leapsectz right/UTCchronyc sources -v
chronyc tracking
# ntpd
ntpq -p- PTP via
ptp4l/phc2sys: micro-secondes si NIC/PHC OK. - Topologie avec Boundary/Transparent clocks pour DC faible latence.
Cloud DNS & GSLB — Route53, Cloud DNS, Azure DNS, Health checks, Failover
- Weighted/Latency/Geo policies, health checks + failover actif/passif.
- Multi-cloud : délégations sub-zones + monitoring cross-regions.
# Route53 — enregistrements (conceptuel)
A/AAAA alias vers ALB/CloudFront; HealthCheck HTTP(S) sur /health
Latency-based routing entre eu-west-1 et us-east-1# Terraform — AWS Route53 (extraits)
resource "aws_route53_record" "www" {
zone_id = data.aws_route53_zone.primary.zone_id
name = "www"
type = "A"
alias { name = aws_lb.app.dns_name, zone_id = aws_lb.app.zone_id, evaluate_target_health = true }
}CoreDNS & Kubernetes — Plugins, stub/forward, discovery, NodeLocal DNS
# CoreDNS Corefile (extrait)
.:53 {
errors
health
ready
kubernetes cluster.local in-addr.arpa ip6.arpa {
pods verified
fallthrough in-addr.arpa ip6.arpa
}
forward . /etc/resolv.conf
cache 300
prometheus :9153
log
}- Nom de service :
svc.ns.svc.cluster.local. - SRV pour services tête-less; externalName (CNAME) pour alias externes.
- NodeLocal DNSCache réduit latence et évite NAT conntrack sur nœuds.
- Exporter métriques CoreDNS vers Prometheus & dashboards Grafana.
Observabilité DNS — Logs, métriques, profiling, alerting
- Taux NXDOMAIN, SERVFAIL, latence p50/p95, hit/miss cache.
- Nombre de clients & top qnames/qtypes.
# PowerDNS Recursor — web/metrics
rec_control get-all
# CoreDNS — prometheus :9153 ; logs "log" plugin- Alerter quand NXDOMAIN ou SERVFAIL > seuil, ou si hit-ratio < 70%.
- Blackhole detection (rupture anycast/health check).
