NGINX Plus

Proxy된 TCP 리소스에 대한 액세스 제한

NGINX Plus 의 클라이언트 IP 주소 또는 기타 변수를 기반으로 연결 또는 대역폭을 제한하여 Upstream TCP 애플리케이션 서버를 보호하세요.

이 문서에서는 TCP를 통해 통신하는 데이터베이스 또는 미디어 서버에 대한 액세스를 제한하는 시나리오를 제공합니다. 액세스는 IP 주소, 동시 연결 수 또는 대역폭에 의해 제한될 수 있습니다.

목차

1. IP 주소로 액세스 제한
2. TCP 연결 수 제한
3. 대역폭 제한

1. IP 주소로 액세스 제한

NGINX Plus 는 특정 IP 주소 또는 클라이언트 컴퓨터의 IP 주소 범위에 따라 액세스를 허용하거나 거부할 수 있습니다. 액세스를 허용하거나 거부하려면 stream 컨텍스트 또는 server 블록 내에서 allowdeny 지시문을 사용합니다.

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;
    }
}