Nginx set_real_ip_from Adresse de l'équilibreur de charge AWS ELB

22

J'ai un ensemble de serveurs Nginx derrière un équilibreur de charge Amazon ELB. J'utilise set_real_ip (du HttpRealIpModule ) afin de pouvoir accéder à l'adresse IP du client d'origine sur ces serveurs (pour passer à php-fpm et pour l'utiliser dans le HttpGeoIPModule ).

Il semble que set_real_ip_fromdans 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 LoadBalancer 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 DNS convivial pour votre LoadBalancer au lieu du nom généré par le service Elastic Load Balancing, vous devez créer un enregistrement CNAME pour le nom DNS LoadBalancer, ou utiliser Amazon Route 53 pour créer une zone hébergée. Pour plus d'informations, consultez Utilisation des noms de domaine avec l'équilibrage de charge élastique

Mais si je dois entrer une adresse IP, je ne peux pas utiliser un CNAME (amazon ou le mien). Y at-il une solution à ce problème?

vitch
la source

Réponses:

40

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

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

Cela devrait indiquer à nginx de faire confiance à un en-tête X-Forwarded-For de quiconque. L'inconvénient est que si quelqu'un accède directement à votre serveur, il pourrait usurper un en-tête X-Forwarded-For et nginx utiliserait la mauvaise adresse IP du client.

kolbyjack
la source
2
Merci - je ne savais pas que je pouvais y ajouter une plage IP ... Je vérifierai s'il y a une plage plus spécifique sur laquelle l'ELB pourrait être (je pense que 10.0.0.1/8cela fonctionnerait bien qu'il puisse y avoir quelque chose de plus spécifique)
vitch
J'ai ajouté une question de suivi pour savoir si quelqu'un connaît la plage valide: serverfault.com/questions/331697/…
vitch
S'il s'agit d'un VPC ALB, votre ou vos plages sont les mêmes que vos plages de sous-réseaux dont le LB fait partie.
talonx
17

La meilleure pratique actuelle consiste à utiliser le VPC, vous connaîtrez donc le CIDR exact pour votre ELB. Ensuite, vous pouvez ajouter quelque chose comme ceci à votre fichier de configuration Nginx:

real_ip_header X-Forwarded-For;
set_real_ip_from 10.0.0.0/8;
nikolay
la source
Étant donné que la question date de 2011, il est possible que cette option n'était pas disponible à l'époque. J'inclus simplement tous les réseaux privés possibles, car les utilisateurs externes n'y accéderont pas facilement.
Jordan Reiter
7

Utilisez le VPC CIDR pour set_real_ip_fromVous pouvez le trouver dans la console Amazon sous VPC => Votre VPC (remplacez- <your VPC CIDR here>le):

real_ip_header X-Forwarded-For;
set_real_ip_from <your VPC CIDR here>;
Alexander Paramonov
la source
4

La définition de la plage de confiance sur 0.0.0.0/0 sur Amazon ELB va certainement vous causer des ennuis. Vous pouvez garantir que les demandes proviennent de l'ELB si vous pouvez configurer le groupe de sécurité pour votre serveur nginx, mais la demande d' origine proviendra de n'importe quelle source possible (les Amazon ELB 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 de votre serveur nginx afficheront alors 1.2.3.4 comme la véritable IP, qui est une adresse usurpée. Voir Plage IP pour IP privée interne d'Amazon ELB pour de meilleures réponses.

Même André Fiskvik
la source
3
Ce ne serait un problème que si vous définissez real_ip_recursive , ce qui n'est pas la valeur par défaut, et n'existait même pas lorsque j'ai répondu à l'origine à la question.
kolbyjack
3

Le realip_module indique qu'en cas de X-Forwarded-For, ce module utilise la dernière adresse IP dans l'en-tête X-Forwarded-For pour le remplacement. Ce module ne fonctionnera pas uniquement real_ip_headeret set_real_ip_formest défini. En effet, ce module utilisera une adresse IP proxy au lieu d'une adresse IP client. Pour résoudre cette real_ip_recursivedirective doit être activée.

De plus, si vous avez des certificats SSL qui sont déployés et renouvelés sur l'instance (comme par exemple les certificats letsencrypt ou certbot). Ces autorités de certification peuvent essayer de valider ces certificats via IPV6.

Il est donc important d'avoir également IPV6. Le fichier de configuration Nginx doit donc également contenir l'adresse IPV6 set_real_ip_from.

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 restrictions de sécurité supplémentaires s'appliquent, nous pouvons également avoir besoin d'inclure set_real_ip_fromVPC CIDR (IPV4 et IPV6) pour les sous-réseaux cloudfront / elb / ec2.

Harish Chennamsetty
la source