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      ...

注意,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将会做出判断,并引导其到出错页面,不再访问后端服务器了。

时间: 2024-11-05 11:27:48

Varnish实现阻止异常IP访问请求的相关文章

统计nginx日志单IP访问请求数排名

下面是我截取一段nginx日志 127.0.0.1 - - [20/Jan/2015:10:54:02 +0800] "GET / HTTP/1.1" 200 20808 "-" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:31.0) Gecko/20100101 Firefox/31.0" 127.0.0.1 - - [20/Jan/2015:10:54:03 +0800] "GET /fa

获取客户端ip访问网站的次数和请求页面脚本

获取客户端ip访问网站的次数和请求页面 #/bin/bash cd /data/iplog/$1/pv txt=$(ls -l|awk '{print $NF}'|sed '1d') for n in $txt do ip=$(cat /root/iplist) for n1 in $ip do grep $n1 $n >>/opt/txt01/$n1-$1-cpv.txt done done rep_txt=$(cd /opt/txt01/&&ls -l *cpv.txt|a

apache禁止使用IP访问的实现方法

apache禁止访问目录列表 apache禁止访问目录列表对于开发人员来说还是蛮实用的,可以迅速查找根目录下的所有项目,但如果一个挂在互联网上的服务器为了提高安全性就必须禁止访问目录列表. 找到Apache 的 httpd.conf 配置文件将: XML/HTML代码 Options Indexes FollowSymLinks 改为:Options FollowSymLinks 也就是把 Indexes 去掉. 额外信息:在apache中设置虚拟主机 在IIS中我们可以方便的通过不同的IP或者

Apache2.4使用require指令进行访问控制–允许或限制IP访问/通过User-Agent禁止不友好网络爬虫

从Apache2.2升级到Apache2.4后,发现原来用来限制部分IP和垃圾网络爬虫的访问控制规则不起作用,查询后才发现,Apache2.4中开始使用mod_authz_host这个新的模块来进行访问控制和其他的授权检查.原来在Apache2.2版本下用以实现网站访问控制的Order,Allow,Deny指令需要替换为新的Require访问控制指令. 注意:使用require指令时,需要在指令外添加<RequireAll></RequireAll>标签对,否则重启Apache2.

ROS Dst-Nat 后内网不能通过公网IP访问内网服务器解决方法

通常企业内部会有很多服务器需要互联网用户访问,这时就需要做Dst-Nat. 但是我们配置完后会 发现内网用户不能通过公网IP访问对应的服务器.其实这时我们再添加一条策略即可搞定. 实例说明: 内网服务器:172.16.0.101 路由器LAN口: 172.16.254.2 公网IP: 106.37.xxx.xxx 外网访问IP假设为 1.1.1.1    内网访问的PC 假设IP为172.16.3.100 配置NAT: 配置完后,外网可以正常访问了.但是内网通过公网IP不可访问. 究其原因: 外

Nginx 拒绝指定IP访问

来源 : http://www.ttlsa.com/nginx/nginx-deny-ip-access/   闲来无事,登陆服务器,发现有个IP不断的猜测路径.试图往服务器上传文件(木马).于是查看了之前的日志,无奈鄙站被攻击者盯上了,不断的有不同的IP试图上传木马.看来坏人还是有的.由于不想让鄙站沦为肉鸡,所以就想写个简单的脚本,来阻止攻击者的IP访问. 攻击者: 195.154.216.165 - - [28/Nov/2015:23:10:40 +0800] "POST /wp-conte

SAE Django如何禁止外部IP访问

在SAE上基于Django搭建的Web工程有时需要禁止来自某些特定IP地址的访问请求. 例如一个为搭建在SAE的其他项目提供服务的内部工程,可以设置为只允许SAE内部的IP地址访问,从而提高项目的安全性. 要修改SAE Django工程的访问规则,需要变更工程的WSGI配置文件. 通过向WSGI配置文件添加中间件,可以根据客户端请求信息的IP地址.User-Agent,Referer等属性对访问请求进行过滤. SAE Django工程根目录1/下的index.wsgi的路由配置源码如下: #Ro

防恶意解析,禁止用IP访问网站的Apache设置

一般来说,网站可以用域名和IP来访问.你的网站可以通过IP直接访问,本来这没什么问题,但是会有些隐患: 由于搜索引擎也会收录你的IP地址的页面,所以同一个页面搜索引擎会重复收录,造成页面的权重不如单个收录高. 域名恶意指向的可能.还记得去年还是前年的 google.com.sb 事件吗?google.com.sb 这个域名被恶意指向了百度,后来证实了 google.com.sb 这个域名为第三者恶意指向的,并不是Google所为.当然这只是个玩笑,但是如果被人恶意用别的域名解析到你的IP的话,那

配置Nginx防止直接用IP访问Web服务器

看了很多Nginx的配置,好像都忽略了ip直接访问Web的问题,这样理论上不利于SEO优化,所以我们希望可以避免直接用IP访问网站,而是域名访问,具体怎么做呢,看下面. 官方文档中提供的方法: If you do not want to process requests with undefined "Host" header lines, you may define a default server that just drops the requests: server { li