Définir L'adresse distante de X-Forwarded - For dans apache

dans une situation où Apache est assis derrière un mandataire inversé( tel que Squid), la variable d'environnement cgi REMOTE_ADDR obtient l'adresse du mandataire plutôt que celle du client.

cependant, le proxy définira un en-tête appelé X-Forwarded-For pour contenir l'adresse IP originale du client afin Qu'Apache puisse la voir.

la question est, comment faire pour que Apache remplace REMOTE_ADDR avec la valeur de la X-Forwarded-For en-tête pour que toutes les applications web voient de manière transparente la bonne adresse?

10
demandé sur tylerl 2010-02-11 23:05:14

7 réponses

Vous pouvez utiliser mod_rpaf. http://stderr.net/apache/rpaf/

14
répondu maciekb 2010-08-06 17:22:33

notez que L'en-tête X-Forwarded-For peut contenir un liste des adresses IP si la requête a traversé plus d'un mandataire. Dans ce cas, vous voulez généralement L'adresse IP la plus à gauche. Vous pouvez l'extraire avec un SetEnvIf:

SetEnvIf X-Forwarded-For "^(\d{1,3}+\.\d{1,3}+\.\d{1,3}+\.\d{1,3}+).*" XFFCLIENTIP=

notez l'utilisation de 1$ pour définir la variable d'environnement XFFCLIENTIP pour contenir le contenu du premier groupe dans le regex (entre parenthèses).

Ensuite, vous pouvez utiliser la valeur de la variable d'environnement à définir en-têtes (ou utilisez-le dans les formats de log Apache pour que les logs contiennent l'adresse IP du client).

6
répondu Ben Last 2012-04-27 06:53:58

mod_rpaf comme nous l'avons déjà mentionné, il semble que mod_extract_forwarded va exécuter cette fonction.

un avantage à mod_extract_forwarded c'est qu'il est disponible à partir de EPEL pour les serveurs RHEL/CentOS alors que mod_rpaf ne l'est pas.

il semble qu'aucun de ces deux modules ne vous permette de whitelist un sous-réseau entier de serveurs mandataires, c'est pourquoi les gens de CloudFlare ont créé leur propre plugin: mod_cloudflare qui, il convient de noter, est un outil universel comme les deux autres; il contient une liste codée en dur de sous-réseaux de nuages.

4
répondu tylerl 2012-04-27 08:51:35

Malheureusement,

au moment de la rédaction du présent document, aucun des rétroportages et des fourchettes freshports.org, people.apache.org ou gist.github.com ça a marché. Ils étaient tous basés sur une version alpha d'apache httpd 2.3 qui n'était pas compatible avec les versions actuelles de 2.2 ou 2.4.

donc après des heures de perte de temps tout en essayant d'ajuster les rétroportages pour créer un vrai qui fonctionne pour httpd 2.2, j'ai décidé de passer à httpd 2.4. Au sein de httpd 2.4, mod_remoteip fonctionne en douceur, même si un équilibreur de charge a des connexions keepalive permanentes qu'il utilise pour les requêtes proxy des différentes adresses ip réelles du client vers le backend. Je ne suis pas sûr que les autres modules puissent gérer cette situation (changer l'adresse ip du client sur chaque requête à l'intérieur de la même connexion).

2
répondu Marten Lehmann 2012-08-27 19:33:26

Oui, nous pouvons le faire.

il suffit d'ajouter un fichier auto_prepend_file dans votre PHP.ini auto_prepend_file = "c:/prepend.php" et dans ce fichier, ajoutez ceci:

if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $_SERVER['REMOTE_ADDR'] = $_SERVER['HTTP_X_FORWARDED_FOR'];
}

vous avez besoin du MOD_REMOTEIP dans la largeur d'apache RemoteIPHeader X-Real-IP.

santé,

Guiremach

2
répondu Guiremach 2015-11-30 19:22:46

Rappelez-vous que cette valeur peut être usurpée. Voir http://blog.c22.cc/2011/04/22/surveymonkey-ip-spoofing/ pour un exemple réel avec des conséquences de scripts sur plusieurs sites.

1
répondu Daniel Miller 2011-04-22 20:22:45

Vous pouvez installer le module mod_extract_forwarded et définissez MEFaccept paramètre pour tous.

0
répondu freemanpolys 2015-05-22 08:27:07