다운로드 트래픽을 제한하기 위해 iptables에 어떤 규칙을 적용할 수 있습니까? 예를 들어 클라이언트가 1분에 하나의 IP 주소에서 400KB만 다운로드할 수 있도록 제한해야 합니까? 더 많이 다운로드하면 5분 동안 IP를 차단합니까? Apache/nginx가 아니라 iptabes입니다. 1분 안에 400kb 이상을 얻으려는 사람들을 위해 네트워크 연결을 끄고 싶습니다.
답변1
이 답변은 이것이 다음과 같다고 가정합니다.XY 문제, 실제로 원하는 것은 DoS 공격을 방지하기 위해 사용자당 서버 리소스 사용량을 제한하는 방법입니다.
첫째, 단지 iptables를 사용하는 것 외에 다음과 같은 더 나은 옵션이 있습니다.
- 사용 중인 서버 소프트웨어에 내장된 속도 제한을 사용하세요. 대부분의 주요 웹 서버는 이 모듈을 내장 또는 표준 모듈로 지원합니다. 이는 단일 시스템의 특정 서비스에 대한 액세스를 제한하는 표준 방법이기도 합니다. 이는 iptalbe를 사용하는 것보다 세 가지 주요 이점이 있습니다.
- 누구도 차단하지는 않지만 대역폭 제한을 초과하는 것을 허용하지 않습니다(소스 IP당 연결 수를 제한하는 경우).
- 애플리케이션 수준 정책으로 인해 방화벽이 복잡해지지 않습니다.
- 일반적으로 설정이 쉽습니다. NGinx의 경우 실제로 한 줄입니다(또는 소스당 연결 제한을 포함하는 경우 5줄). Apache의 경우 두 줄입니다(모듈을 로드하는 줄 제외).
- 속도 제한을 제공하려면 일부 역방향 프록시 소프트웨어(어떤 경우에는 애플리케이션 서버에서 직접 실행될 수도 있음)를 사용하십시오. Squid는 이 접근 방식의 가장 좋은 예 중 하나이지만 대부분의 역방향 프록시 옵션은 이를 일부 지원합니다. 이는 백엔드 시스템이 여러 개인 경우 표준 접근 방식입니다.
- TCP 창 크기 조정 매개변수를 조정합니다. 이는 신뢰할 수 있고 올바르게 수행되면 클라이언트가 중단되지 않으며 일단 안정되면 동적 조정이 필요하지 않습니다. 그러나 설정이 간단하지 않으며 스마트 클라이언트는 이 문제를 해결하여 성능을 향상시킬 수 있습니다. 이는 모든 서버 소프트웨어의 일부 작업으로 수행할 수 있지만 연결당 속도 제한으로 제한됩니다.
- 진정한 연결당 속도 제한을 적용하려면 iptables의 연결 태그와 함께 네트워크 장치 대기열 규칙을 사용하세요. 설정하기가 매우 복잡하지만 두 가지 분명한 장점이 있습니다. 즉, 100% 프로토콜에 구애받지 않고(무엇이든 사용할 수 있음) 극도로 결정적인 동작을 제공하므로(테스트가 단순화됩니다).
어떤 이유로든 iptables만 사용할 수 있는 경우 세 가지 일반 옵션이 있습니다.
limit
성냥만 사용하세요. 이를 통해 단위 시간당 패킷 수를 제한할 수 있습니다. 링크의 MTU에 대해 몇 가지 간단한 계산을 수행하면 요청하는 대역폭의 상한을 쉽게 파악할 수 있습니다. 예를 들어, MTU가 1500(이더넷 표준)인 링크에서 분당 400KB를 얻으려면 초당 4패킷 제한이나 분당 267패킷 제한을 고려해야 합니다(둘 다 정확하지는 않습니다). 모두 1% 이내입니다.) 그러나 규칙을 추가해야 합니다.각규칙과 일치하는 모든 항목이 제한 사항을 공유하므로 클라이언트 IP입니다.- 약간 더 복잡한 설정에서는 매칭을 대신 사용할 수 있습니다
hashlimit
. 그러면 더 나은 처리가 가능하지만 위와 동일한 클라이언트별 규칙이 적용됩니다. - 속도 제한에 절대적으로 반응하고 싶다면(매우 나쁜 생각입니다. 여기서는 아무리 강조해도 지나치지 않습니다. 이렇게 하면 많은 수준에서 사용자 기대가 무너지고 본질적으로 디버깅이 어려워지고 디버깅이 어려워질 것입니다.) 더 세게) 그런 다음
rateest
경쟁과 목표를 살펴보세요. 목표는 일치 항목과 일치시킬 수 있는 데이터를 수집합니다. 그러면 LOG 대상을 사용하여 IP를 차단할 수 있는 사용자 공간 도우미 프로그램의 작업을 트리거할 수 있습니다.