web-dev-qa-db-fra.com

NGINX SET_REAL_IP_IP_IP_FROM AWS ELB Load Balancer Adresse

J'ai un ensemble de serveurs Nginx derrière un équilibreur d'Amazon ELB. J'utilise SET_REAL_IP (à partir du HTTPealipModule ) afin que je puisse accéder à l'adresse IP du client d'origine sur ces serveurs (pour passer à travers PHP-FPM et Utilisez dans le httpgeoipmodule ).

Il paraît que set_real_ip_from Dans la configuration Nginx ne peut accepter qu'une adresse IP. Cependant, en ce qui concerne les machines ELB, Amazon dit:

Remarque: Étant donné que l'ensemble des adresses IP associées à un échecbalancer peut changer au fil du temps, vous ne devez jamais créer un enregistrement "A" avec une adresse IP spécifique. Si vous souhaitez utiliser un nom de DNS amical pour votre vol de produit au lieu du nom généré par le service d'équilibrage de la charge élastique, vous devez créer un enregistrement CNAME pour le nom DNS de LoadBalancer ou utiliser Amazon Route 53 pour créer une zone hébergée. Pour plus d'informations, voir Utilisation de noms de domaine avec un équilibrage de charge élastique

Mais si j'ai besoin de saisir une adresse IP, je ne peux pas utiliser de CNAME (Amazon's ou moi-même). Y at-il une solution à ce problème?

23
vitch

Si vous pouvez vous garantir que toutes les demandes viendront d'ELB (je ne le connais pas), vous pourriez essayer:

real_ip_header X-Forwarded-For;
set_real_ip_from 0.0.0.0/0;

Cela devrait dire à Nginx de faire confiance à une en-tête transmise de X à celui-ci. L'inconvénient est que si quelqu'un accède directement à votre serveur, ils seraient en mesure de spoofer un en-tête de transmission X et NGinx utiliseraient la mauvaise adresse IP client.

44
kolbyjack

La meilleure pratique d'aujourd'hui consiste à utiliser VPC, alors, vous saurez donc la CIDR exacte pour votre ELB. Ensuite, vous pouvez ajouter quelque chose comme celui-ci à votre fichier de configuration Nginx:

real_ip_header X-Forwarded-For;
set_real_ip_from 10.0.0.0/8;
17
nikolay

Utilisez la CIDR VPC pour set_real_ip_from Vous pouvez le trouver dans la console Amazon sous VPC => Votre VPC (remplacer <your VPC CIDR here> avec ça):

real_ip_header X-Forwarded-For;
set_real_ip_from <your VPC CIDR here>;
7
Alexander Paramonov

Réglage de la plage de confiance à 0.0.0.0.0/0 sur Amazon ELB est sûr de vous mettre en difficulté. Vous pouvez vous garantir que les demandes proviennent du CLB si vous pouvez configurer le groupe de sécurité pour votre serveur NGinx, mais le Original Demande sera originaire de toute source possible (Amazon ELBS sont des interfaces publiques).

Un test simple révélera ceci:

curl --header "X-Forwarded-For: 1.2.3.4" "http://your-elb-dns-address/"

Les journaux sur votre serveur Nginx indiquent ensuite 1.2.3.4 en tant que vraie IP, qui est une épotion usée. Voir Gamme IP pour une adresse IP privée interne d'Amazon ELB pour de meilleures réponses.

4
Even André Fiskvik

Le realip_module stipule que, en cas de transmission X-Forable, ce module utilise la dernière adresse IP de l'en-tête X-Forwarded-pour le remplacement. Ce module ne fonctionnera pas quand seul real_ip_header et set_real_ip_form sont définis. En effet, ce module utilisera une adresse IP proxy au lieu d'une adresse IP client. Pour résoudre ce problème real_ip_recursive La directive doit être activée.

En outre, si vous avez des certificats SSL déployés et renouvelés sur l'instance (comme Dites LetSencypt ou CertBot). Ces autorités de certification pourraient essayer de valider ces certificats via IPv6.

Il est donc important d'avoir aussi IPv6. Donc, le fichier de configuration NGinx doit également contenir SET_REAL_IP_FROM Adresse IPv6.

real_ip_header X-Forwarded-For;
real_ip_recursive on;
set_real_ip_from <your VPC IPV4 CIDR here>;
set_real_ip_from <your VPC IPV6 CIDR here>;

si des résistrictions de sécurité supplémentaires s'appliquent, nous devrons également inclure set_real_ip_from VPC CIDR (IPv4 et IPv6) pour les sous-rénés Cloudfront/ELB/EC2.

4