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

Posted kcen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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访问请求的主要内容,如果未能解决你的问题,请参考以下文章

Squid代理服务器 Varnish服务器

varnishlogVarnishstat详解

varnish缓存实现动静分离

iptables 阻止对端口 8000 的访问,但 IP 地址除外

Varnish介绍

Wordpress阻止访问wp admin€“wpsnipp.com网站你博客的Wordpress代码片段