
나는 내 웹 사이트에서 상대적으로 큰 파일을 호스팅하고 있는데, 누군가가 파일을 계속해서 다운로드하고 내 데이터 전송 내용을 씹어보고 비용을 지불하는 스크립트를 만드는 것이 사소한 일이라는 사실을 깨달았습니다. 일반적인 홈 연결은 연중무휴로 다운로드하면 문제를 일으킬 만큼 충분히 빠릅니다. 초고속 광섬유 연결이나 적절한 원격 서버는 신경쓰지 마세요.
그렇다면 IP 주소당 제한을 적용하는 Apache 또는 Ubuntu 시스템 전체에 사용할 수 있는 것이 있는지 궁금합니다. 예를 들어 24시간당 10GB 전송입니다. 제한에 도달하면 클라이언트에 간단한 "금지됨 - 할당량 도달" 페이지가 제공되거나 연결이 완전히 거부됩니다. 주변을 둘러보았지만 도움이 될 수는 있지만 문제를 해결하지는 못하는 다양한 조절 솔루션 외에는 아무것도 찾지 못했습니다.
답변1
여기에 문서화된 iptables 할당량 모듈이 있습니다.http://ipset.netfilter.org/iptables-extensions.man.html#lbBT
quota
Implements network quotas by decrementing a byte counter with each
packet. The condition matches until the byte counter reaches zero.
Behavior is reversed with negation (i.e. the condition does not match
until the byte counter reaches zero).
[!] --quota bytes
The quota in bytes.
하지만 이 방법을 사용하면 서버에 들어올 수 있는 모든 소스 IP 주소에 대해 개별 할당량 규칙을 만들어야 하기 때문에 이것이 도움이 될 것이라고 생각하지 않습니다(이는 거의 불가능합니다). 또한 여기에 언급된 대로 24시간마다(또는 기간에 관계없이) 이러한 할당량을 재설정하려면 일종의 BASH 스크립트 자동화를 통합해야 합니다.IPtables 트래픽 할당량 - 증가 및 감소
몇 년 전, 저는 IP 주소별로 애플리케이션 수준에서 이 작업을 수행할 수 있는 Apache 모듈을 가지고 놀았습니다. 이것이 더 나은 접근 방식일 수 있습니다(이 작업을 수행하는 Apache/Nginx에 어떤 최신 모듈을 사용할 수 있는지 잘 모르겠습니다. 추가 연구가 필요합니다).
(제 생각에는) 더 잘 작동할 것이라고 생각하는 유일한 다른 대안은 tc(트래픽 셰이핑/정책)와 함께 iptables hashlimit 모듈을 사용하는 것입니다.http://ipset.netfilter.org/iptables-extensions.man.html#lbAY- 이 접근 방식을 사용하면 트래픽이 느려질 뿐 차단되지는 않습니다. 이것이 더 실현 가능한 이유는 iptables hashlimit 모듈이 고유한 IP 주소 및/또는 소스/대상 포트 "해시 키"가 서버에 들어올 때 이를 기록하여 클라이언트에 대한 즉석 추적을 처리할 수 있기 때문입니다. 다른 관련 질문에 대해 이를 달성하는 방법에 대한 답변을 여기에 게시했습니다.https://serverfault.com/a/754116/30506- 그러나 요약하자면 트래픽 조정 클래스(예: 5Mb/초로 고정된 대역폭 제한기)를 만든 다음 클라이언트 세션당 패킷 속도가 특정 임계값에 도달하면 해당 패킷을 이 클래스로 집중시키기 시작하여 트래픽을 진정시킵니다. . 하지만 귀하의 경우 진정은 몇 초가 아닌 몇 시간에 걸쳐 작동하도록 조정되어야 합니다.
답변2
안녕하세요, Server Fault에 오신 것을 환영합니다!
대역폭 제한은 iptables
및 limit
모듈을 사용하여 수행할 수 있습니다.
이것에 대한 아주 좋은 소개를 찾을 수 있습니다여기
대역폭 조절을 설정하기 위한 이 링크의 작은 예:
$ sudo iptables --flush # start again
$ sudo iptables --new-chain RATE-LIMIT
$ sudo iptables --append INPUT --match conntrack --ctstate NEW --jump RATE-LIMIT
$ sudo iptables --append RATE-LIMIT --match limit --limit 50/sec --limit-burst 20 --jump ACCEPT
$ sudo iptables --append RATE-LIMIT --jump DROP
언급된 기사의 저자인 Will Sewell과 Jim Fisher에게 찬사를 보냅니다!