一般生产环境的web服务器资源,都被视为十分珍贵,总是希望资源都尽可能不浪费地用在服务合法用户。但总会遇到一些恶意的客户端,频繁向web服务器发起嗅探式的请求,无论是恶意攻击或者是想从你的站点上获取到他们需要的数据资源,这些都不是网站管理员希望服务的用户。为了降低服务器的负载,更好地服务合法用户的web请求,网站管理员希望将恶意用户封禁在web服务器上游。
网络爬虫是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。常见的一些搜索引擎爬虫,同样会给web服务器造成压力。如下图,是从我个人的博客(http://www.thanks.live)nginx服务器的access log里提取到的百度和搜狗搜索引擎爬虫对本站的内容爬取记录:
- 123.125.71.87 - - [17/Aug/2017:22:23:49 +0800] "GET /index.php/tag/优化 HTTP/1.1" 200 24218 "-" "Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)"220.181.125.106 - - [17/Aug/2017:23:04:33 +0800] "GET /index.php/feed/post/difference-between-global-and-GLOBALS HTTP/1.1" 200 801 "-" "Sogou web spider/4.0(+http://www.sogou.com/docs/help/webmasters.htm#07)"
针对因为搜索引擎大量爬取造成的web服务器负载过高,我们可以通过robots.txt控制,但这仅限于遵循Robots协议的搜索引擎,使用方法是在你的web根目录下,创建一个robots.txt文件,文件用法参看百度百科对Robots协议的介绍。值得注意的是,封禁搜索引擎的爬取意味着会对你的站点收录、面向用户曝光产生影响,所以通常来说,会提供专门的供爬虫爬取的服务器。当有访问到达nginx代理层时,由nginx代理识别该访问是正常的用户访问还是爬虫访问,如果是爬虫访问,则反向代理到专门的服务器,如果是正常的用户访问,则负载均衡代理到真正的web服务器。这样既不会破坏搜索引擎对站点的收录,也降低了web服务器不必要的负载。以下是拒绝百度蜘蛛的nginx设置案例:
- location / {if ($http_user_agent ~* "Baiduspider"){return 403;}}
重启nginx,并模拟百度蜘蛛的访问,返回 http 403:
服务器拒绝频繁web请求的常用方法
模拟拒绝百度蜘蛛
如果是恶意用户模拟正常用户发起类DDOS攻击式访问web服务器呢?发现这样的客户端用户,就需要及时封禁IP,以防止给web服务器造成更大的危害。封禁IP,通常使用Linux防火墙-iptables,参考命令如下:
- iptables -I INPUT -s 60.206.194.34 -j DROP
解封禁则使用:
- iptables -D INPUT -s 60.206.194.34 -j DROP
注意:这里顺道也提一下,对于能过xinetd程序启动的网络服务,比如ftp telnet,除了使用iptables设置的办法以外,还可以通过使用TCP_Wrappers(TCP_Wrappers是一个工作在应用层的安全工具),以配置修改/etc/hosts.allow和/etc/hosts.deny文件的方式来实现, 但不是任何服务程序都能使用TCP_wrappers的,使用命令ldd /usr/sbin/sshd,如果输出中有libwrap,则说明可以使用TCP_wrappers, 即该服务可以使用/etc/hosts.allow和/etc/hosts.deny,如果输出没有libwrap则不可使用。但是,TCP_Wrappers 不能解决我们今天主题所讲到的拒绝异常web请求的问题。
以上列举的方法,都是通过手动添加封禁的配置,实际上,在生产环境中,都应该实现自动化配置的方式。iptables的设置更多的是故障发生或者监控发现后,彻底封禁恶意用户的方法。在实际运维场景中,我们更多的是希望根据单个ip的访问频次,来决定是否封禁或者暂时封禁ip。nginx为我们提供了频次控制的Module。限于篇幅长度,关于nginx请求频控,将在下次介绍 使用Nginx实现按连接数限流 和 使用Nginx实现请求限流。
参考文献:
http://blog.csdn.net/qjc_501165091/article/details/51225984
http://www.cnblogs.com/azhqiang/p/5801975.html
http://www.nginx.cn/446.html