X-forwarded-for 헤더를 기반으로 리소스에 대한 액세스를 거부하는 방법 123.233.233.123) {

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_addrallow/ 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을 얻고 요청이 허용됩니다.

geoIP 범위를 정의하는 데 필요한 만큼 많은 행을 블록 에 가질 수 있습니다 .


답변

이것들이 나를 위해 일했습니다.

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