
IP 주소 동적 거부 목록
NGINX Plus Key-Value Store 및 API로 구축된 동적 거부 목록을 사용하여 특정 클라이언트 IP 주소에서 사이트 또는 애플리케이션에 대한 액세스를 제어하세요.
이 섹션에서는 특정 클라이언트 IP 주소의 거부 목록 또는 허용 목록을 생성하여 사이트에 대한 액세스를 거부하거나 허용하는 방법과 주소 목록을 동적으로 유지하는 방법에 대해 설명합니다.
목차
1. 개요
2. 전제 조건
3. 설정
4. Key-Value 데이터베이스 관리
5. 전체 예제
1. 개요
NGINX Plus 릴리스 13(R13) 이상에서는 일부 IP 주소를 거부할 수 있을 뿐만 아니라 거부된 IP 주소의 데이터베이스를 생성 및 유지할 수 있습니다. 다른 IP 주소를 명시적으로 허용 목록에 추가할 수도 있습니다. IP 주소 데이터베이스는 NGINX Plus API
및 keyval
모듈로 관리됩니다.
2. 전제 조건
NGINX Plus 릴리스 13 이상, 네트워크 지원 범위에 대해서는 NGINX Plus 릴리스 19 이상이 필요합니다.
3. 설정
먼저 거부 목록 및 허용 목록 IP 주소 목록을 저장하기 위해 데이터베이스를 활성화합니다.
1. NGINX Plus 구성 파일에서 Key와 Value를 저장하기 위한 메모리 Zone을 생성하려면 http
컨텍스트에 keyval_zone
지시문을 포함하세요. 이 샘플 지시문은 one
이라는 1MB 영역을 생성합니다.
http {
# ...
keyval_zone zone=one:1m;
}
서브넷(예: 192.168.13.0/24
)에 대해 IP 주소 매칭을 수행하려면 keyval_zone
지시문의 type=ip
매개변수를 지정합니다.
http {
# ...
keyval_zone zone=one:1m type=ip;
}
Note: type=ip
매개변수를 사용하면 Zone에 추가 인덱스를 저장할 수 있으므로 keyval_zone
의 크기도 증가해야 합니다.
선택적으로 state
매개변수를 포함하여 Key-Value 데이터베이스가 저장되어 NGINX Plus가 Reload되고 다시 시작될 때 지속되는 파일(이 예제에서는 one.keyval
)을 생성할 수 있습니다.
keyval_zone zone=one:1m state=one.keyval;
2. api 지시문을 사용하여 read-write 모드에서 NGINX Plus api
를 활성화합니다.
# ...
server {
listen 80;
server_name www.example.com;
location /api {
api write=on;
}
}
예를 들어 localhost
(127.0.0.1
)에서만 액세스를 허용하고 HTTP 기본 인증을 사용하여 지정된 사용자 집합으로 PATCH
, POST
및 DELETE
메서드 사용을 제한하는 등 이 위치에 대한 액세스를 제한할 것을 강력히 권장합니다.
# ...
server {
listen 80;
server_name www.example.com;
location /api {
api write=on;
allow 127.0.0.1;
deny all;
limit_except GET {
auth_basic "NGINX Plus API";
auth_basic_user_file /path/to/passwd/file;
}
}
}
3. API의 POST
메서드를 사용하여 Key-Value 데이터베이스를 채우고 JSON 형식의 데이터를 제공합니다. 다음 예제에서와 같이 curl
명령을 사용할 수 있습니다. Zone이 비어 있으면 여러 개의 Key-Value 쌍을 한 번에 입력할 수 있지만, 그렇지 않은 경우 한 번에 하나씩 쌍을 추가해야 합니다.
$ curl -X POST -d '{
"10.0.0.1": "1",
"10.0.0.2": "1",
"10.0.0.3": "0",
"10.0.0.4": "0"
}' -s http://www.example.com/api/6/http/keyvals/one
네트워크 범위와 IP 주소의 일치를 지정한 경우(keyval_zone
지시문의 type=ip
매개변수 사용), CIDR 표기법으로 지정된 네트워크 범위와 함께 POST
명령을 전송합니다.
$ curl -X POST -d '{
"192.168.13.0/24": "1"
}' -s http://www.example.com/api/6/http/keyvals/one
4. http
컨텍스트에 keyval
지시문을 포함하여 클라이언트 IP 주소가 Key-Value 데이터베이스에 대해 평가되는 방식을 정의합니다.
이 지시문은 모든 요청에 대해 클라이언트 IP 주소로 자동 설정되는 표준 NGINX 및 NGINX Plus 변수 $remote_addr
을 활용합니다.
각 요청을 처리할 때의 NGINX Plus.
zone=
매개변수(여기서는one
)로 지정된 Key-Value 데이터베이스에서 첫 번째 매개변수(여기서는$remote_addr
, 클라이언트의 IP 주소로 사전 설정되어 있습니다)를 조회합니다.- 데이터베이스의 Key가
$remote_addr
과 정확히 일치하는 경우 두 번째 매개변수(여기서는$target
)를 해당 Key에 해당하는 값으로 설정합니다. 이 예에서는 거부된 주소의 경우1
, 허용된 주소의 경우0
입니다
http {
# ...
keyval_zone zone=one:1m type=ip state=one.keyval;
keyval $remote_addr $target zone=one; # Client address is the key,
# $target is the value;
}
5. 클라이언트 IP 주소에 따라 액세스를 허용하거나 거부하는 if 지시문을 사용하여 규칙을 만듭니다. 이 규칙을 사용하면 $target
이 0
이면 액세스가 허용되고 1
이면 액세스가 거부됩니다.
if ($target) {
return 403;
}
4. Key-Value 데이터베이스 관리
API 메서드를 사용하여 NGINX Plus를 Reload할 필요 없이 Key-Value 데이터베이스를 동적으로 업데이트할 수 있습니다.
다음 예제는 모두 http://www.example.com/api/6/http/keyvals/one
에서 액세스할 수 있는 one
의 Zone 에서 작동합니다.
- Zone의 모든 데이터베이스 항목 목록을 가져오려면 다음과 같이 작업합니다.
$ curl -X GET 'http://www.example.com/api/6/http/keyvals/one'
- 기존 항목의 값을 업데이트하려면(이 예에서는 IP 주소
10.0.0.4
의 액세스 상태를 허용 목록에서 거부 목록으로 변경하기 위해) 다음과 같이 설정합니다.
$ curl -X PATCH -d '{"10.0.0.4": "1"}' -s 'http://www.example.com/api/6/http/keyvals/one'
- 채워진 영역에 항목을 추가하려면 다음과 같이 설정합니다.
$ curl -X POST -d '{"10.0.0.5": "1"}' -s 'http://www.example.com/api/6/http/keyvals/one'
- 항목을 삭제하려면 다음과 같이 설정합니다.
$ curl -X PATCH -d '{"10.0.0.4":null}' -s 'http://www.example.com/api/6/http/keyvals/one'
5. 전체 예제
전체 NGINX Plus 구성입니다.
http {
# ...
keyval_zone zone=one:1m type=ip state=one.keyval;
keyval $remote_addr $target zone=one;
server {
listen 80;
server_name www.example.com;
location /api {
api write=on;
allow 127.0.0.1;
deny all;
limit_except GET {
auth_basic "NGINX Plus API";
auth_basic_user_file /path/to/passwd/file;
}
}
if ($target) {
return 403;
}
}
}
구성:
- 네트워크 범위를 허용하는 1MB Keyval Zone
one
을 생성하고, Key-Value 쌍의 데이터베이스가 NGINX Plus의 Reload 및 Restart 시에도 지속되도록one.keyval
파일을 생성합니다. - Zone이 IP 주소로 채워질 수 있도록 쓰기 모드에서 NGINX Plus API를 활성화합니다.
- Key-Value 데이터베이스에서 IP 주소
$remote_addr
을 Key로 조회하고, 찾은 Key의 값을$target
변수에 넣습니다. $target
값이 1(주소가 거부 목록에 있음)이면 클라이언트에게403(Forbidden)
을 반환하는 간단한 규칙을 사용하여 결과값을 확인할 수 있습니다.
다음 curl
명령은 빈 Keyval Zone one
을 거부 목록(값은 1
) 또는 허용 목록(값은 0
)에 있는 IP 주소로 채웁니다.
$ curl -X POST -d '{
"10.0.0.1": "1",
"192.168.13.0/24": "1",
"10.0.0.3": "0",
"10.0.0.4": "0"
}' -s 'http://www.example.com/api/6/http/keyvals/one'