首页 > 代码库 > Varnish实现阻止异常IP访问请求

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.";       }      ... 
varnish_ForbidIP1

    看起来很简单,但这里有个问题,首先我们得知道异常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      ...
View Code

    注意,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();        }   
Get IP

同时统计,根据既定的条件,如同一个IP一定时间内,访问次数超过一定限制的,将这类IP整合到上面所用的异常IP list (filteriplist.html)     中,当这些IP再次访问Varnish时,        Varnish将会做出判断,并引导其到出错页面,不再访问后端服务器了。

    

    

Varnish实现阻止异常IP访问请求