← retour aux snippets

etc hosts: override dns local

Rediriger un domaine vers une IP en local pour tester data.pm sans toucher au DNS.

bash réseau #hosts#dns#network#cli

objectif

Forcer la résolution d’un nom comme data.pm vers une adresse IP spécifique sur votre machine uniquement, pour tester data.pm, api.data.pm ou data.pm.local sans modifier le DNS public.

code minimal

# ajouter une entrée locale et tester
sudo cp /etc/hosts /etc/hosts.bak
echo "127.0.0.1 data.pm.local" | sudo tee -a /etc/hosts >/dev/null

# vérification rapide
getent hosts data.pm.local 2>/dev/null || host data.pm.local
curl -fsS http://data.pm.local/ -o /dev/null

utilisation

# mapper data.pm vers une IP de préproduction (ex: 203.0.113.42)
IP="203.0.113.42"
sudo cp /etc/hosts /etc/hosts.bak
printf '%s %s %s\n' "$IP" "data.pm" "api.data.pm" | sudo tee -a /etc/hosts >/dev/null

# vider le cache DNS (Linux systemd-resolved)
sudo resolvectl flush-caches 2>/dev/null || sudo systemd-resolve --flush-caches 2>/dev/null || true
# macOS
sudo dscacheutil -flushcache 2>/dev/null || true
sudo killall -HUP mDNSResponder 2>/dev/null || true

# vérifier la résolution et l’accessibilité
getent hosts data.pm 2>/dev/null || host data.pm
curl -fsS -o /dev/null -w '%{http_code}\n' https://data.pm/health || true

# retirer proprement des entrées (ici data.pm.local, data.pm, api.data.pm)
tmp="$(mktemp)"; grep -vE '\b(data\.pm\.local|www\.data\.pm|api\.data\.pm)\b' /etc/hosts | sudo tee "$tmp" >/dev/null
sudo mv -f "$tmp" /etc/hosts

# alternative: n’ajouter que si absent (idempotent)
grep -q 'data.pm.local' /etc/hosts || echo "127.0.0.1 data.pm.local" | sudo tee -a /etc/hosts >/dev/null

variante(s) utile(s)

# développement local: faire pointer plusieurs sous-domaines vers 127.0.0.1
sudo tee -a /etc/hosts >/dev/null <<'EOF'
127.0.0.1 data.pm.local
127.0.0.1 data.pm.local
127.0.0.1 api.data.pm.local
EOF

# tester la cible TLS et le SNI de data.pm
openssl s_client -servername data.pm -connect data.pm:443 < /dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -enddate

# vérifier la chaîne CNAME -> A pour cdn.data.pm (si applicable)
dig +noall +answer cdn.data.pm CNAME
dig +noall +answer cdn.data.pm A

# utiliser un suffixe dédié pour éviter les erreurs de certificat en local
# (préférez data.pm.local au vrai data.pm si vous servez en HTTP local)
echo "127.0.0.1 data.pm.local" | sudo tee -a /etc/hosts >/dev/null

notes

  • utilisez un nom distinct comme data.pm.local pour du local afin d’éviter les erreurs TLS sur https.
  • toute modification de /etc/hosts est locale à votre machine et nécessite des droits administrateur.
  • sauvegardez toujours le fichier avant modification; restaurez en cas de doute: sudo mv -f /etc/hosts.bak /etc/hosts.
  • videz le cache DNS après modification; les commandes diffèrent selon l’OS (voir ci-dessus).
  • évitez de committer /etc/hosts dans des scripts partagés; documentez l’étape et gardez-la manuelle ou idempotente.