我一直在嘗試限制來自相同 IP 的伺服器連接埠 80 的最大 TCP 連線數。我已經使用 iptables 來完成此任務:
-A INPUT -p tcp --dport 80 -m conntrack --ctstate ESTABLISHED -m connlimit --connlimit-above 24 --connlimit-mask 32 -j LOG_THROT
該規則將資料包發送到我的 LOG_THROT 鏈,我在其中記錄它們並 tcp 重置連接。
問題是,所有被記錄的 IP(溢出 24 並行 http 連接規則)並在 apache 的訪問日誌中找到的似乎是來自 google 推薦的合法用戶,來自標準移動 ISP(如沃達豐等)。代理,它是:
Mozilla/5.0(iPhone;CPU iPhone OS 11_3,如 Mac OS X)AppleWebKit/605.1.15(KHTML,如 Gecko)版本/11.0 Mobile/15E148 Safari/604.1
我想知道新的作業系統/瀏覽器是否有比標準6 個並行連接更高的限制,它是否可能使用某種在網站上找到的連結的預先載入並產生額外的連接,或者它是某種欺騙UA 的爬蟲類?
如果它是合法的,您對安全連線數限制有什麼建議? 50、100?
答案1
為什麼不調整你的網路並使用 HTTP/2(最終是 HTTPS)
它們都使用單一多路復用連接,而不是 HTTP1.x 中的多個連接。
答案2
解決了這個問題。但答案與最佳解決方案不同。最好的解決方案是prosti的回答。
發生的情況是前面提到的 Safari/iOS 不會重複使用以保持活動連線。造成這種情況的原因可能有很多,網路上對此主題充滿了不同的答案,甚至可能是最新版本中已棄用的功能。蘋果論壇在這個話題上毫無用處。
因此,對於必須從網站加載的每個資產,它會產生一個新連接,但伺服器使 conns 保持活動狀態 X 秒,最終達到 iptables 規則的閾值。
對我有幫助的解決方案是在 httpd.conf 中添加 BrowserMatch 指令,該指令匹配所有 iphone/ipod 設備並關閉對它們的 keepalive 支援。
BrowserMatch "iPhone|iPad|iPod" nokeepalive
至於 Safari 可以產生的最大連接數,我發現在某些錯誤情況下它會高達 15000! (https://www.wiktorzychla.com/2017/06/http2-keep-alive-and-safari-browsers.html)。但在正常情況下,根據以下統計數據判斷,每個域的值會更接近 4-8 或 15-30 分片:http://www.browserscope.org/?category=network&ua=Safari*&v=3