AWS ELB로드 밸런서 주소의 Nginx set_real_ip_


22

Amazon ELB로드 밸런서 뒤에 Nginx 서버 세트가 있습니다. 나는 (으로부터 set_real_ip을 사용하고 HttpRealIpModule 그래서 이러한 서버에 원래 클라이언트 IP 주소를 액세스 할 수있는)합니다 (에 PHP-FPM과 사용을 통해 전달하는 HttpGeoIPModule ).

것으로 보인다 set_real_ip_from의 nginx 구성에서 IP 주소 만 받아 들일 수 있습니다. 그러나 아마존은 ELB 머신과 관련하여 다음과 같이 말합니다.

참고 : LoadBalancer와 연관된 IP 주소 세트는 시간이 지남에 따라 변경 될 수 있으므로 특정 IP 주소로 "A"레코드를 작성해서는 안됩니다. Elastic Load Balancing 서비스에서 생성 한 이름 대신 친숙한 DNS 이름을 LoadBalancer에 사용하려면 LoadBalancer DNS 이름에 대한 CNAME 레코드를 생성하거나 Amazon Route 53을 사용하여 호스팅 영역을 생성해야합니다. 자세한 내용은 Elastic Load Balancing에 도메인 이름 사용을 참조하십시오.

그러나 IP 주소를 입력 해야하는 경우 CNAME (아마존 또는 내 이름)을 사용할 수 없습니다. 이 문제에 대한 해결책이 있습니까?

답변:


40

ELB에서 모든 요청이 올 것임을 보장 할 수 있다면 (잘 모르겠습니다) 다음을 시도해보십시오.

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

그것은 nginx에게 누군가의 X-Forwarded-For 헤더를 신뢰하도록 지시해야합니다. 단점은 누군가가 서버에 직접 액세스하면 X-Forwarded-For 헤더를 스푸핑 할 수 있고 nginx가 잘못된 클라이언트 IP 주소를 사용한다는 것입니다.


2
감사합니다-IP 범위를 추가 할 수 있다는 것을 몰랐습니다 ... ELB가있을 수있는보다 구체적인 범위가 있는지 확인하겠습니다 ( 10.0.0.1/8더 구체적인 것이있을지라도 작동 할 것
같습니다

: 사람이 유효 범위를 알고 있다면 내가 알아 질문까지 후속 추가 serverfault.com/questions/331697/...
vitch

VPC ALB 인 경우 범위는 LB가 속한 서브넷 범위와 같습니다.
talonx

17

오늘 모범 사례는 VPC를 사용하는 것이므로 ELB에 대한 정확한 CIDR을 알게됩니다. 그런 다음 Nginx 구성 파일에 다음과 같은 것을 추가 할 수 있습니다.

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

질문이 2011 년에 나온 것으로 보았을 때 옵션을 사용할 수 없었을 수 있습니다. 외부 사용자가 쉽게 접근 할 수 없으므로 가능한 모든 개인 네트워크를 포함합니다.
Jordan Reiter 2016 년

7

VPC CIDR 사용 set_real_ip_fromAmazon 콘솔에서 VPC => VPC (대체 <your VPC CIDR here>) 에서 찾을 수 있습니다 .

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

4

Amazon ELB에서 신뢰할 수있는 범위를 0.0.0.0/0으로 설정하면 문제가 발생할 수 있습니다. nginx 서버에 대한 보안 그룹을 구성 할 수있는 경우 요청이 ELB에서 오는 것을 보장 할 수 있지만 원래 요청은 가능한 모든 소스에서 발생합니다 (Amazon ELB는 공용 인터페이스 임).

간단한 테스트를 통해이를 알 수 있습니다.

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

nginx 서버의 로그는 스푸핑 된 실제 IP로 1.2.3.4를 표시합니다. 더 나은 답변을 보려면 Amazon ELB의 내부 프라이빗 IP에 대한 IP 범위를 참조하십시오 .


3
real_ip_recursive 를 설정 한 경우에만 문제가 될 수 있습니다 . 기본값은 아니며 원래 질문에 대답했을 때조차 존재하지 않았습니다.
kolbyjack

3

realip_module X-전달-의 경우의 경우,이 모듈의 마지막 IP 주소를 사용하는 내용의 X-전달-교체에 대한 헤더. 이 모듈은 경우에만 작동하지 않습니다 real_ip_headerset_real_ip_form설정됩니다. 이 모듈은 클라이언트 IP 대신 프록시 IP 주소를 사용하기 때문입니다. 이 real_ip_recursive지시문 을 해결하려면 활성화해야합니다.

또한 인스턴스에서 배포 및 갱신 된 SSL 인증서 (예 : letsencrypt 또는 certbot 인증서)가있는 경우. 이러한 인증 기관은 IPV6을 통해 해당 인증서의 유효성을 검증하려고 시도 할 수 있습니다.

따라서 IPV6도 있어야합니다. 따라서 Nginx 설정 파일에는 set_real_ip_from 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>;

추가 보안 조정이 적용되는 경우 set_real_ip_from클라우드 프론트 / elb / ec2 서브넷에 VPC CIDR (IPV4 및 IPV6) 을 포함해야 할 수도 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.