Se protéger contre un nom de domaine non légitime qui pointe vers votre serveur (Nginx, Apache)


Il peut arriver qu’un nom de domaine que vous ne possédez pas soit configuré pour pointer vers l’adresse IP de votre serveur. Cela peut entraîner des problèmes :

  • 📉 Perte d’image de marque (le site apparaît sous un nom frauduleux),
  • ⚖️ Problèmes juridiques (contenu associé à un domaine que vous ne contrôlez pas),
  • 🔒 Risques de phishing ou d’abus.

Dans ce tutoriel, voyons comment bloquer efficacement ces domaines non autorisés sur les serveurs web Nginx et Apache.


📌 Pourquoi cela arrive-t-il ?

Un tiers peut créer un enregistrement DNS (de type A) vers votre IP publique. Si votre serveur n’est pas bien configuré, il acceptera de servir votre site quel que soit le domaine utilisé.


🔧 1. Protéger son serveur Nginx

Par défaut, Nginx sert la première configuration server qu’il trouve si aucun server_name ne correspond. Il faut donc ajouter un bloc default_server pour rejeter les domaines inconnus.

✅ Exemple de configuration

# Bloc de sécurité : refuse tout domaine non autorisé (HTTP)
server {
    listen 80 default_server;
    listen [::]:80 default_server;
    return 444;
}

# Bloc de sécurité : refuse tout domaine non autorisé (HTTPS)
server {
    listen 443 ssl default_server;
    listen [::]:443 ssl default_server;

    ssl_certificate /etc/letsencrypt/live/votresite.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/votresite.com/privkey.pem;

    return 444;
}

🧠 À savoir :

  • Le code 444 est spécifique à Nginx : il ferme la connexion sans réponse HTTP.
  • Vous pouvez remplacer par return 403; ou rediriger vers une page de notification si nécessaire.

🔧 2. Protéger son serveur Apache

Apache est plus permissif que Nginx, il sert le premier VirtualHost défini. Pour bloquer les domaines non autorisés, il faut définir un VirtualHost par défaut avec un catch-all.

✅ Exemple de VirtualHost de rejet

<VirtualHost *:80>
    ServerName catch-all
    DocumentRoot /var/www/null

    <Directory /var/www/null>
        Require all denied
    </Directory>
</VirtualHost>

🛡 Ou rediriger :

<VirtualHost *:80>
    ServerName default
    Redirect 403 /
</VirtualHost>

Vous pouvez aussi afficher un message clair : « Ce domaine n’est pas autorisé à pointer vers ce serveur. »


📜 Bonus : bloquer par application (WordPress, etc.)

Si vous utilisez WordPress, vous pouvez renforcer la sécurité côté PHP :

if ($_SERVER['HTTP_HOST'] !== 'votresite.com' && $_SERVER['HTTP_HOST'] !== 'www.votresite.com') {
    header('HTTP/1.0 403 Forbidden');
    exit;
}

Cela garantit que même si la requête passe par Nginx ou Apache, le code PHP refuse de la servir.


🔎 Comment savoir si un domaine pointe vers votre serveur ?

1. Vérifier vos logs :

grep 'Host:' /var/log/nginx/access.log

Ou :

grep 'Host:' /var/log/apache2/access.log

Si vous voyez un Host: tontonduweb.fr (par exemple), ce domaine a bien envoyé une requête vers vous.

2. Utiliser un service de lookup :


🧯 En résumé

Action Nginx Apache
Rejeter domaine inconnu default_server + return 444 VirtualHost *:80 avec Require all denied
Côté application Vérification du $_SERVER['HTTP_HOST'] Idem
Surveillance Logs + outils externes Logs + outils externes

✅ À faire maintenant

  • [ ] Ajoutez les blocs de sécurité à votre configuration Nginx ou Apache.
  • [ ] Testez avec un nom de domaine externe pointant vers votre IP (via un curl -H 'Host: domaine-faux.fr').
  • [ ] Analysez régulièrement vos logs pour détecter des comportements suspects.