Tuto : Géoblocage léger et souverain pour WordPress

l’Almanet doLys Gnu/Linux – Open Source – Entreprises Forums L’almanet doLys Open Source Tuto : Géoblocage léger et souverain pour WordPress

  • This topic is empty.
Affichage de 1 message (sur 1 au total)
  • Auteur
    Articles
  • #12777
    nam1962nam1962
    Keymaster

      Parce que le meilleur plugin est celui qui ne parle pas et fait le boulot.

      J’avais besoin d’une solution simple et efficace pour bloquer les requêtes provenant de certains pays sur plusieurs petits sites WordPress. Je voulais quelque chose de léger, de souverain, sans dépendance externe ni interface à surveiller. Ce tutoriel vous montre comment j’ai mis cela en place, et comment vous pouvez le faire aussi, pas à pas.

      Pourquoi ce choix ?

      • Restez maître de vos outils
      • Évitez de surcharger vos sites avec des extensions lourdes ou bavardes
      • Mutualisez intelligemment plusieurs petits sites sur un même hébergement

      Ce que fait ce système :

      • Bloque les IP provenant de pays jugés à risque ou non pertinents
      • Renvoie un simple HTTP 403 (ce qui affiche une page blanche… into the void !)
      • Enregistre les tentatives dans un fichier par site (sans fioritures)

      Prérequis

      • Disposez d’un hébergement mutualisé (type PlanetHoster, EX2, etc.)
      • Accédez aux fichiers via FTP ou SSH
      • Utilisez WordPress avec accès au dossier mu-plugins

      Mise en place pas à pas

      1. Créez un répertoire geoip mutualisé

      Placez-vous à la racine de votre hébergement (en dehors de public_html) et créez un dossier geoip :

      /chemin/vers/compte/geoip/

      Dans ce dossier, placez :

      • GeoLite2-Country.mmdb : la base MaxMind GeoIP
      • vendor/ : les librairies PHP nécessaires
        • Si Composer est indisponible, utilisez un dossier vendor/ préconstruit (voir lien fourni en bas de page)
      • logs/ : un fichier .log par domaine
      • update-geoip.php : le script de mise à jour mensuelle

      2. Installez la librairie PHP GeoIP2

      Si Composer est disponible sur votre hébergement, ouvrez un terminal et tapez :

      composer require geoip2/geoip2

      Sinon, téléchargez le dossier vendor/ déjà prêt, que je vous fournis ici : [lien de téléchargement à insérer]

      3. Ajoutez le plugin mu-plugin WordPress

      Dans chaque site WordPress concerné, accédez au dossier suivant ou créez-le si besoin :

      /wp-content/mu-plugins/

      Ajoutez-y ce fichier geoip-blocker.php :

      <?php
      require_once '/chemin/vers/compte/geoip/vendor/autoload.php';
      
      use GeoIp2\Database\Reader;
      
      try {
          $reader = new Reader('/chemin/vers/compte/geoip/GeoLite2-Country.mmdb');
          $record = $reader->country($_SERVER['REMOTE_ADDR']);
          $countryCode = $record->country->isoCode;
      
          $blockedCountries = ['AO', 'BD', 'BF', 'BJ', 'CD', 'CF', 'CG', 'CI', 'CN', 'DJ', 'DZ', 'EH', 'ER', 'ET',
                               'GQ', 'IQ', 'IR', 'KP', 'MR', 'MW', 'MZ', 'NA', 'NE', 'NG', 'NI', 'PK', 'PS', 'SD',
                               'SN', 'SO', 'SS', 'SY', 'TD', 'TG', 'UA', 'UG', 'ZM', 'ZW', 'GH'];
      
          if (in_array($countryCode, $blockedCountries)) {
              $host = $_SERVER['HTTP_HOST'] ?? 'unknown';
              $safeHost = preg_replace('/[^a-zA-Z0-9.-]/', '_', strtolower($host));
              $logDir = '/chemin/vers/compte/geoip/logs';
              if (!is_dir($logDir)) {
                  mkdir($logDir, 0755, true);
              }
              $logFile = $logDir . '/' . $safeHost . '.log';
              $logLine = date('Y-m-d H:i:s') . " - Blocked IP: " . $_SERVER['REMOTE_ADDR'] . " - Country: " . $countryCode . "\n";
              file_put_contents($logFile, $logLine, FILE_APPEND);
      
              header('HTTP/1.1 403 Forbidden');
              exit;
          }
      } catch (Exception $e) {
          // Ne rien bloquer en cas d'erreur
      }

      Ce fichier s’exécute automatiquement dès le chargement de WordPress, sans activation.

      4. Automatisez la mise à jour de la base

      Créez un fichier update-geoip.php dans le dossier geoip et ajoutez-y le script de mise à jour. Il devra :

      • Télécharger la base depuis MaxMind (via votre licence)
      • Remplacer la base .mmdb
      • Nettoyer les fichiers temporaires

      Programmez ensuite une tâche cron :

      0 4 2 * * /chemin/vers/php /chemin/vers/geoip/update-geoip.php >> /chemin/vers/geoip/update.log 2>&1

      Exemple de log

      Fichier : /chemin/vers/geoip/logs/monsite.com.log

      Contenu :

      2025-03-22 07:38:00 - Blocked IP: 1.2.3.4 - Country: CN

      Chaque domaine a son propre fichier log.


      Effectuez un test

      Quand tout est en place, je vous recommande de tester ainsi :

      • Ajoutez temporairement 'FR' à la liste noire
      • Rechargez le site : vous verrez une page blanche (403)
      • Consultez le log correspondant pour vérifier que l’IP a été bloquée
      • Retirez 'FR' ensuite pour éviter de vous bloquer !

      Notes complémentaires

      • Ce système est simple, statique, sans interface
      • Il peut être enrichi si vous en ressentez le besoin (statistiques, bannissements temporaires, affichages personnalisés)
      • Il fonctionne en toute discrétion, sans plugin visible ni impact sur les performances

      Adaptez ce fonctionnement à vos besoins. Ce dispositif a été conçu pour protéger en silence et durablement une flotte de petits sites WordPress mutualisés.

      Made with soin, café, et sans Cloudflare.

       

      Un jeune site que j'aime bien, la ferrari du T-shirt ...bio en plus : GoudronBlanc

    Affichage de 1 message (sur 1 au total)
    • Vous devez être connecté pour répondre à ce sujet.