文章
技术

用Nginx配合Cloudflare,打造CC防火墙

Cloudflare免费版提供不计上限的DDOS防护,几乎可以拦下100%的网络层DDOS攻击。然而,如果服务器的配置很差,那么即使是流量很小、不足以触发Cloudflare防护的HTTP DDOS攻击也可以使服务器宕机。

这里介绍一种防御HTTP DDOS攻击(也叫CC攻击)的方法,用Nginx的限速功能,拦截绕过Cloudflare的漏网之鱼。

Nginx使用漏桶算法限速,漏桶算法把传入请求看作往桶里注水,桶会以一定的速度往外漏水(放过合法请求),漏桶自身也有一定的容量,可以承受突发的注水(接受突发请求),如果桶满水就会溢出(拒绝超出限制的请求)。

Nginx使用漏桶算法限速用limit_req_zonelimit_req这两个指令。一个和cloudflare配合使用的例子如下:

http {

    limit_req_zone $http_cf_connecting_ip zone=my_limiter:20m rate=2r/s;

    server {

        limit_req zone=my_limiter burst=30;

    }
}

limit_req_zone指令的用途是分配内存,对每个来访问的IP,记录其一段时间内的访问次数,因此这个指令必须放在http块里。上面指令的意思是,设置一个新的限速器,命名为my_limiter,占用内存20MB,此限速器可接受的最大访问频率为每秒2次。

因为服务器套了cloudflare,所以nginx看到的是CF的IP,而不是用户的IP。cloudflare会把用户的IP放在cf_connecting_ip请求头里,可以用Nginx变量$http_cf_connecting_ip表示从http请求头中获取用户IP,对每个用户的IP进行限速。

注意这里的IP以文本形式记录,因此会浪费一些空间,不过20MB的内存足以支持数万的IP连接。

limit_req可以放在http、server、或location块里,表示指定该区域的可接受的突发请求速率。

nginx会把拦截的请求写入error.log,可以在日志看到nginx的拦截记录,被拦截的请求不会交给后端处理,而是返回503错误。

这样的配置足以防御一些小型的DOS攻击或者高频爬虫。

菜单
  1. YastPM   时代的无声记忆

    还得加点击盾之类吧,不然有很多时候不一定挡的掉 CloudFlare挡L4确实无敌,但是L7事实上还是很容易穿的