DevOps 5 min de lecture

Rotation d'IP Failover sur Linux : Le Guide Production

#linux#reseau#bash#php#devops

Comment exploiter pleinement un bloc d'IPs failover sur Linux pour du scraping ou de l'API intensive. Configuration infra, routage avancé et pièges à éviter.

Dans un contexte professionnel de haute disponibilité (HA), de scraping massif ou simplement pour séparer les réputations d'envoi d'emails, disposer d'une seule adresse IP publique est souvent un goulot d'étranglement ou un risque unique de défaillance.

Les IP Failover (ou IP Additionnelles / Floating IPs) permettent à un serveur unique de posséder plusieurs identités publiques. Mais "avoir" 16 IPs ne suffit pas : encore faut-il que le trafic sortant les utilise correctement.

Ce guide n'est pas un labo théorique. C'est la documentation des commandes et stratégies que j'utilise sur des serveurs de production (Hetzner/OVH) pour gérer des pools de rotation.

1. L'Infrastructure : Configurer proprement les Failovers

La première erreur est de penser que l'ajout d'une IP suffit pour que le système l'utilise aléatoirement. Par défaut, Linux utilisera toujours l'IP principale de l'interface pour le trafic sortant (Outgoing Traffic), sauf instruction contraire.

Identifier son interface

D'abord, repérez votre interface principale. Sur les serveurs modernes, ce n'est plus toujours eth0.

ip link show
# Cherchez l'interface qui a l'état UP, ex: enp3s0 ou eth0

Ajout des IPs à chaud (Runtime)

Pour tester sans redémarrer le serveur ni risquer de casser la config réseau persistante, utilisez la commande ip. Supposons que votre fournisseur vous a attribué l'IP 203.0.113.42.

# Syntaxe : ip addr add {IP}/32 dev {INTERFACE}
sudo ip addr add 203.0.113.42/32 dev eth0 label eth0:1

# Vérification
ip addr show eth0

Attention : Le masque /32 est crucial sur la plupart des infrastructures cloud (OVH, Hetzner) pour les IPs failover, car elles ne font pas partie du sous-réseau natif de l'interface principale.

Script de montage en masse

Si vous avez un bloc /29 ou /28, ne tapez pas les commandes à la main. Voici un snippet bash pour monter une liste d'IPs.

#!/bin/bash
# ips.txt contient une IP par ligne
IFACE="eth0"
COUNTER=1

while read ip; do
  echo "Adding $ip to $IFACE:$COUNTER"
  ip addr add $ip/32 dev $IFACE label $IFACE:$COUNTER
  ((COUNTER++))
done < ips.txt

2. Méthode Applicative : Le contrôle total

C'est la méthode recommandée pour la production (Web Workers, Scraping, API Clients). Elle consiste à laisser votre code choisir explicitement l'interface de sortie. C'est robuste, thread-safe, et ne nécessite pas de règles pare-feu complexes/fragiles.

Avec cURL (Ligne de commande)

L'option magique est --interface.

# Requête via l'IP failover spécifique
curl --interface 203.0.113.42 https://api.ipify.org

Avec PHP (Guzzle / Curl)

Si vous codez un scraper ou un worker Laravel, vous pouvez configurer le client HTTP pour utiliser une IP spécifique. C'est ici que réside la vraie puissance de la rotation : vous pouvez implémenter une logique de "Cooldown" sur les IPs bannies.

use GuzzleHttp\Client;

class RotatingClient {
    protected $ips = ['203.0.113.42', '203.0.113.43', '203.0.113.44'];
    
    public function request($url) {
        // Sélection aléatoire ou Round-Robin via Redis
        $ip = $this->ips[array_rand($this->ips)];
        
        $client = new Client();
        
        try {
            $response = $client->get($url, [
                'curl' => [
                    // C'est ici que la magie opère
                    CURLOPT_INTERFACE => $ip,
                    // Timeout agressif pour éviter de bloquer sur une IP morte
                    CURLOPT_TIMEOUT => 5 
                ]
            ]);
            return $response;
        } catch (\Exception $e) {
            // Logique de ban temporaire de l'IP ici
            $this->markIpAsBad($ip); 
            throw $e;
        }
    }
}

3. Méthode Système : La rotation via iptables

Parfois, vous ne contrôlez pas l'application (binaire fermé, conteneur Docker tiers, script legacy). Vous devez forcer la rotation au niveau du noyau Linux (Netfilter).

Nous allons utiliser le module statistic d'iptables pour répartir le trafic sortant sur plusieurs IPs sources (SNAT).

Le concept SNAT (Source NAT)

Nous modifions l'en-tête du paquet sortant juste avant qu'il ne quitte le serveur (POSTROUTING) pour changer l'IP source.

Commande pour une rotation à 3 IPs

Supposons que nous voulons tourner sur 3 IPs avec une probabilité égale. C'est une logique de "n-1".

# Vider la table NAT (Attention si Docker est actif !)
# iptables -t nat -F POSTROUTING 

# 1. 33% de chance de prendre l'IP .42
iptables -t nat -A POSTROUTING -o eth0 -m statistic --mode random --probability 0.33 -j SNAT --to-source 203.0.113.42

# 2. 50% de chance sur le RESTE du trafic (donc 33% du total) de prendre l'IP .43
iptables -t nat -A POSTROUTING -o eth0 -m statistic --mode random --probability 0.5 -j SNAT --to-source 203.0.113.43

# 3. Tout le reste (les derniers 33%) prend l'IP .44
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 203.0.113.44

Avantages : Transparent pour n'importe quel processus lançant des requêtes. Inconvénients : Difficile à déboguer. Le "Connection Tracking" (conntrack) peut parfois faire coller une session TCP à une IP même si vous vouliez changer. Pour HTTPS, c'est généralement OK car chaque requête est souvent une nouvelle connexion.

4. Retours du terrain

Avoir implémenté cela pour des clients scrapant des millions de pages immobilières, voici les leçons apprises dans la douleur.

  • Vérifiez vos IPs avant usage : Les blocs failover fraîchement achetés sont parfois déjà blacklistés (recyclage d'IPs). Passez un script de vérification sur toutes vos IPs avant de les mettre en prod.
  • Le Timeout est votre ami : Une IP failover peut tomber (routing issue chez l'hébergeur) sans que le serveur principal ne tombe. Votre code doit fail-fast si une interface ne répond pas.
  • Attention au Subnet Ban : Si vous achetez un bloc /29 séquentiel (ex: .40, .41, .42), les sites intelligents banniront tout le bloc /24 ou /29 à la première infraction. Préférez des IPs dispersées géographiquement si possible.
  • Fuite DNS : Même si vous forcez l'IP sortante pour HTTP, vos requêtes DNS (UDP 53) sortent souvent par l'IP principale ! Pour un anonymat total, forcez aussi le DNS ou utilisez DoH (DNS over HTTPS).

Besoin d'aide sur votre infra ? La configuration réseau avancée comporte des risques de coupure. Si vous devez mettre en place une architecture scraper haute performance, je peux intervenir pour sécuriser le déploiement. Discuter de votre projet