Varnish实现阻止异常IP访问请求
若网站已在使用varnish,下面这个示例场景可以参考,作技术交流
现在很多网站尤其是电商类的网站比较容易遭到网络攻击,如DoS,DDoS网络攻击
当然在当今社会,当今互联网环境中,这种现象也是正常的,但如何应对,大公司有大公司做法,小公司有小公司做法,也有小公司借助大公司,如借助第三方云服务商应对
若已有安全解决方案(请绕行^_^),这里介绍的利用Varnish实现动态阻止异常IP访问请求的方法,限于相关资源缺乏,成本受限情况。当服务端被攻击时,除了网络流程,
服务端应用程序与服务器无法为正常请求提供服务,所以需要阻止那些异常请求,比如通过封掉异常IP,从而缓解被异常IP请求对服务端超成的压力。
Varnish作为反向代理,位于Web服务器前面,可作为Web前端缓存,若能在这端阻止,异常请求就不会到后端服务器,也就不会给后端服务器超成压力。
如下图(略去防火墙、路由器等网络设备)
那么只要在vcl脚本中加如下代码
acl forbiddenip { " 192.168.1.10"; //abnormal ip1 "192.168.1.13"; //abnormal ip1 } sub vcl_recv { if (client.ip ~ forbiddenip) { error 405 "Not allowed."; } ...
看起来很简单,但这里有个问题,首先我们得知道异常IP列表,其次就算有了IP列表,也不能每次更改vcl文件,将ip地址填入,若ip有成千上万,这vcl代码看起来...嗯,不能看:)
其实vcl文件中可以include相应文件,这样就可以将ip存放在相应的文件中
1 acl forbiddenip { 2 "192.168.1.11"; 3 include "/usr/local/varnish/filteriplist.html"; //abnormal ip list 4 } 5 sub vcl_recv { 6 if (client.ip ~ forbiddenip) 7 { 8 error 405 "Not allowed."; 9 } 10 ...
注意,filteriplist.html文件中iplist需要以 "192.168.1.11";"192.168.1.12";"192.168.1.13";格式存储
这里是.html文件,也可以是文本文件
如何获得这个ip list 呢,其实这个与我们应用程序有关了,不管是asp,php,jsp中哪一种,在关键页面中,识别Request请求消息,通常是请求头中的内容,对每次请求的客户端
ip做记录(可存入RMDB,文件,NOSQL等)
页面中获得ip方法,示例
String ip = request.getHeader("x-forwarded-for"); if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("Proxy-Client-IP"); } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("WL-Proxy-Client-IP"); } if ((ip == null || ip.length() == 0|| "unknown".equalsIgnoreCase(ip)) { ip = request.getHeader("HTTP_X_FORWARDED_FOR"); } if(ip == null || ip.length() == 0 || "unknown".equalsIgnoreCase(ip)) { ip = request.getRemoteAddr(); }
同时统计,根据既定的条件,如同一个IP一定时间内,访问次数超过一定限制的,将这类IP整合到上面所用的异常IP list (filteriplist.html) 中,当这些IP再次访问Varnish时, Varnish将会做出判断,并引导其到出错页面,不再访问后端服务器了。