La description de Wikipédia de l'en-tête HTTP X-Forwarded-For
est la suivante:
X-Forwarded-For: client1, proxy1, proxy2, ...
La documentation de la directive nginx se real_ip_header
lit notamment:
Cette directive définit le nom de l'en-tête utilisé pour transférer l'adresse IP de remplacement.
Dans le cas de X-Forwarded-For, ce module utilise la dernière adresse IP de l'en-tête X-Forwarded-For pour le remplacement. [Souligne moi]
Ces deux descriptions semblent en contradiction. Dans notre scénario, l'en- X-Forwarded-For
tête correspond exactement à la description. L'adresse IP "réelle" du client est l'entrée la plus à gauche. De même, le comportement de nginx consiste à utiliser la valeur la plus à droite - qui, de toute évidence, n’est qu’un de nos serveurs proxy.
D'après ce que je comprends, X-Real-IP
cela est censé être utilisé pour déterminer l' adresse IP réelle du client, et non le proxy. Est-ce que quelque chose me manque ou est-ce un bogue dans nginx?
Et, au-delà de cela, est-ce que quelqu'un a des suggestions sur la manière de rendre l'en- X-Real-IP
tête afficher la valeur la plus à gauche , comme indiqué par la définition de X-Forwarded-For
?
la source
L’analyse de l’en-
X-Forwarded-For
tête est en effet erronée dans le module nginx real_ip.Il commence à l'extrême droite de la chaîne d'en-tête et dès qu'il voit un espace ou une virgule, il cesse de regarder et colle la partie à droite de l'espace ou une virgule dans la variable IP. Ainsi, il traite l' adresse de proxy la plus récente comme l' adresse du client d'origine .
Il ne joue pas bien selon la spécification; c'est le danger de ne pas l'avoir énoncé en termes douloureusement évidents dans un RFC.
De plus: il est difficile de trouver même une bonne source primaire sur le format, qui avait été défini à l'origine par Squid - une fouille dans la documentation confirme la commande; le plus à gauche est le client d'origine, le plus à droite l'ajout le plus récent. Je suis extrêmement tenté d'ajouter une [citation nécessaire] à cette page wikipedia. Une édition anonyme semble être l'autorité d'Internet sur le sujet.
Si possible, pouvez-vous demander à vos mandataires intermédiaires de ne plus s'ajouter eux-mêmes à la fin de l'en-tête, en les laissant simplement avec la véritable adresse du client?
la source
X-Forwarded-For
existe déjà. (c’est la bonne adresse IP du client) nginx lui-même ajoute ensuite l’adresse IP de notre équilibreur de charge (le saut précédent) à l’en-X-Forwarded-For
tête. (vraisemblablement en y ajoutant ce qu’il considère comme "adresse distante") Si cela n’était tout simplement pas fait, je pourrais simplement utiliser l’en-X-Forwarded-For
tête comme auparavant. (nous avons récemment migré vers nginx)proxy_pass
- et même alors, seulement avecproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
en place.X-Forwarded-For
tête avec éventuellement l'adresse du client d'origine à gauche et éventuellement les mandataires précédents ajoutés à celui-ci. Ainsi, le proxy en cours ajoute le proxy précédent (= initiateur) à la fin de la liste et transmet l'en-X-Forwarded-For
tête ainsi augmenté au saut en amont suivant. Certes, ils auraient pu choisir un libellé plus évident.X-Real-IP est l'adresse IP du client réel avec lequel le serveur parle (le "vrai" client du serveur), qui, dans le cas d'une connexion mandatée, est le serveur proxy. C'est pourquoi X-Real-IP contiendra la dernière adresse IP dans l'en-tête X-Forwarded-For.
la source
X-Real-IP
retournaient l'adresse IP de mon propre serveur proxy jamais être utile?