
Proxy된 TCP 리소스에 대한 액세스 제한
NGINX Plus 의 클라이언트 IP 주소 또는 기타 변수를 기반으로 연결 또는 대역폭을 제한하여 Upstream TCP 애플리케이션 서버를 보호하세요.
이 문서에서는 TCP를 통해 통신하는 데이터베이스 또는 미디어 서버에 대한 액세스를 제한하는 시나리오를 제공합니다. 액세스는 IP 주소, 동시 연결 수 또는 대역폭에 의해 제한될 수 있습니다.
목차
1. IP 주소로 액세스 제한
2. TCP 연결 수 제한
3. 대역폭 제한
1. IP 주소로 액세스 제한
NGINX Plus 는 특정 IP 주소 또는 클라이언트 컴퓨터의 IP 주소 범위에 따라 액세스를 허용하거나 거부할 수 있습니다. 액세스를 허용하거나 거부하려면 stream
컨텍스트 또는 server
블록 내에서 allow
및 deny
지시문을 사용합니다.
stream {
#...
server {
listen 12345;
deny 192.168.1.2;
allow 192.168.1.1/24;
allow 2001:0db8::/32;
deny all;
}
}
규칙은 위에서 아래로 순서대로 처리됩니다. 순서의 첫 번째 지시문이 deny all
이면 그 이후의 모든 allow
지시문은 효과가 없습니다. 이 예제에서는 192.168.1.2
를 제외한 서브넷 192.168.1.1/24
에 대한 액세스가 허용됩니다. 2001:0db8::/32
범위의 IPv6 주소도 허용되며 다른 모든 IP 주소에 대한 액세스는 거부됩니다.
2. TCP 연결 수 제한
하나의 IP 주소에서 동시에 연결할 수 있는 TCP 연결 수를 제한할 수 있습니다. 이는 서비스 거부(DoS) 공격을 방지하는 데 유용할 수 있습니다.
먼저 하나의 서버에 대한 최대 TCP 연결 수를 저장할 zone과 연결을 식별할 Key를 정의해 보겠습니다. 이 작업은 stream
컨텍스트에서 limit_conn_zone
지시문을 사용하여 수행할 수 있습니다.
stream {
#...
limit_conn_zone $binary_remote_addr zone=ip_addr:10m;
#...
}
연결을 식별하는 Key는 클라이언트의 IP 주소를 Binary 형식으로 나타내는 $binary_remote_addr
로 정의됩니다. 공유 메모리 Zone의 이름은 ip_addr
이고 Zone 크기는 10MB입니다.
Zone이 정의된 후 limit_conn
지시문으로 연결을 제한합니다. 첫 번째 매개변수는 이전에 limit_conn_zone으로 정의한 공유 메모리 Zone의 이름을 지정합니다. 두 번째 매개변수로 stream
컨텍스트 또는 server
블록에서 각 IP 주소에 대해 허용되는 최대 연결 수를 지정합니다(이 예제에서는 전제 조건인 limit_conn_zone
지시문도 함께 표시됩니다).
stream {
#...
limit_conn_zone $binary_remote_addr zone=ip_addr:10m;
server {
#...
limit_conn ip_addr 1;
}
}
IP 주소 별 연결 수를 제한할 때는 NAT 디바이스 뒤에 있는 여러 호스트가 동일한 IP 주소를 공유한다는 점에 유의하세요.
3. 대역폭 제한
TCP 연결의 최대 다운로드 또는 업로드 속도를 구성할 수 있습니다. 각각 proxy_download_rate
또는 proxy_upload_rate
지시문을 사용합니다.
server {
#...
proxy_download_rate 100k;
proxy_upload_rate 50k;
}
이 설정을 사용하면 클라이언트는 단일 연결을 통해 초당 최대 100KB의 속도로 데이터를 다운로드하고, 단일 연결을 통해 초당 최대 50KB의 속도로 데이터를 업로드할 수 있습니다. 하지만 클라이언트는 여러 개의 연결을 열 수 있습니다. 따라서 각 클라이언트의 전체 로딩 속도를 제한하는 것이 목표라면 이전 섹션에서 설명한 대로 연결 수도 1
개로 제한해야 합니다.
stream {
#...
limit_conn_zone $binary_remote_addr zone=ip_addr:10m;
server {
#...
limit_conn ip_addr 1;
proxy_download_rate 100k;
proxy_upload_rate 50k;
}
}