IP당 URL당 haproxy를 사용하여 속도 제한

IP당 URL당 haproxy를 사용하여 속도 제한

우리 서버는 누군가로부터 지속적으로 공격을 받고 있습니다. DDOS가 아닙니다. 단 하나의 IP가 초당 200번 이상 하나의 URL에 도달합니다. 현재 IP 테이블로 사용자를 차단하고 있습니다. 로드 밸런싱을 위해 HAproxy를 사용하고 있습니다. IP와 URL에 따라 사용자를 제한하는 방법이 있습니까?

NAT 사용자가 영향을 받을 수 있으므로 IP 기반으로만 차단하고 싶지 않습니다. 특정 IP가 www.example.com/somepage.php?some=option&other=option2와 같은 동일한 URL에 5분 동안 3000회 이상 도달하는 경우 503 오류 페이지를 표시하고 싶다고 가정해 보겠습니다. 이는 동일한 IP가 www.example.com/somepage.php?another=someotheroption과 같은 다른 URL에 액세스할 수 있음을 의미합니다.

답변1

이 솔루션에는 최소한 haproxy 1.6이 필요합니다.

먼저 프런트엔드에 다음을 추가합니다.

http-request set-header X-DOS-Protect %[src];%[req.fhdr(host)]%[capture.req.uri]

그런 다음 백엔드에 다음을 추가합니다.

stick-table type integer size 1m expire 5m store http_req_rate(5m)
tcp-request inspect-delay 5s
tcp-request content track-sc0 req.fhdr(X-DOS-Protect),crc32(1) if HTTP
http-request tarpit if { sc0_http_req_rate gt 3000 }

X-DOS-Protect 헤더를 구성하는 연결된 문자열에 변환기를 적용하는 방법을 찾지 못했기 때문에 프런트엔드에서 추적을 수행하는 방법을 찾을 수 없었습니다.

서비스 거부로 쉽게 이어질 수 있는 막대한 문자열을 스틱 테이블에 저장하지 않도록 하기 위해 해시 함수를 적용하고 있습니다. 충돌 가능성이 너무 많아 이 해시 함수가 적합하지 않다고 생각되면 연결된 각 구성 요소에 crc32를 적용하여 더 크게 만들 수도 있습니다(물론 데이터를 저장할 때 이를 제거하고 더 큰 스틱 테이블 저장 공간), 다음과 같습니다:

http-request set-header X-DOS-Protect %[src,crc32(1)];%[req.fhdr(host),crc32(1)]%[capture.req.uri,crc32(1)]

stick-table type string len 30 size 1m expire 5m store http_req_rate(5m)
tcp-request inspect-delay 5s
tcp-request content track-sc0 req.fhdr(X-DOS-Protect) if HTTP
http-request tarpit if { sc0_http_req_rate gt 3000 }

이 마지막 솔루션은 스틱 테이블의 각 항목에 대해 첫 번째 솔루션보다 7배 이상 더 많은 메모리를 사용합니다. 물론 충돌 위험도 훨씬 작을 것입니다.

관련 정보