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

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

我最近遭受了来自多个代理 IP 的拒绝服务攻击,因此我安装了 cloudflare 来防止这种情况。然后我开始注意到他们通过直接连接到服务器的 IP 地址并伪造主机标头来绕过 cloudflare。

对于不是来自 cloudflare 使用的 18 个 ip 地址的连接,返回 403 的最高效方法是什么?
我尝试过denying all,然后明确allowing cloudflare ips,但这不起作用,因为我已经设置了它,这样就CF-Connecting-IP设置了 ipallow测试。

我正在使用 nginx 1.6.0。

答案1

如此处所述,您只能允许来自 cloudflare 的 IP 地址。

https://erichelgeson.github.io/blog/2014/01/18/whitelisting-cloudflare-in-nginx/

# https://www.cloudflare.com/ips
# IPv4
allow 103.21.244.0/22;
allow 103.22.200.0/22;
allow 103.31.4.0/22;
allow 104.16.0.0/12;
allow 108.162.192.0/18;
allow 131.0.72.0/22;
allow 141.101.64.0/18;
allow 162.158.0.0/15;
allow 172.64.0.0/13;
allow 173.245.48.0/20;
allow 188.114.96.0/20;
allow 190.93.240.0/20;
allow 197.234.240.0/22;
allow 198.41.128.0/17;

# IPv6
allow 2400:cb00::/32;
allow 2405:b500::/32;
allow 2606:4700::/32;
allow 2803:f800::/32;
allow 2c0f:f248::/32;
allow 2a06:98c0::/29;

deny all; # deny all remaining ips

请注意,由于 Cloudflare 的 IP 地址范围可能会发生变化,因此您必须不时更新此配置。要自动生成此配置,您可以使用这个脚本

答案2

我想到唯一可以用 nginx 本身完成的解决方案需要 nginx 1.9.7 或更高版本。

您可以使用ngx_http_geo_模块识别任何非 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

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

答案3

最有效的方法是在服务器前面安装硬件防火墙。或者请求数据中心/上游提供商帮助缓解攻击。

在 Web 服务器或 iptables 中阻止某些东西可能会有所帮助,但仍然会占用带宽和系统资源,因此仍然可能遭受 DoS 攻击。您需要尽可能地阻止上游的流量 - 这样流量就永远不会到达您的服务器,也不会将您的链接淹没到世界其他地方。硬件防火墙可以比您的 Web 服务器更快地过滤流量,并且不使用任何服务器资源。当您需要直接连接时,您会希望它们允许来自 cloudflare 以及您的办公室或其他服务器的流量。

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

答案4

这是从 Cloudflare 的 IP 生成地理映射的一行代码。不一定是最可爱的,也许专业人士可以纠正我。我无法在一个命令中获取和解析 v4 和 v6,因为文件末尾缺少回车符,并且第一个 v6 地址与最后一个 v4 连接在一起。

(echo -e "geo \$realip_remote_addr \$cloudflare_ip {\n\tdefault\t0;" && curl -s https://www.cloudflare.com/ips-v4 | sed "s|^|\t|g" | sed "s|\$|\t1;|g" && echo -e  && curl -s https://www.cloudflare.com/ips-v6 | sed "s|^|\t|g" | sed "s|\$|\t1;|g" && echo -e "\n}")>cloudflare-only.conf

灵感来自上面的 a55 脚本

相关内容