mod_security 通過 http-host 標頭阻止請求
最近幾天,我注意到一些伺服器受到未知請求的衝擊。
它們中的大多數如下所示:
60.246.*.* - - [03/Jan/2015:20:59:16 +0200] "GET /announce.php?info_hash=%80%85%8e%9bu%cfJ.%85%82%e9%25%bf%8e%9e%d7%bf%c5%b0%12&peer_id=-UT3420-v%8bN%aa%60%60%fd%5d%d1%b0Ux&port=15411&uploaded=48588531&downloaded=0&left=0&corrupt=0&key=9E124668&numwant=200&compact=1&no_peer_id=1 HTTP/1.1" 200 -
經過一些記錄和搜尋後,我發現一些中國 ISP(根據 whatsmydns.net 的結果可能是 CERNET)和一些土耳其 ISP(可能是 TTNET)響應 dns 查詢,例如
a.tracker.thepiratebay.org
使用與 piratebay 無關的各種 IP或種子。換句話說,他們似乎出於某種奇怪的原因進行了某種 DNS 記憶體中毒。因此,這些國家/地區的數百個(如果不是數千個)bittorrent 客戶端向我的網路伺服器發出大量“通知”,這幾乎導致 DDoS 攻擊填滿了所有 Apache 的連接。
目前我完全屏蔽了中國和土耳其,它確實有效,但我想找到一種更好的方法來屏蔽這些請求。
我正在考慮使用基於 HTTP Host 標頭的 mod_security 阻止這些請求。
所有這些請求都包含一個 HTTP Host 標頭,例如
a.tracker.thepiratebay.org
(或 thepiratebay.org 域的許多其他子域)。這是通過 PHP
$_SERVER
變數轉儲的請求標頭。DOCUMENT_ROOT: /usr/local/apache/htdocs GATEWAY_INTERFACE: CGI/1.1 HTTP_ACCEPT_ENCODING: gzip HTTP_CONNECTION: Close HTTP_HOST: a.tracker.thepiratebay.org HTTP_USER_AGENT: uTorrent/342(109415286)(35702) PATH: /bin:/usr/bin QUERY_STRING: info_hash=%80%85%8e%9bu%cfJ.%85%82%e9%25%bf%8e%9e%d7%bf%c5%b0%12&peer_id=-UT3420-v%8bN%aa%60%60%fd%5d%d1%b0Ux&port=15411&uploaded=48588531&downloaded=0&left=0&corrupt=0&key=9E124668&numwant=200&compact=1&no_peer_id=1 REDIRECT_STATUS: 200 REMOTE_ADDR: 60.246.*.* REMOTE_PORT: 3445 REQUEST_METHOD: GET REQUEST_URI: /announce.php?info_hash=%80%85%8e%9bu%cfJ.%85%82%e9%25%bf%8e%9e%d7%bf%c5%b0%12&peer_id=-UT3420-v%8bN%aa%60%60%fd%5d%d1%b0Ux&port=15411&uploaded=48588531&downloaded=0&left=0&corrupt=0&key=9E124668&numwant=200&compact=1&no_peer_id=1 SCRIPT_FILENAME: /usr/local/apache/htdocs/announce.php SCRIPT_NAME: /announce.php SERVER_ADDR: *.*.*.* SERVER_ADMIN: *@*.* SERVER_NAME: a.tracker.thepiratebay.org SERVER_PORT: 80 SERVER_PROTOCOL: HTTP/1.1 SERVER_SIGNATURE: SERVER_SOFTWARE: Apache/2.2.29 (Unix) mod_ssl/2.2.29 OpenSSL/1.0.1e-fips mod_bwlimited/1.4 mod_perl/2.0.8 Perl/v5.10.1 UNIQUE_ID: VKg8BJBMIPQAD01XYzgAAAAD PHP_SELF: /announce.php REQUEST_TIME_FLOAT: 1420311556.43 REQUEST_TIME: 1420311556 argv: Array argc: 1
所以我的問題是,如何根據請求域(HTTP 主機標頭)阻止對 Apache 的傳入請求?請記住,請求在各種 URL 上,而不僅僅是 /announce.php,因此通過 URL 阻止是沒有用的。
這種方法是否可行,或者它會導致過多的負載,我應該在它們到達 Apache 之前繼續丟棄這些請求?
更新:
事實證明,這個問題已經影響了全球許多國家的許多人。
有很多關於它的報告和部落格文章以及阻止這種流量的各種解決方案。
我收集了一些報告來幫助任何來這裡尋找解決方案的人來阻止這個。
神秘的誤導中文流量:如何找出HTTP請求使用的DNS伺服器?
http://blog.devops.co.il/post/108740168304/torrent-ddos-attack
https://www.webhostingtalk.com/showthread.php?t=1443734
http://torrentfreak。 com/zombie-pirate-bay-tracker-fuels-chinese-ddos-attacks-150124/
http://furbo.org/2015/01/22/fear-china/
http://www.jwz.org/blog/2015/01/chinese-bittorrent-the-gift-that-keeps-on-給予/
這裡同樣的問題。我正在使用 mod_security 來阻止使用者代理
SecRule REQUEST_HEADERS:User-Agent "Bittorrent" "id:10000002,rev:1,severity:2,log,msg:'Bittorrent Hit Detected'"
在您確認它正在工作後,我會將日誌更改為 nolog,以避免填滿您的日誌文件
SecRule REQUEST_HEADERS:User-Agent "Bittorrent" "id:10000002,rev:1,severity:2,nolog,msg:'Bittorrent Hit Detected'"
我們的客戶網站之一遇到了完全相同的問題。我在他們的頂部附近添加了以下內容:
# Drop Bittorrent agent 2015-01-05 before redirect to https <IfModule mod_rewrite.c> RewriteEngine on # RewriteCond %{HTTP_USER_AGENT} =Bittorrent RewriteRule ^/announce$ - [F] RewriteRule ^/announce\.php$ - [F] </IfModule>
註釋掉的 RewriteCond 可以取消註釋以僅阻止特定的使用者代理。但他們在announce 或announce.php 中沒有內容,所以我們將其全部屏蔽。