nginx 업스트림 킵얼라이브 활성화의 위험

nginx 업스트림 킵얼라이브 활성화의 위험

PHP 백엔드가 있는 Apache용 HTTP 역방향 프록시로 nginx를 사용합니다(웹마스터를 위한 .htaccess 유연성이 필요합니다). Apache 로그에 사용된 http/1.0을 보고 연결 유지 연결을 활성화하는 방법을 찾아보았습니다.

검색을 하다가 Nginx에서 이 블로그 게시물을 찾았습니다.https://www.nginx.com/blog/avoiding-top-10-nginx-configuration-mistakes/#no-keepalives

기본적으로 NGINX는 새로 들어오는 요청이 있을 때마다 업스트림(백엔드) 서버에 대한 새 연결을 엽니다. 이는 안전하지만 비효율적입니다.[...]

기본 동작이 안전하다면 업스트림 연결 유지를 활성화할 때 어떤 위험이 있습니까?

답변1

Keepalive를 통한 연결 프록시는 HTTP 비동기화 공격/요청 밀수로 인해 위험으로 간주됩니다. 이는 백엔드가 프런트엔드와 똑같은 방식으로 다양한 클라이언트 요청을 분할하지 않을 때 발생합니다. 각 요청 후에 연결을 닫는 것은 "안전한" 옵션입니다. 이는 현재 요청이 종료된 시기를 명확하게 나타내기 때문입니다.

보다https://book.hacktricks.xyz/pentesting-web/http-request-smuggling자세한 내용은.

답변2

이미 언급했듯이 KeepAlive는 연결을 캐시하는 최적화입니다. 높은 처리량의 트래픽을 지원하는 것입니다. 나는 그것을 활성화하는 데 어떤 위험도 없다고 생각합니다. 실제로 어떤 경우에도 더 나은 결과를 얻을 것입니다.

답변3

기본 동작, 각 요청에 대한 업스트림 연결 생성은 과부하에 안전하지 않습니다. 다음과 같은 이유 때문에:

  1. 동일한 클라이언트 자체에서 nginx 서버로 요청이 들어오면 업스트림 서버와의 새로운 연결이 생성되며, 이를 위해 사용 가능한 새로운 로컬 포트가 사용됩니다.
  2. 요청이 완료되면 해당 로컬 포트의 연결이 설정된 상태에서 120초 동안 TIME_WAIT로 이동합니다. 이는 120초 동안 해당 로컬 포트를 새 요청에 재사용할 수 없음을 의미합니다.
  3. 이제 두 번째 요청이 동일한 클라이언트에서 오면 1단계를 반복합니다.
  4. 이런 식으로 무거운 짐을 위해,
    1. nginx(65k)에서 사용 가능한 모든 로컬 포트를 사용하게 될 수 있습니다.
    2. 모든 요청에 ​​대한 연결 생성 및 종료는 비용이 많이 드는 작업입니다.

따라서 이를 방지하기 위해 할 수 있는 최선의 방법은 연결을 캐시하여 요청이 오면 업스트림 서버와 동일한 연결을 재사용할 수 있도록 하는 것입니다(마지막 요청에서와 마찬가지로 동일한 로컬 포트에서).

감사합니다 Vj

관련 정보