Cloudflare 是一家知名的云服务提供商,启用 CDN 服务后建议禁止其他 IP 访问。

配置

Nginx 可以设置 allow 或 deny 的 IP(段)。类似这样。

1
2
allow 114.51.4.0/22;
deny all; # 仅允许 114.51.4.0/22 的 IP 访问
1
2
allow all;
deny 114.51.4.0/22; # 仅不允许 114.51.4.0/22 的 IP 访问

实践

Cloudflare 在这里公布了所有的回源 IP 段。

按照上面的写法,可以写出下面的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
allow 103.21.244.0/22;
allow 103.22.200.0/22;
allow 103.31.4.0/22;
allow 104.16.0.0/13;
allow 104.24.0.0/14;
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 90.93.240.0/20;
allow 197.234.240.0/22;
allow 198.41.128.0/17;
allow 2400:cb00::/32;
allow 606:4700::/32;
allow 2803:f800::/32;
allow 2405:b500::/32;
allow 2405:8100::/32;
allow 2a06:98c0::/29;
allow 2c0f:f248::/32;

deny all;

但是每次都手动写不够优雅,我们可以…

写个脚本

Cloudflare 同样提供纯文本的 IP 段信息,省的写爬虫了。

1
2
3
4
5
6
7
8
9
#!/bin/sh

CLOUDFLARE_IPV4_URL="https://www.cloudflare.com/ips-v4"
CLOUDFLARE_IPV6_URL="https://www.cloudflare.com/ips-v6"

curl -s $CLOUDFLARE_IPV4_URL | awk '{print "allow " $0;}'
curl -s $CLOUDFLARE_IPV6_URL | awk '{print "allow " $0;}'

echo "deny all;"