NGINX Plus DDoS 방어 및 TCP 로드 밸런싱 구현

NGINX Plus 는 HTTP를 전송 프로토콜로 사용하지 않는 애플리케이션 (Microsoft Exchange 2013 및 MySQL과 같은)과 NGINX Plus 에서 암호화되지 않은 SSL 트래픽과 같은 모든 SSL 트래픽을 처리하는 TCP 로드 밸런싱을 소개했습니다.

NGINX Plus 에서는 외부 위협에 대한 TCP 애플리케이션 보안을 더욱 강화하기 위해 새로운 기능을 추가하여 TCP 로드 밸런싱을 크게 개선했습니다.
또한, 새로운 구성 가능한 매개변수로 TCP 로드 밸런싱의 튜닝이 더욱 유연해졌습니다.
이 포스트에서는 이러한 새로운 기능을 자세히 설명하여 TCP로 통신하는 애플리케이션을 가속화하고 보안 및 확장성을 높이는 방법을 설명합니다.

목차

1. 액세스 제어 및 DDoS 보호를 적용하여 TCP 서비스 보호
 1-1. 액세스 제어
 1-2. 연결 제한
 1-3. 대역폭 제한
2. 구성 가능한 로드 밸런싱
 2-1. 특정 IP 주소에 바인딩
 
2-2. NGINX Plus 프록시 프로토콜 지원
 2-3. 기타 개선 사항
3. NGINX Plus vs NGINX 오픈소스

1. NGINX Plus 액세스 제어 및 DDoS 보호를 적용하여 TCP 서비스 보호

NGINX Plus R7 이상에서는 TCP 트래픽에 대해나 액세스 제어, 연결 제한 및 대역폭 제한이 도입되었습니다.

이제 TCP 애플리케이션에 대해 HTTP 애플리케이션과 동일한 수준의 보안 및 DDoS 보호를 제공합니다.

1-1. 액세스 제어

특정 클라이언트 IP 주소 및 범위에 기반하여 프록시화 된 또는 로드 밸런스된 TCP 서버의 트래픽을 허용하거나 거부할 수 있습니다. 이는 공격 중인 IP 주소 또는 Project HoneyPot과 같이 악성이라고 알려진 IP 주소를 빠르게 차단하는 데 매우 유용합니다. 구성은 꽤 간단합니다.

server {
    # ...
    deny 72.46.166.10;
    deny 73.46.156.0/24;
    allow all;
}

첫 번째 deny 지시문은 하나의 IP 주소를 차단하고 두 번째는 주소 범위를 차단합니다. 그리고 모든 다른 주소는 최종 allow all 지시문에 의해 모두 허용됩니다. 로직은 최종적인 deny all 지시문를 사용하여 지정한 IP 주소에서 액세스를 허용하고 다른 모든 사용자를 차단하여 반대로 바꿀 수도 있습니다.

더 자세한 정보는 ngx_stream_access_module 문서를 참조하십시오.

1-2. 연결 제한

NGINX Plus R7 이상 버전을 사용하면 NGINX Plus에 의해 프록시되는 TCP 애플리케이션에 대한 클라이언트 연결 수를 제한할 수 있습니다.
예를 들어 애플리케이션의 한 부분이 다른 부분보다 느리다면(예: 해당 부분에 대한 요청이 많은 데이터베이스 호출을 생성하거나 일반적으로 백엔드에서 많은 작업을 초기화하는 경우) 공격자는 수백 대 또는 수천 대의 컴퓨터에서 동일한 요청을 반복하도록 함으로써 이를 악용할 수 있습니다.

연결 제한을 사용하면 공격자가 만들 수 있는 연결 수를 제한함으로써 이러한 공격의 영향을 최소화할 수 있습니다. 이렇게 하면 공격에 사용되는 각 개별 컴퓨터의 성능이 제한됩니다.

stream {
    limit_conn_zone $binary_remote_addr zone=my_limit_conn:10m;
    # ...
    server {
        limit_conn my_limit_conn 1;
        # ...
    }
}

이 예에서 각 IP 주소는 하나의 연결로 제한됩니다. NGINX 변수는 $binary_remote_addr 클라이언트의 IP 주소를 캡처합니다.

자세한 내용은 ngx_stream_limit_conn_module 설명서를 참조하십시오.

1-3. 대역폭 제한

NGINX Plus R7 이상에서는 각 연결에 대한 업로드 및 다운로드 속도를 제한하는 새로운 기능이 포함되어 있습니다.
대역폭을 제한하면 과도한 다운로더의 속도를 줄입니다.

server {
    # ...
    proxy_download_rate 100k;
    proxy_upload_rate   50k;
}

이러한 설정으로 클라이언트는 단일 연결을 통해 최대 100 kb/s의 속도로 데이터를 다운로드하고, 단일 연결을 통해 최대 50 kb/s의 속도로 데이터를 업로드할 수 있습니다. 그러나 클라이언트는 다중 연결을 시도할 수 있으므로, 클라이언트당 총 로딩 속도를 제한하려면 이전 섹션에서 설명한 대로 연결 수도 제한해야 합니다.

2. 구성 가능한 로드 밸런싱

NGINX Plus R7 이상에서는 NGINX Plus의 TCP 로드 밸런싱 기능을 최대한 활용할 수 있도록 구성 가능한 옵션이 더 추가되었습니다.

2-1. 특정 IP 주소에 바인딩

NGINX Plus가 프록시하는 백엔드 서버와 통신할 때 사용하는 IP 주소를 proxy_bind 지시문을 포함하여 지정할 수 있습니다.

upstream backend {
    server backend1.example.com;
    server backend2.example.com;
}

server {
    # ...
    proxy_bind 192.168.1.100;
    proxy_pass backend;
}

이 예제에서 NGINX Plus는 백엔드 업스트림 그룹 서버의 모든 연결에 대해 192.168.1.100 주소를 사용합니다.

2-2. NGINX Plus 프록시 프로토콜 지원

프록시 프로토콜 지원을 추가했습니다. 이는 클라이언트의 IP 주소와 같은 연결 정보를 여러 개의 프록시 레이어를 통해 안전하게 전송하는 편리한 방법을 제공합니다.

큰 양의 SSL 트래픽을 복호화해야 했던 NGINX 고객의 좋은 사용 사례가 있습니다. 이를 처리하기 위해 두 개의 계층으로 구성된 시스템을 구축했습니다. 프론트엔드 NGINX 클러스터는 SSL 연결을 종료하는 더 큰 보조 클러스터를 통해 TCP 트래픽을 로드 밸런싱합니다.

proxy_protocol 지시문은 클라이언트 IP 주소를 두 번째 계층에 전달하여, 이를 복호화된 HTTP 트래픽의 헤더로 추가할 수 있도록 합니다.

2-3. 기타 개선 사항

TCP 로드 밸런싱에 대한 몇 가지 다른 개선 사항이 있습니다.

  • 수신 명령에 대한 새 backlog 매개 변수는 보류 중인 연결 대기열의 길이를 제한합니다.
  • tcp_nodelay 지시문은 Nagle’s Algorithm의 사용 여부를 제어합니다. 기본적으로 활성화 되어 있는 Nagle’s Algorithm을 비활성화합니다.

3. NGINX Plus vs NGINX 오픈소스

NGINX Plus 와 NGINX 오픈소스는 모두 TCP 로드 밸런싱을 지원합니다.
NGINX Plus 는 TCP 로드 밸런싱을 강화하고 로드 밸런싱된 트래픽에 대한 더 많은 가시성을 제공하는 기능을 추가합니다.
다음 표는 두 가지를 비교합니다.

NGINX Plus를 실행 중인 경우 가능한 한 빨리 최신버전으로 업데이트하는 것이 좋습니다.
여러 가지 수정 및 개선 사항을 선택할 수 있으며 지원 티켓을 제출해야 하는 경우 도움이 될 것입니다. 설치 및 업그레이드 지침은 NGINX STORE에서 찾을 수 있습니다. 아직 NGINX Plus를 사용하지 않습니까? 오늘 무료로 사용해 보세요!
또한 아래 뉴스레터를 구독하여 NGINX Plus의 최신 소식을 빠르게 전달 받아보세요.