希望用户只能通过 Cloudflare CDN 访问网站,你们怎么配置 Nginx 的?

4 天前
 52txr

我希望用户只能通过 Cloudflare CDN 访问网站,并且直接访问源站时会返回 403 Forbidden 。

在 Nginx 配置文件中,我的配置大概如下:

server {
    listen 80;
    server_name example.com;  # 替换为你的域名

    location / {
        # 允许 Cloudflare 的 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;

        # 允许 Cloudflare 的 IPv6 段(如果启用 IPv6 )
        allow 2400:cb00::/32;
        allow 2606:4700::/32;
        allow 2803:f800::/32;
        allow 2405:b500::/32;
        allow 2405:8100::/32;
        allow 2a06:98c0::/29;
        allow 2c0f:f248::/32;

        # 拒绝所有其他 IP
        deny all;

        # 正常的请求处理
        try_files $uri $uri/ =404;
    }
}

按理说我觉得使用直接配置后使用访问网站,应该正常显示。但是实际上是 403.

我是参考下面几个链接配置的:

[已完成] 怎样 只允许指定 IP 和域名访问网站: https://www.bt.cn/bbs/thread-72524-1-1.html

Nginx 设置只允许来自 Cloudflare CDN 的 IP 访问的方法 宝塔 NGINX 网站只允许 CF IP 访问方法: https://bnxb.com/nginx/27638.html

2990 次点击
所在节点    云计算
33 条回复
NekoNeko666
3 天前
Citrus
3 天前
大概率是 set_real_ip_from 的问题。刚好我也研究了这个问题。
set_real_ip_from 执行阶段在 allow deny 之前,所以 allow deny 拿到的实际是 set_real_ip_from 处理后的真实客户端 IP ,而不是 CF 的 IP 。
但是,set_real_ip_from 其实会保留原始 IP ,在变量 $realip_remote_addr 中。所以我们可以利用这个变量曲线救国。

先使用 geo 模块,给原始 IP 打标:
geo $realip_remote_addr $is_cf {
default 0;
# Cloudflare IPv4 Allow
173.245.48.0/20 1;
103.21.244.0/22 1;
103.22.200.0/22 1;
103.31.4.0/22 1;
141.101.64.0/18 1;
108.162.192.0/18 1;
190.93.240.0/20 1;
188.114.96.0/20 1;
197.234.240.0/22 1;
198.41.128.0/17 1;
162.158.0.0/15 1;
104.16.0.0/13 1;
104.24.0.0/14 1;
172.64.0.0/13 1;
131.0.72.0/22 1;

# Cloudflare IPv6 Allow
2400:cb00::/32 1;
2606:4700::/32 1;
2803:f800::/32 1;
2405:b500::/32 1;
2405:8100::/32 1;
2a06:98c0::/29 1;
2c0f:f248::/32 1;
}

然后在需要的地方,直接根据标记断连:
if ($is_cf = 0) {
return 444;
}
Hydrogen404
3 天前
用 cf 代理了 DNS 后,通过域名访问有可能不走 CDN 吗?我的 Nginx 直接拒绝 IP 直接访问,只允许通过域名访问。这样不知道是否可行。
Citrus
3 天前
@Hydrogen404 不可行,可能会被扫描出来。
MFWT
3 天前
CF 回源支持 TLS 双向认证,没有客户端证书(只有 CF 有)访问会直接 400 ,再配合 iptables 锁回源 IP ,就很好了
keengrass
3 天前
学习了
beyondsoft
3 天前
进入 cloudflare , SSL/TLS 选项 生成 源服务器证书, nginx 关闭 80 端口, 仅开启 ssl 配置专属证书, 拒绝掉证书验证失败的请求就行了
c15412
3 天前
快进到 cf 的 ip 被墙,因为使用 cloudflare 导致用户无法访问
cnurbansnail
2 天前
直接通过 ip 访问 nginx 默认站点的 nginx 直接拒绝握手,可以过滤掉很多爬虫和扫描器

除非域名 ip 同时泄露,客户端可以通过 ip:端口 + sni 绑定访问到你的站点
一般泄露的可能性比较小,再加上某个人要专门搞你。
0x5c0f
2 天前
简单一点的就是,cf 我记得是有自签名证书的, 给站点加一个 cf 的自签证书, 拒绝掉 http 的协议请求, 然后开启 http2 和 hsts ,基本就可以了
v2ov
2 天前
14 楼正解 Cloudflare Tunnel 即可解决
since2021
1 天前
kingstou
11 小时 19 分钟前
创建
/www/allow-cloudflare-only.conf
内容
# IPv4
allow 173.245.48.0/20;
allow 103.21.244.0/22;
allow 103.22.200.0/22;
allow 103.31.4.0/22;
allow 141.101.64.0/18;
allow 108.162.192.0/18;
allow 190.93.240.0/20;
allow 188.114.96.0/20;
allow 197.234.240.0/22;
allow 198.41.128.0/17;
allow 162.158.0.0/15;
allow 104.16.0.0/13;
allow 104.24.0.0/14;
allow 172.64.0.0/13;
allow 131.0.72.0/22;
# IPv6
allow 2400:cb00::/32;
allow 2606:4700::/32;
allow 2803:f800::/32;
allow 2405:b500::/32;
allow 2405:8100::/32;
allow 2a06:98c0::/29;
allow 2c0f:f248::/32;

deny all; # deny all remaining ips
在 nginx 引用
include /www/allow-cloudflare-only.conf
这样就不会报 403 了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1095751

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX