Nginx set_real_ip_from AWS ELB 로드 밸런서 주소

Nginx set_real_ip_from AWS ELB 로드 밸런서 주소

Amazon ELB 로드 밸런서 뒤에 Nginx 서버 세트가 있습니다. 저는 set_real_ip를 사용하고 있습니다(HttpRealIp모듈) 이 서버의 원래 클라이언트 IP 주소에 액세스할 수 있도록(php-fpm을 통과하고 다음에서 사용하기 위해)HttpGeoIP 모듈).

set_real_ip_fromnginx 구성에서는 IP 주소만 허용할 수 있는 것 같습니다 . 그러나 ELB 시스템과 관련하여 Amazon은 다음과 같이 말합니다.

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

하지만 IP 주소를 입력해야 하는 경우 CNAME(Amazon 또는 내 자체)을 사용할 수 없습니다. 이 문제에 대한 해결책이 있습니까?

답변1

모든 요청이 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

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

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

답변3

VPC CIDR을 사용하면 Amazon 콘솔의 VPC => VPC( 여기로 대체) set_real_ip_from아래에서 찾을 수 있습니다 .<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 서버의 로그에 1.2.3.4가 스푸핑된 실제 IP로 표시됩니다. 보다Amazon ELB의 내부 프라이빗 IP에 대한 IP 범위더 나은 답변을 위해.

관련 정보