通过http-host标头阻止mod_security


16

最近几天,我注意到一些服务器受到未知请求的冲击。

其中大多数如下所示:

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客户端向我的Web服务器发出大量的“公告”,这几乎导致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的传入请求?请记住,请求不仅在/announce.php上而且在各种URL上,因此按URL进行阻止没有用。

同样,这种方法是否可行,还是会导致过多的负载,我应该在那些请求甚至到达Apache之前就一直丢弃它们。

更新:

事实证明,这个问题影响了全球许多国家的许多人。
关于它的报道和博客很多,还有各种解决方案可以阻止这种流量。

我收集了一些报告,以帮助任何来这里搜索解决方案的人。

神秘的误导中文流量:如何找出HTTP请求使用的DNS服务器?
奇怪的Bittorrent登录到我的服务器上
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 /
https://isc.sans.edu/forums/diary/Are+You+Piratebay+thepiratebayorg+Resolvening+to+Various+Hosts/ 19175 /
http://furbo.org/2015/01/22/fear-china/
http://www.jwz.org/blog/2015/01/chinese-bittorrent-the-gift-that-keeps-on-给予/


1
我看到与此类似的问题,我已阻止了请求,但我想知道您是如何确定哪些ISP返回不正确的IP地址的?我有兴趣找出请求的来源,因此这似乎是一个不错的起点
pogo 2015年

根据whatsmydns.net和其他全球DNS传播检查器的说法,当该域名在全球其他ISP上无法解析时,中国的CERNET和CPIP以及土耳其的TTNET会响应thepiratebay.org各个子域对各种IP的查询。
Cha0s 2015年

2
我得到的是完全相同的东西,它大约在您注意到它的同时开始。Facebook,bittorrent,色情网站。但最值得一提的是,这个持续不断的海盗湾宣告成立。 serverfault.com/questions/658433/… 我使用的是nginx,如果主机不匹配,我已经返回了444。
felix

宣布的请求减少了很多。也许是暂时的DNS错误配置。您还在看交通吗?
felix

2
老实说,我最终还是在防火墙级别阻止了中国,因为即使有了mod_security,它们也将填满所有Apache的连接。所以我没有注意到请求是否减少了。
Cha0s

Answers:


7

这里同样的问题。我正在使用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'"

1
虽然不是我真正需要的,但您的回答将我引向了正确的方向,因此我选择了您的正确答案。我最终通过匹配REQUEST_URI上的'?info_hash ='字符串阻止了所有种子请求。用户代理不是最好的方法,因为客户端使用具有不同UA的许多不同的Bittorrent客户端。我最终SecRule REQUEST_URI "\?info_hash\=" "id:10000002,rev:1,severity:2,nolog,msg:'Torrent Announce Hit Detected'"
得出

尝试dig a.tracker.thepiratebay.org从此列表public-dns.tk/nameserver/cn.html中的任何DNS服务器进行访问,并且在每个请求上都有不同的答案。同样,tracker.thepiratebay.org它也出现在我们的Host:标头中。在viewdns.info/research/…上有关于它的文章,还有一些其他站点。尝试使用viewdns.info/reverseip反转一些返回的地址,表明它几乎是随机的。
叶夫根尼(Evgeny)

5

我们的客户网站之一遇到了完全相同的问题。我在其顶部附近添加了以下内容:

# 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中没有任何内容,因此我们仅阻止了所有内容。


谢谢,但是我需要一个使用mod_security而不是mod_rewrite的解决方案。
Cha0s 2015年

参见engineering.bittorrent.com/2015/01/29/…以获得更好的方法(G / 410代替F / 403,以及明确的ErrorDocument)
ysth 2015年

5

目前,我遇到了同样的问题,因为洪流跟踪器指向了我的服务器。在过去的几天里,我一直在尝试使用iptables,并检查了请求的标头和模式,并将其缩小为几个iptables规则,这些规则几乎过滤了来自亚洲(中国,马来西亚,日本和香港)。

以下是规则。希望它可以帮助某人。

iptables -I INPUT -p tcp --dport 80 -m string --algo bm --string "Bittorrent" --to 1000 -j REJECT
iptables -I INPUT -p tcp --dport 80 -m string --algo bm --string "spider" --to 1000 -j REJECT
iptables -I INPUT -p tcp --dport 80 -m string --algo bm --string "announce" --to 1000 -j REJECT
iptables -I INPUT -p tcp --dport 80 -m string --algo bm --string "deviantart" --to 1000 -j REJECT
iptables -I INPUT -p tcp --dport 80 -m string --algo bm --string "Bittorrent" --to 1000 -j REJECT
iptables -I INPUT -p tcp --dport 80 -m string --algo bm --string "baidu" --to 1000 -j REJECT
iptables -I INPUT -p tcp --dport 80 -m string --algo bm --string "Baiduspider" --to 1000 -j REJECT

真好!我没想到!谢谢!:D您出于某些特定原因选择REJECT而不是DROP?(即:客户收到“ REJECT?” 后可能会停下来)
Cha0s 2015年

1
是的,REJECT应该告诉客户端停止请求该资源,尽管在这种情况下似乎没有帮助。它仍然会过滤掉它,因此我将其保留为REJECT,希望某些客户能得到提示。无论如何,在此任务中,iptables的性能应比mod_security好得多,因此,我希望它对您有效。
Franci 2015年

是的,应该!我屏蔽了所有中文前缀。我将尝试这种更好的方法:)我认为,即使使用REJECT,bittorrent客户端也不会停止重试。他们会将其视为“连接被拒绝”,并在一段时间后重试。我相信DROP是一种更好的方法(并且使用更少的资源-只是在数据包匹配后立即丢弃数据包,而无需任何进一步处理)
Cha0s 2015年

1
实际上,除了极端情况外,其他地方的差异几乎可以忽略不计,我希望最终能阻止交通。如果没有拨号,我将其更改为DROP。我很好奇为什么会这样或如何首先发生。关于将中国大防火墙重定向到随机IP的一些讨论,但是我敢肯定,这里不是这种情况。
弗朗西

1
+1好。--string "GET /announce"不过,我们将继续讨论实际的请求。
莱纳斯·克莱恩

5

我写了一篇博客文章,内容涉及如何正确地告诉BitTorrent客户离开并再也不会回来,这与Dan所做的类似,只是使用了nginx。

server {
    location /announc {
        access_log off;
        error_log off;
        default_type text/plain;
        return 410 "d14:failure reason13:not a tracker8:retry in5:nevere";
    }
}

洪流跟踪器(通常)具有以/announce或开头的标准URL /scrape,因此我不会这么快就拒绝通过URL进行过滤。有用。

完整的帖子位于-http://dvps.me/ddos-attack-by-torrent


1
有趣的阅​​读。感谢您的分享:)但我相信,这种攻击是DNS Cache Poisoning由于中国的CERNET响应具有随机和非中文IP的TPB域而引起的。AFAIK PEX用于共享同级,而不是跟踪器。您能否对此进行详细说明或提供一些文档?
Cha0s

此处提供了共享跟踪器的扩展名bittorrent.org/beps/bep_0028.html。但是您的正确之处在于,所有这些请求的“ Host:”标头都是a.tracker.thepiratebay.orgtracker.thepiratebay.org可能不是这些客户端的实际目标。也可能是伪造的客户,只是假装自己是中国的仇恨者:)
Evgeny

1
BitTorrent的人建议410,而不是404:engineering.bittorrent.com/2015/01/29/...
YSTH

0

我从以下网址获取了中国IP地址范围:http : //www.wizcrafts.net/chinese-blocklist.html 并将其阻止在我的csf防火墙中,如果您要复制并粘贴到拒绝csf的IP列表中,请使用以下范围:

#china blocks start
1.80.0.0/13
1.92.0.0/14
1.192.0.0/13
1.202.0.0/15
1.204.0.0/14
14.144.0.0/12
14.208.0.0/12
23.80.54.0/24
23.104.141.0/24
23.105.14.0/24
27.8.0.0/13
27.16.0.0/12
27.36.0.0/14
27.40.0.0/13
27.50.128.0/17
27.54.192.0/18
27.106.128.0/18
27.115.0.0/17
27.148.0.0/14
27.152.0.0/13
27.184.0.0/13
36.32.0.0/14
36.248.0.0/14
42.96.128.0/17
42.120.0.0/15
58.16.0.0/15
58.20.0.0/16
58.21.0.0/16
58.22.0.0/15
58.34.0.0/16
58.37.0.0/16
58.38.0.0/16
58.40.0.0/16
58.42.0.0/16
58.44.0.0/14
58.48.0.0/13
58.56.0.0/15
58.58.0.0/16
58.59.0.0/17
58.60.0.0/14
58.68.128.0/17
58.82.0.0/15
58.100.0.0/15
58.208.0.0/12
58.242.0.0/15
58.246.0.0/15
58.248.0.0/13
59.32.0.0/12
59.51.0.0/16
59.52.0.0/14
59.56.0.0/13
59.72.0.0/16
59.108.0.0/15
59.172.0.0/14
60.0.0.0/13
60.11.0.0/16
60.12.0.0/16
60.24.0.0/13
60.160.0.0/11
60.194.0.0/15
60.208.0.0/13
60.216.0.0/15
60.220.0.0/14
61.4.64.0/20
61.4.80.0/22
61.4.176.0/20
61.48.0.0/13
61.128.0.0/10
61.135.0.0/16
61.136.0.0/18
61.139.0.0/16
61.145.73.208/28
61.147.0.0/16
61.150.0.0/16
61.152.0.0/16
61.154.0.0/16
61.160.0.0/16
61.162.0.0/15
61.164.0.0/16
61.175.0.0/16
61.177.0.0/16
61.179.0.0/16
61.183.0.0/16
61.184.0.0/16
61.185.219.232/29
61.187.0.0/16
61.188.0.0/16
61.232.0.0/14
61.236.0.0/15
61.240.0.0/14
101.64.0.0/13
101.72.0.0/14
101.76.0.0/15
101.80.0.0/12
103.253.4.0/22
106.112.0.0/13
110.6.0.0/15
110.51.0.0/16
110.52.0.0/15
110.80.0.0/13
110.88.0.0/14
110.96.0.0/11
110.173.0.0/19
110.173.32.0/20
110.173.64.0/18
110.192.0.0/11
110.240.0.0/12
111.0.0.0/10
111.72.0.0/13
111.121.0.0/16
111.128.0.0/11
111.160.0.0/13
111.172.0.0/14
111.176.0.0/13
111.228.0.0/14
112.0.0.0/10
112.64.0.0/14
112.80.0.0/12
112.100.0.0/14
112.111.0.0/16
112.122.0.0/15
112.224.0.0/11
113.0.0.0/13
113.8.0.0/15
113.12.0.0/14
113.16.0.0/15
113.18.0.0/16
113.62.0.0/15
113.64.0.0/10
113.128.0.0/15
113.136.0.0/13
113.194.0.0/15
113.204.0.0/14
114.28.0.0/16
114.80.0.0/12
114.96.0.0/13
114.104.0.0/14
114.112.0.0/14
112.109.128.0/17
114.216.0.0/13
114.224.0.0/11
115.24.0.0/15
115.28.0.0/15
115.32.0.0/14
115.48.0.0/12
115.84.0.0/18
115.100.0.0/15
115.148.0.0/14
115.152.0.0/15
115.168.0.0/14
115.212.0.0/16
115.230.0.0/16
115.236.96.0/23
115.236.136.0/22
115.239.228.0/22
116.1.0.0/16
116.2.0.0/15
116.4.0.0/14
116.8.0.0/14
116.16.0.0/12
116.52.0.0/14
116.76.0.0/15
116.90.80.0/20
116.112.0.0/14
116.128.0.0/10
116.204.0.0/15
116.208.0.0/14
116.224.0.0/12
116.254.128.0/18
117.8.0.0/13
117.21.0.0/16
117.22.0.0/15
117.24.0.0/13
117.32.0.0/13
117.40.0.0/14
117.44.0.0/15
117.60.0.0/14
117.79.224.0/20
117.80.0.0/12
117.136.0.0/13
118.26.0.0/16
118.72.0.0/13
118.112.0.0/13
118.120.0.0/14
118.132.0.0/14
118.144.0.0/14
118.180.0.0/14
118.186.0.0/15
118.192.0.0/15
118.248.0.0/13
119.0.0.0/13
119.8.0.0/16
119.10.0.0/17
119.18.192.0/20
119.36.0.0/16
119.57.0.0/16
119.60.0.0/16
119.88.0.0/14
119.96.0.0/13
119.112.0.0/13
119.120.0.0/13
119.128.0.0/12
119.144.0.0/14
119.164.0.0/14
119.176.0.0/12
119.233.0.0/16
120.0.0.0/12
120.24.0.0/14
120.32.0.0/13
120.40.0.0/14
120.68.0.0/14
120.80.0.0/13
120.192.0.0/10
121.0.16.0/20
121.8.0.0/13
121.16.0.0/12
121.32.0.0/14
121.60.0.0/14
121.76.0.0/15
121.196.0.0/14
121.204.0.0/14
121.224.0.0/12
122.10.128.0/17
122.51.128.0/17
122.64.0.0/11
122.119.0.0/16
122.136.0.0/13
122.156.0.0/14
122.188.0.0/14
122.192.0.0/14
122.198.0.0/16
122.200.64.0/18
122.224.0.0/12
123.4.0.0/14
123.8.0.0/13
123.52.0.0/14
123.64.0.0/11
123.97.128.0/17
123.100.0.0/19
123.112.0.0/12
123.128.0.0/13
123.138.0.0/15
123.150.0.0/15
123.152.0.0/13
123.164.0.0/14
123.180.0.0/14
123.184.0.0/14
123.196.0.0/15
123.232.0.0/14
123.249.0.0/16
124.42.64.0/18
124.64.0.0/15
124.67.0.0/16
124.73.0.0/16
124.114.0.0/15
124.126.0.0/15
124.128.0.0/13
124.160.0.0/15
124.162.0.0/16
124.163.0.0/16
124.192.0.0/15
124.200.0.0/13
124.226.0.0/15
124.228.0.0/14
124.236.0.0/14
124.240.0.0/17
124.240.128.0/18
124.248.0.0/17
125.36.0.0/14
125.40.0.0/13
125.64.0.0/12
125.79.0.0/16
125.80.0.0/13
125.88.0.0/13
125.104.0.0/13
125.112.0.0/12
125.210.0.0/15
140.224.0.0/16
140.237.0.0/16
140.246.0.0/16
140.249.0.0/16
142.4.117.0/30
159.226.0.0/16
171.34.0.0/15
171.36.0.0/14
171.40.0.0/13
175.0.0.0/12
175.16.0.0/13
175.24.0.0/14
175.30.0.0/15
175.42.0.0/15
175.44.0.0/16
175.46.0.0/15
175.48.0.0/12
175.64.0.0/11
175.102.0.0/16
175.106.128.0/17
175.146.0.0/15
175.148.0.0/14
175.152.0.0/14
175.160.0.0/12
175.178.0.0/16
175.184.128.0/18
175.185.0.0/16
175.186.0.0/15
175.188.0.0/14
180.76.0.0/16
180.96.0.0/11
180.136.0.0/13
180.152.0.0/13
180.208.0.0/15
182.18.0.0/17
182.32.0.0/12
182.88.0.0/14
182.112.0.0/12
182.128.0.0/12
183.0.0.0/10
183.64.0.0/13
183.129.0.0/16
183.148.0.0/16
183.160.0.0/12
183.184.0.0/13
183.192.0.0/11
192.34.109.224/28
192.74.224.0/19
198.2.203.64/28
198.2.212.160/28
202.43.144.0/22
202.46.32.0/19
202.66.0.0/16
202.75.208.0/20
202.96.0.0/12
202.111.160.0/19
202.112.0.0/14
202.117.0.0/16
202.165.176.0/20
202.196.80.0/20
203.69.0.0/16
203.86.0.0/18
203.86.64.0/19
203.93.0.0/16
203.169.160.0/19
203.171.224.0/20
210.5.0.0/19
210.14.128.0/19
210.21.0.0/16
210.32.0.0/14
210.51.0.0/16
210.52.0.0/15
210.77.0.0/16
210.192.96.0/19
211.76.96.0/20
211.78.208.0/20
211.86.144.0/20
211.90.0.0/15
211.92.0.0/14
211.96.0.0/13
211.136.0.0/13
211.144.12.0/22
211.144.96.0/19
211.144.160.0/20
211.147.0.0/16
211.152.14.0/24
211.154.64.0/19
211.154.128.0/19
211.155.24.0/22
211.157.32.0/19
211.160.0.0/13
211.233.70.0/24
218.0.0.0/11
218.56.0.0/13
218.64.0.0/11
218.84.0.0/14
218.88.0.0/13
218.96.0.0/14
218.102.0.0/16
218.104.0.0/14
218.108.0.0/15
218.194.80.0/20
218.200.0.0/13
218.240.0.0/13
219.128.0.0/11
219.154.0.0/15
219.223.192.0/18
219.232.0.0/16
219.234.80.0/20
219.235.0.0/16
220.112.0.0/16
220.154.0.0/15
220.160.0.0/11
220.181.0.0/16
220.191.0.0/16
220.192.0.0/12
220.228.70.0/24
220.242.0.0/15
220.248.0.0/14
220.250.0.0/19
220.252.0.0/16
221.0.0.0/12
221.122.0.0/15
221.176.0.0/13
221.192.0.0/14
221.200.0.0/14
221.204.0.0/15
221.206.0.0/16
221.207.0.0/16
221.208.0.0/12
221.212.0.0/15
221.214.0.0/15
221.216.0.0/13
221.224.0.0/13
221.228.0.0/14
221.232.0.0/13
222.32.0.0/11
222.64.0.0/12
222.80.0.0/12
222.132.0.0/14
222.136.0.0/13
222.168.0.0/13
222.172.222.0/24
222.176.0.0/13
222.184.0.0/13
222.200.0.0/16
222.208.0.0/13
222.219.0.0/16
222.220.0.0/15
222.240.0.0/13
223.4.0.0/14
223.64.0.0/11
223.144.0.0/12
223.240.0.0/13
#china blocks end

或者,你可以简单地添加CC_DENY = "CN"/etc/csf/csf.conf,它会自动找到根据的MaxMind的GeoIP的数据库中的中国前缀。
Cha0s 2015年

谢谢,但是我不确定哪种方式会消耗较少的服务器资源,例如CPU使用率,CC_DENY或直接IP阻止。我会说直接IP阻止更好。
user3601800 2015年

我没什么区别。一旦iptables规则加载(一种或另一种方式-规则本质上是相同的),系统上的负载将相同。唯一的区别是您的列表是静态的(因此您必须手动将其保持最新),而GeoIP数据库中的列表将不时自动更新,以反映每个国家/地区代码的任何新的或过时的前缀。无论哪种方式,当您用iptables阻止许多前缀时,都会给系统带来额外的负担。负载来自iptables本身,而不是来自您查找要阻止的前缀的方式。
Cha0s 2015年

我不得不说,在csf中阻止国家/地区代码CN不适用于我,今天我发现来自中国的新IP被mod_security阻止了
user3601800 2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.