我希望用户只能通过 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

举报· 764 次点击
登录 注册 站外分享
6 条回复  
julyclyde 小成 2024-12-7 17:46:27
那你看看 nginx 的日志,这个请求是从哪儿来的
yaocf 初学 2024-12-7 17:46:57
```shell #!/bin/sh set -o pipefail export _ipv4Range=`curl --retry 10 --retry-delay 5 -s https://www.cloudflare-cn.com/ips-v4` if [[ $? -ne 0 ]]; then export _ipv4Range=`curl --retry 10 --retry-delay 5 -s https://www.cloudflare.com/ips-v4` if [[ $? -ne 0 ]]; then exit 1 fi fi export _ipv6Range=`curl --retry 10 --retry-delay 5 -s https://www.cloudflare-cn.com/ips-v6` if [[ $? -ne 0 ]]; then export _ipv6Range=`curl --retry 10 --retry-delay 5 -s https://www.cloudflare.com/ips-v6` if [[ $? -ne 0 ]]; then exit 1 fi fi #nginx real_ip _tmpConf="/tmp/._$(date '+%Y-%m-%d-%H-%M')-$(cat /proc/sys/kernel/random/uuid).txt" _target='/etc/nginx/conf.d/common/cloudflare/_real_ip_from-ip-set.conf' { echo "# Generated by ${0}" echo "# At $(date)" echo "# IPV4" for i in ${_ipv4Range} ;do echo "set_real_ip_from ${i};" ;done echo "" echo "# IPV6" for i in ${_ipv6Range} ;do echo "set_real_ip_from ${i};" ;done echo "" } |tee ${_tmpConf} if [[ $? -eq 0 ]]; then mv "${_tmpConf}" "${_target}" nginx -t if [[ $? -eq 0 ]]; then echo "Nginx 配置正常,重载配置!" nginx -s reload else /app/scripts/bin/gotify.sh --title "${_target} 文件更新成功,但 Nginx 配置有误" "请修复后手动重载 Nginx !\n""nginx -s reload" fi fi #nginx allow-ip-set #sleep 1 _tmpConf="/tmp/._$(date '+%Y-%m-%d-%H-%M')-$(cat /proc/sys/kernel/random/uuid).txt" _target='/etc/nginx/conf.d/common/cloudflare/_allow-ip-set.conf' { echo "# Generated by ${0}" echo "# At $(date)" echo "# IPV4" for i in ${_ipv4Range} ;do echo "allow ${i};" ;done echo "" echo "# IPV6" for i in ${_ipv6Range} ;do echo "allow ${i};" ;done echo "" } |tee ${_tmpConf} if [[ $? -eq 0 ]]; then mv "${_tmpConf}" "${_target}" nginx -t if [[ $? -eq 0 ]]; then echo "Nginx 配置正常,重载配置!" nginx -s reload else /app/scripts/bin/gotify.sh --title "${_target} 文件更新成功,但 Nginx 配置有误" "请修复后手动重载 Nginx !\n""nginx -s reload" fi fi ``` 我这边用来更新 allow ip 配置文件的脚本
herozzm 初学 2024-12-7 17:48:35
不能这样设置吧,从 cf 过来的是客户端的 ip 噢 我是设置了一个很长域名,仅给 cf 回源用,不泄露
xfelix 初学 2024-12-7 17:54:56
不理解为什么要这样设置 nginx 。直接设 防火墙 iptable 之类只允许 cf ip 段不就行了。
zuotun 初学 2024-12-7 18:01:09
不是非要返回 403 的话,防火墙开白名单,用 CF 的 Origin 证书开 Full Strict 模式,这样配完后是绝对不能够直接访问源站的。 我的理解是 Nginx 拿到的是客户端的真实 IP ,否则日志里岂不全是 CF 的了,这要怎么溯源?
xfelix 初学 2024-12-7 18:07:09
@zuotun https://nginx.org/en/docs/http/ngx_http_realip_module.html
返回顶部