X-forwarded-for 헤더에 전달 된 클라이언트 IP를 기반으로 Nginx 뒤의 리소스에 대한 액세스를 제한하려고합니다. Nginx가 Google Cloud Platform의 Kubernetes Cluster에있는 컨테이너에서 실행되고 실제 클라이언트 IP는 x-forwarded-for 헤더로만 전달됩니다.
지금까지 다음 코드를 사용하여 단일 IP에 대해 관리했습니다.
set $allow false;
if ($http_x_forwarded_for ~* 123.233.233.123) {
set $allow true;
}
if ($http_x_forward_for ~* 10.20.30.40) {
set $allow false;
}
if ($allow = false) {
return 403;
}
그러나 모든 범위의 IP에 대해 어떻게 할 수 있습니까? 수백 개의 IP를 직접 지정하는 것은 의미가 없습니다.
모든 도움에 감사드립니다
답변
RealIP 모듈을 사용하여 X-Forwarded-For
헤더 값을 준수하십시오 . 설정 set_real_ip_from
리버스 프록시 (의 현재 값의 IP 주소 $remote_addr
).
예를 들면 다음과 같습니다.
server {
...
real_ip_header X-Forwarded-For;
set_real_ip_from 10.1.2.3;
...
}
이제 클라이언트의 실제 IP 주소를 사용하여 $remote_addr
및 allow
/ deny
지시문 을 사용할 수 있습니다 . 자세한 내용은 이 문서 를 참조하십시오 .
답변
Richard의 답변에는 이미 실제 IP 주소를 nginx에 가장 잘 얻는 방법에 대한 정보가 포함되어 있습니다.
한편 IP 범위 지정에 관한 문제는 http://nginx.org/en/docs/http/ngx_http_geo_module.html 을 사용할 수 있습니다 .
geo
같은 모듈 일 map
모듈, 즉, 변수는 IP 어드레스의 값에 따라 값이 할당 얻는다.
예를 들면 :
geo $allow {
default 0;
192.168.168.0/24 1;
}
server {
real_ip_header X-Forwarded-For;
set_real_ip_from 10.1.2.3;
if ($allow = 0) {
return 403;
}
}
여기서 우리 geo
는 기본값 $allow
이 0 인 맵 을 할당합니다 . IP 주소가 서브넷 192.168.168.0/24
에 $allow
있으면 값 1을 얻고 요청이 허용됩니다.
geo
IP 범위를 정의하는 데 필요한 만큼 많은 행을 블록 에 가질 수 있습니다 .
답변
이것들이 나를 위해 일했습니다.
geo $remote_addr $giveaccess {
proxy 172.0.0.0/8; <-- Private IP range here
default 0;
11.22.33.44 1; <-- Allowed IP here
}
server{
##
location ^~ /secure_url_here {
if ($giveaccess = 0){
return 403;
}
try_files $uri $uri/ /index.php?$args; <-- Add this line specific for your CMS, if required.
}
참조 : http://nginx.org/en/docs/http/ngx_http_geo_module.html