存在哪些出站 HTTP 限制解決方案?
我正在尋找一種以尊重站點策略的方式靈活管理出站 HTTP/HTTPS 流量的方法,並且可以部署在我們數據中心網路的“邊緣”。
例如,我們使用了幾個具有“每秒不超過 4 個請求”或“每天最多 5 萬個請求”等限制速率的 Web API。我們公司有很多人使用這些服務,所以我不能集中管理軟體中的所有請求。人們以不同的時間表和不同的強度執行這些事情。我們對此很好(它滿足內部需求),但我們意識到 - 總的來說 - 我們可能會遇到產生大量並發流量的情況,以至於我們被網站阻止。(雖然是無意的)
我期待/希望的是,我們可以利用網路硬體世界中已經存在的頻寬管理/流量整形解決方案,並且我們隨後可以在數據中心網路的邊緣部署這樣的東西。
理想情況下,我可以編寫 L4 或 L7 路由規則,以確保我們的數據中心生成的出站請求不超過 - 例如 - 4 個請求/秒。理想情況下,其餘的請求將由硬體排隊一段合理的時間長度,而隊列容量過剩則被簡單地拒絕。我意識到沒有免費的午餐,並且限制不會解決根本的內在需求(請求)與供應(站點策略)問題。但是,限制將允許我們在某個視窗(例如一天)內“平滑”請求,以便我們可以以適當限制的方式利用外部服務,同時最大限度地利用我們。
有誰知道這樣的網路級頻寬管理解決方案?如果是這樣,它是否還支持不僅基於 HTTP 請求中的 URL 之類的規則,而且還支持一些額外的 HTTP 標頭?
netfilter的功能幾乎是無限的。在這個我會使用 iptables 中的限制模組。請注意:在不丟棄數據包的情況下,無法限制 TCP/IP 中的速率。您可以將數據包排隊,但最終當隊列已滿時數據包會被丟棄。所以我們要刪除 SYN 包。到目前為止我還沒有嘗試過,可能是因為很長的重試超時沒有人這樣做,即瀏覽器可能會被鎖定。
限制
該模組使用令牌桶過濾器以有限的速率匹配。使用此擴展的規則將匹配,直到達到此限制(除非使用“!”標誌)。例如,它可以與 LOG 目標結合使用以提供有限的日誌記錄。
–limit rate 最大平均匹配率:指定為數字,帶有可選的’/second’、’/minute’、’/hour’或’/day’後綴;預設值為 3/小時。
–limit-burst number 要匹配的最大初始數據包數:每次未達到上面指定的限制時,此數字會重新充電一次,直到此數字;預設值為 5。
- 我們設置了一個新的鏈來限制連接。4/sec 它將返回到呼叫者鏈,其餘的被丟棄。
- 到埠 80 的新連接被發送到該新鏈。
iptables -N CONNRATELIMIT iptables -A CONNRATELIMIT -m limit --limit 4/sec -j RETURN iptables -A CONNRATELIMIT -j DROP iptables -A INPUT -p tcp --dport 80 -m state --state NEW -j CONNRATELIMIT
我使用二級鏈只是為了展示這個概念。您也可以在路由器上執行此操作,然後您必須為要限制的每個伺服器或實體創建一個鏈。並使用 FORWARD 而不是 INPUT。
排隊
在這個解決方案中,沒有“長時間”排隊。您可以使用limit和limit-burst參數。也可以將 SYN 數據包發送到隊列規則:設置要復雜得多,我看不出它如何使丟棄 SYN 數據包的事情變得更好。
網址匹配
URL 匹配也是可能的,在這種情況下,您會丟棄該數據包並通過等待重新傳輸來延遲連接,我已經對模組最近做了這樣的事情,但我用它來防止暴力攻擊和埠掃描。所以我不在乎我限制的連接。正確處理連接將變得困難!