Blog / Article #132
Traefik + Symfony : récupérer la vraie IP du visiteur sans se prendre un mur

star

14 Septembre 2026
Traefik + Symfony : récupérer la vraie IP du visiteur

Traefik, c’est ce petit génie qui fait tourner vos conteneurs comme un chef, mais qui, parfois, vous cache des infos cruciales. Comme l’IP réelle de vos visiteurs. Parce que oui, quand vous demandez gentiment à Symfony $request->getClientIp(), il vous répond souvent avec l’IP de votre propre serveur. Pas très utile pour bannir un bot ou géolocaliser un utilisateur.

Pourquoi Traefik vous ment

Traefik, comme tout reverse proxy qui se respecte, ajoute des headers HTTP pour transmettre des infos comme l’IP originale. Le problème ? Symfony, par défaut, ne leur fait pas confiance. Résultat : il ignore X-Forwarded-For et X-Real-IP, ces petits headers qui contiennent la vérité vraie.

La solution ? Configurer Symfony pour qu’il accepte ces headers. Mais attention, pas n’importe comment. Si vous ouvrez les vannes sans réfléchir, vous risquez de vous faire spoofing par le premier script kiddie venu. Symfony a donc un système de trusted proxies : une liste d’IPs (ou de CIDR) autorisées à envoyer des headers fiables.

Première étape : identifier l’IP de Traefik. Si vous utilisez Docker, c’est souvent 172.17.0.1 (ou un autre range privé). Pour être sûr, lancez un docker inspect sur votre conteneur Traefik et cherchez son IP dans le réseau. Une fois que vous l’avez, ajoutez-la dans votre configuration Symfony :

// config/packages/framework.yaml
framework:
    trusted_proxies: '172.17.0.1,REMOTE_ADDR'

Le REMOTE_ADDR est une astuce pour que Symfony accepte aussi les requêtes directes (sans proxy) en développement. Pratique, mais à désactiver en prod si vous voulez éviter les mauvaises surprises^^.

Traefik, le maillon faible ? Pas si vous le configurez bien

Symfony est prêt à écouter, mais Traefik doit lui envoyer les bons headers. Par défaut, Traefik ajoute X-Forwarded-For et X-Real-IP, mais si vous utilisez des middlewares ou des plugins, tout peut sauter. Vérifiez votre configuration Traefik :

# traefik.yml
entryPoints:
  web:
    address: ":80"
    forwardedHeaders:
      trustedIPs:
        - "172.17.0.0/16"
      insecure: false

Le insecure: false est crucial. Sans ça, Traefik acceptera n’importe quel header X-Forwarded-For envoyé par le client. Autant dire que vous venez d’ouvrir la porte à tous les petits malins qui veulent se faire passer pour quelqu’un d’autre.

Une fois tout ça en place, Symfony devrait enfin vous donner la vraie IP. Pour vérifier, créez un contrôleur qui affiche les headers :

// src/Controller/IpController.php
public function show(Request $request): Response
{
    return new Response(
        '<pre>'.print_r([
            'client_ip' => $request->getClientIp(),
            'headers' => $request->headers->all(),
        ], true).'</pre>'
    );
}

Si tout est bien configuré, $request->getClientIp() devrait afficher l’IP du visiteur, et non celle de votre serveur. Si ce n’est pas le cas, vérifiez les logs de Traefik et Symfony : un header mal transmis ou une IP de proxy mal déclarée, et c’est la catastrophe.

En gros, ne faites pas confiance, vérifiez

Récupérer la vraie IP derrière un reverse proxy, c’est un peu comme jouer à cache-cache avec le réseau. Traefik et Symfony ont des mécanismes pour ça, mais ils ne sont pas magiques. Une mauvaise configuration, et vous vous retrouvez avec des logs pollués par des IPs internes, ou pire, des attaques par spoofing.

La règle d’or : ne faites jamais confiance aux headers HTTP sans les avoir validés. Symfony le fait bien avec ses trusted_proxies, et Traefik aussi avec ses trustedIPs. Si vous suivez ces étapes, vous devriez avoir une IP propre et fiable. Si ce n’est pas le cas, c’est que quelque part, un maillon de la chaîne est mal configuré. Et dans ce cas, bonne chance pour le trouver.

Publié le 14/09/2026 · 3 min de lecture Partager X LinkedIn

← Précédent Docker + php : alpine ou debian, le duel des images légères (et des choix qui grattent) Suivant → Traefik + compose en plugin : et si on ajoutait un peu de piment à la stack ?