我如何拒绝所有不是来自cloudflare的请求?

我最近从多个代理服务器ips获得拒绝服务攻击,所以我安装了cloudflare来防止这种攻击。 然后,我开始注意到他们正在通过直接连接到服务器的IP地址并伪造主机头来绕过cloudflare。

返回403不是来自cloudflare使用的18个IP地址的连接返回403的最高性能方法是什么?
我试图deny一切,然后明确allow cloudflare ips,但这是行不通的,因为我已经设置,以便CF-Connecting-IP设置IP allowtesting。

我正在使用nginx 1.6.0。

性能最好的方法是在服务器前面的硬件防火墙。 或者要求数据中心/上游提供商帮助减轻攻击。

阻止它在web服务器或iptables中可能会有帮助,但仍然使用带宽和系统资源,所以DoS攻击仍然是可能的。 你想要的是尽可能在上游阻塞stream量 – 所以stream量永远不会到达你的服务器,并且不会把你的链接泛滥到世界其他地方。 硬件防火墙可以过滤stream量,远远超过您的networking服务器,并且不使用服务器资源。 当你需要直接连接时,你会希望他们允许来自cloudflare的stream量以及你的办公室或其他服务器。

更改服务器的IP可能也有帮助 – 只有cloudflare需要知道新的IP,不要将其公布在公共DNSlogging中。

我想出的唯一的解决scheme可以用nginx自行完成,需要nginx 1.9.7或更高版本。

您可以使用ngx_http_geo_module来标识并返回不是cloudflare ip的任何ip的403响应。

使用这个地理块。

 geo $realip_remote_addr $cloudflare_ip { default 0; 103.21.244.0/22 1; 103.22.200.0/22 1; 103.31.4.0/22 1; 104.16.0.0/12 1; 108.162.192.0/18 1; 131.0.72.0/22 1; 141.101.64.0/18 1; 162.158.0.0/15 1; 172.64.0.0/13 1; 173.245.48.0/20 1; 188.114.96.0/20 1; 190.93.240.0/20 1; 197.234.240.0/22 1; 198.41.128.0/17 1; 199.27.128.0/21 1; 2400:cb00::/32 1; 2405:8100::/32 1; 2405:b500::/32 1; 2606:4700::/32 1; 2803:f800::/32 1; 2c0f:f248::/32 1; 2a06:98c0::/29 1; } 

然后,您可以将其添加到您的服务器块。

 if ($cloudflare_ip != 1) { return 403; } 

这将返回403不是来自$cloudflare_ip任何连接。

这是因为我在使用real_ip_header CF-Connecting-IP时保留原​​始客户端地址的地理块中使用$realip_remote_addr