web-dev-qa-db-fra.com

NGinx $ proxy_add_x_forwarded_for et real_ip_header

J'ai une webapp sous NGinx et un autre équilibreur de charge frontal, quelque chose comme ci-dessous (x.x.x.x = adresse IP):

Client (a.a.a.a) -> LB (b.b.b.b) -> NGX (c.c.c.c) -> WEBAPP (d.d.d.d)

Voici un extrait de ma configuration NGinx:

location / {
    proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header  X-Real-IP       $remote_addr;
    real_ip_header    X-Forwarded-For;
    set_real_ip_from  b.b.b.b;
    real_ip_recursive on;
}
  1. L'équilibreur de charge ajoute X-Forwarded-For champ avec IP client
    X-Forwarded-For = a.a.a.a
  2. NGinx recherche l'IP réelle du client dans X-Forwarded-For en-tête en omettant LB IP (b.b.b.b) et modifiez $remote_addr de b.b.b.b à a.a.a.a donc proxy_set_header X-Real-IP $remote_addr devenir vrai (OK c'est ce que je veux!)
    MAIS, NGinx complète également X-Forwarded-For en-tête avec a.a.a.a IP au lieu de b.b.b.b
  3. WEBAPP reçoit les en-têtes suivants:
    X-Forwarded-For = a.a.a.a, a.a.a.a
    X-Real-IP = a.a.a.a
    -> X-Forwarded-For devrait être a.a.a.a, b.b.b.b

Ce dont j'ai besoin, c'est de pouvoir définir d'abord proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for puis recherchez l'IP réelle et remplacez $remote_addr valeur.

Quelqu'un peut-il m'aider à résoudre ce problème?

25
pierrefevrier

Le $proxy_add_x_forwarded_for est égal à $http_x_forwarded_for,$remote_addr, et le $remote_addr la variable sera modifiée lorsque http_realip_module est utilisé. Vous n'obtiendrez donc pas le dernier proxy addr dans cet en-tête. Changer l'ordre des directives n'aura aucun effet car la configuration nginx est déclarative.

Lorsque http_realip_module est utilisé, le $realip_remote_addr variable (nginx >= 1.9.7) peut être utilisé comme l'original $remote_addr. Vous pouvez donc définir votre X-Forwarded-For en-tête comme ceci:

proxy_set_header X-Forwarded-For "$http_x_forwarded_for, $realip_remote_addr";
13
Y. King

Même problème ici. C'est ennuyeux, et je ne suis pas sûr si c'est une fonctionnalité ou un bug :)

Je sais que ce n'est pas une solution, mais j'ai supprimé real_ip_header, et j'utilise simplement X-Forwarded-For première adresse IP pour obtenir l'adresse IP du client partout où j'en ai besoin (par exemple. journaux).

3
faja

Je suis récemment tombé sur le même "problème" et suis arrivé à la conclusion que ce comportement était dû au real_ip_recursive on; directive.

À partir des nginx realip docs :

Si la recherche récursive est activée, une adresse client d'origine qui correspond à l'une des adresses approuvées est remplacée par la dernière adresse non approuvée envoyée dans le champ d'en-tête de la demande.

Vous avez spécifié de faire confiance à b.b.b.b (à cause de votre set_real_ip_from b.b.b.b;

Donc, ce à quoi vous vous attendez, c'est-à-dire a.a.a.a, b.b.b.b sera remplacé par a.a.a.a, a.a.a.a.

La source qui m'a fait comprendre cela est: https://serverfault.com/questions/314574/nginx-real-ip-header-and-x-forwarded-for-seems-wrong

2
Tom