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;
}
X-Forwarded-For
champ avec IP clientX-Forwarded-For
= a.a.a.a
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!)X-Forwarded-For
en-tête avec a.a.a.a
IP au lieu de b.b.b.b
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?
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";
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).
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