이것은 우리가 사용하고 있는 아파치 버전입니다 - httpd-2.2.15-39.el6.centos.x86_64
최근 DoS 공격으로 인해 당사 웹사이트가 폐쇄되었기 때문에 iptables와 이를 사용하여 DoS 공격을 방지하는 방법을 알아보기 시작했습니다. 몇 개의 포럼을 찾아보니 지금 이해하려고 노력하는 규칙이 충분합니다. 단일 IP로부터의 연결 수를 제한하기 위해 클라이언트(웹 브라우저)와 서버(웹 서버 - httpd) 간의 통신을 이해하고 싶습니다. 예를 들어, Google Chrome에서 “www.mywebsite.com”을 클릭하고 내 웹사이트의 다양한 페이지를 탐색하기 시작합니다. 이제 클라이언트와 웹 서버 사이에 몇 개의 연결이 있습니까? 내 웹 서버에서 netstat를 실행해보고 확인했습니다. 내 IP(크롬 웹 브라우저)에 연결된 연결은 하나만 볼 수 있습니다. 항상 이런가요? 클라이언트와 웹서버 사이에는 단 1개의 연결만 이루어지고, 이 연결을 통해서만 통신이 이루어진다고요? 이 연결은 얼마나 오랫동안 열려 있나요?
다음 규칙을 사용해도 안전합니까?
iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 80 -i eth0 -m state --state NEW -m recent --update --seconds 60 --hitcount 10 -j DROP
위의 2가지 규칙은 누군가 자신의 컴퓨터에서 내 웹 서버로 너무 많은 연결을 시도하는 위험을 완전히 제거합니다(분당 10개의 연결이 합법적이지 않다는 점을 고려하면)?
이제 다음 2가지 규칙을 고려하세요.
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -m limit --limit 50/minute --limit-burst 200 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -m state --state RELATED,ESTABLISHED -m limit --limit 50/second --limit-burst 50 -j ACCEPT
이제 위의 규칙은 무엇을 합니까? 아래 질문에서 이 질문을 했지만 여전히 이에 대한 전체 그림을 얻을 수 없습니다.
첫 번째 규칙에서는 분당 50개의 연결만 허용하고 200개까지 확장할 수 있다고 나와 있습니까? 분당 200개의 연결이 허용되면 연속된 분 동안 50개의 연결만 허용됩니다.
Extreme Burst의 경우 토큰 200개부터 시작됩니다. 이는 내 웹 서버가 이 분 동안 200개의 요청을 받았다고 가정하면 토큰 수가 50이 되고 다음 분에는 50개의 연결만 허용한다는 의미입니다. 이제 3분 후에는 어떻게 됩니까? 다시 200개의 요청을 허용하게 될까요? 지난 순간과 동일합니다. 연결 수 <=50? 내 이해가 맞나요?
마지막 규칙은 무엇을 말합니까? 특정 시점에 50개의 연결만 만들 수 있습니까?
위의 2가지 규칙으로 인해 합법적인 트래픽이 삭제될 가능성이 있나요?
일반적으로 DoS 공격 및 웹 서버에 대한 공격을 방지하기 위해 다른 iptables 규칙을 사용하는 것이 좋습니까?
답변1
클라이언트와 웹 서버 사이에 얼마나 많은 연결이 있습니까?
일반적으로 브라우저는 웹 서버와 6-10개의 TCP 연결을 설정합니다.
크롬으로 테스트해봤는데 이렇게 나오네요. 나는 일반적으로 요청을 매우 빠르게 실행하는 엔드투엔드 테스트 실행기로 테스트하므로 설정이나 netstat 명령을 조정해야 할 수도 있습니다. 저는 일반적 netstat -plunt
으로 또는 이와 유사한 것으로 시작합니다.
동일한 URL을 방문하고 브라우저가 캐싱 중이므로 콘텐츠가 덜 표시될 수 있습니다. 다른 페이지를 요청해 보세요.
연결은 얼마나 오래 지속되나요?
이는 아파치의 지시문에 설정됩니다 keepalive
(아파치 버전에 따라 일반적으로 약 5-10초). 단지 grep입니다. 때로는 성능상의 이유로 더 낮게 설정되거나 꺼지기도 합니다. 그러나 서버를 관리하는 유일한 사람이라면 그 사실을 알게 될 것입니다.
0으로 설정되어 있으면 netstat 명령이 연결을 획득하지 못하는 이유일 수 있습니다. netstat가 보고하기 전에 연결이 해제되기 때문입니다.
iptables -A INPUT -p tcp --dport 80 -m state --state NEW -mlimit --limit 50/분 --limit-burst 200 -j ACCEPT
우선 이 규칙은추가- 기존 규칙 세트의 끝까지. 즉, 일치하기 전에 다른 규칙이 있어도 해당 규칙은 고려되지 않습니다.
이는 수학적 계산을 위해 토큰 버킷 개념을 사용하는 netfilter 제한 모듈에서 비롯됩니다. 이 경우 200개의 토큰이 버킷에 들어가고 모든 토큰이 소비될 때까지, 즉 버킷이 비워질 때까지 규칙이 일치합니다.
하지만 버킷은 분당 50개의 속도로 보충됩니다.
따라서 기본 아이디어는 일치하고 싶다고 말하는 것입니다.평균분당 50회 - 하루 종일 분당 50개의 요청을 계속 일치시키려고 합니다.
그렇다면 누군가 갑자기 120개의 요청을 했는데 다음 3분 동안 아무 요청도 하지 않는다면 어떻게 될까요? 기술적으로는 귀하의 정의 내에 있습니다.분당 50회 - 평균.
따라서 이 문제를 해결하려면 버킷에 추가 토큰을 넣어야 합니다.
자세한 내용은 다음을 참조하세요.네트워크 필터 문서
답변2
DoS 공격을 방지하려면 네트워크 계층을 더 깊이 파고들어야 합니다. 배포판에 대한 네트워킹 가이드를 확인하려면 "DoS 공격 Linux"를 검색하세요. 대부분의 완화에서는 iptables를 사용하여 트래픽을 제한합니다.
답변3
최적화 지시문은 MaxRequestWorkers
리소스가 소진되는 최대 동시 연결 수를 정의합니다. 또한보십시오Apache 성능 튜닝
사용하다미미모듈 스레딩을 사용하면 동시 연결을 활용하여서비스 거부공격. 앞으로 mpm 모듈 이벤트는 비동기 처리를 사용하므로 더 이상 연결당 스레드가 없습니다. OpenSSL 라이브러리의 특성으로 인해 mpm 모듈 이벤트는 현재 모듈 mod_ssl 및 기타 입력 필터와 호환되지 않습니다. 이러한 경우 해당 동작은 모듈 mpm 작업자의 동작으로 축소됩니다.
사용 가능한 타사 모듈이 많이 있습니다.아파치 모듈 목록이를 통해 특정 고객의 행동 범위를 좁히고 DoS 문제를 최소화할 수 있습니다.