
我在我的網站上託管了一些相對較大的文件,令我震驚的是,如果有人創建一個腳本來一遍又一遍地下載它們,這會影響我的數據傳輸並花費我的錢,這是微不足道的。如果 24/7 持續下載,您典型的家庭連線速度足夠快,足以給我帶來麻煩,更不用說超快光纖連接或適當的遠端伺服器了。
所以我想知道是否有任何適用於 Apache 甚至 Ubuntu 系統範圍的東西可以對每個 IP 位址施加限制?例如,每 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 位址建立單獨的配額規則(這幾乎是不可能的)。您還需要整合某種 BASH 腳本自動化來每 24 小時(或任何時間段)重置這些配額,如下所述:IPtables 流量配額 - 向上和向下
許多年前,我嘗試過一個 Apache 模組,它能夠在每個 IP 位址的應用程式層級執行此操作。這可能是一個更好的方法(我不確定 Apache/Nginx 有哪些現代模組可以做到這一點 - 需要進一步研究)。
我知道(在我看來)效果更好的唯一其他替代方案是將 iptables hashlimit 模組與 tc(流量整形/監管)結合使用:http://ipset.netfilter.org/iptables-extensions.man.html#lbAY- 使用這種方法,交通只會減慢,但不會阻塞。這可能更可行的原因是,iptables hashlimit 模組可以透過在客戶端進入伺服器時記錄不同的 IP 位址和/或來源/目標連接埠「雜湊金鑰」來處理客戶端的動態追蹤。我已經在另一個相關問題上發布了有關如何實現此目標的答案,此處:https://serverfault.com/a/754116/30506- 但總而言之,您建立一個流量整形類別(頻寬限制器固定在5Mb/秒),然後當每個客戶端會話的資料包速率達到特定閾值時,您開始將其資料包匯集到此類中,從而平息其流量。但就您而言,安撫需要調整為在數小時而不是幾秒鐘內運行。
答案2
您好,歡迎來到伺服器故障!
可以使用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!