欢迎访问艾立兹站 Aliz- 专注建站教程与技术分享
您当前的位置:首页 > 建站教程 > 帝国 CMS 教程

帝国 CMS8.0 开启 CDN 后获取真实访客 IP 完整配置教程|解决后台 IP 白名单失效

时间:2026-08-23 16:47:53  来源:aliz.cn  作者:SKY  阅读:

前言


很多站长给网站接了 CDN 加速之后,发现一个问题:帝国 CMS 后台的 IP 白名单不好使了,登录日志里全部是 CDN 节点的 IP,自己设置的允许登录 IP 完全不生效,恶意 IP 也拦不住。
这不是帝国 CMS 的 bug,是 CDN 的工作机制决定的。用户访问网站,请求先到 CDN 节点,再由 CDN 节点回源到你的服务器,服务器看到的来源 IP 自然就是 CDN 节点的 IP,而不是真实访客的 IP。
帝国 CMS 自带的egetip()函数默认读取$_SERVER['REMOTE_ADDR'],拿到的就是 CDN 节点 IP。如果不做处理,IP 白名单、登录 IP 限制、防火墙 IP 拦截这一套安全防护全部形同虚设。
本文实测环境:帝国 CMS8.0 + 宝塔 Linux + Nginx,同时覆盖 Apache 和 Windows IIS 配置。

一、先搞清楚原理:CDN 怎么传真实 IP


CDN 节点回源的时候,会在 HTTP 请求头里带上真实访客 IP,常见的有两种:
  1. 国内 CDN(阿里云、腾讯云、百度云):用X-Forwarded-For请求头,格式是真实IP, 代理IP1, 代理IP2,第一个就是访客真实 IP。
  2. Cloudflare:用专用的CF-Connecting-IP请求头,直接就是访客真实 IP。

服务器需要做的事情:信任 CDN 节点发来的 IP,把请求头里的真实 IP 替换掉REMOTE_ADDR,这样 PHP 程序(包括帝国 CMS)拿到的就是真实访客 IP 了。
Nginx 里干这个活的模块叫ngx_http_realip_module,Apache 叫mod_remoteip

二、第一步:检查 Nginx 有没有 realip 模块


宝塔面板用户,SSH 登录服务器执行:
bash
/www/server/nginx/sbin/nginx -V 2>&1 | tr -- - '\n' | grep realip

输出里有http_realip_module就说明已经支持,直接往下配。没有输出的话,需要在宝塔软件商店里重新编译 Nginx,勾选realip模块再安装。
⚠️非常重要的安全提醒:网上很多教程直接写set_real_ip_from 0.0.0.0/0;,意思是信任全部来源 IP。这等于把大门敞开,攻击者可以随便伪造X-Forwarded-For请求头绕过 IP 限制。生产环境绝对不能这么写,必须只信任 CDN 官方公布的 IP 段。

三、Nginx 配置(宝塔面板,最常用)

方案 A:国内 CDN(阿里云 / 腾讯云 / 百度云)


打开宝塔 → 网站设置 → 配置文件,在server { }里面加入:
nginx
# 只信任CDN节点IP段(示例为腾讯云CDN,实际请替换为你所用CDN官方最新IP段)
set_real_ip_from  119.147.0.0/16;
set_real_ip_from  182.254.0.0/16;
set_real_ip_from  101.226.0.0/16;

# 从X-Forwarded-For请求头取真实IP
real_ip_header X-Forwarded-For;
# 递归解析,取最左边第一个非信任IP
real_ip_recursive on;
每个 CDN 服务商的 IP 段会定期更新,一定要去对应 CDN 官方文档复制最新的 IP 列表,不要用网上抄来的旧 IP 段,否则配置不生效。

方案 B:Cloudflare


Cloudflare 用专用请求头,配置如下:
nginx
# Cloudflare官方IPv4段(节选,完整列表去CF官网复制)
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/12;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;

# Cloudflare专用请求头
real_ip_header CF-Connecting-IP;
real_ip_recursive on;

保存配置,先校验再重载:
bash
nginx -t && nginx -s reload

四、Apache 环境配置


Apache 需要先开启mod_remoteip模块。编辑http.conf,找到这一行去掉前面的#
apache
LoadModule remoteip_module modules/mod_remoteip.so

然后在站点虚拟主机配置里加:
apache
# 从X-Forwarded-For取真实IP
RemoteIPHeader X-Forwarded-For
# 信任CDN节点IP段
RemoteIPInternalProxy 119.147.0.0/16
RemoteIPInternalProxy 182.254.0.0/16

保存后重启 Apache 生效。

五、Windows IIS 环境配置

  1. IIS 管理器安装X-Forwarded-For模块(部分 IIS 版本需要单独下载安装);
  2. 启用模块,在配置里填入 CDN 可信 IP 网段;
  3. IIS 会自动把真实访客 IP 写入REMOTE_ADDR,PHP 直接读取即可,不需要改帝国 CMS 代码。

六、帝国 CMS 代码适配(大部分情况不需要改)


Nginx 配置正确的情况下,$_SERVER['REMOTE_ADDR']已经被 realip 模块替换成真实访客 IP,帝国 CMS 的egetip()函数直接就能拿到真实 IP,不需要改 PHP 代码
只有一种特殊情况需要改:服务器环境不允许修改 Nginx 配置(比如虚拟主机),只能靠 PHP 读取 HTTP 头。这时候修改/e/class/connect.php里的egetip()函数:
php
运行
function egetip(){
    // Cloudflare专用头优先
    if(isset($_SERVER["HTTP_CF_CONNECTING_IP"])){
        $ip = $_SERVER["HTTP_CF_CONNECTING_IP"];
    }
    // 国内CDN的X-Forwarded-For
    elseif(isset($_SERVER['HTTP_X_FORWARDED_FOR'])){
        $iparr = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
        $ip = trim($iparr[0]);
    }
    // 兜底
    else{
        $ip = @$_SERVER['REMOTE_ADDR'];
    }
    return $ip;
}
⚠️只改 PHP 代码、不配 Nginx realip 模块有安全风险:攻击者可以伪造X-Forwarded-For请求头随意修改 IP,绕过 IP 白名单。能配服务器层就优先配服务器层,不要只靠 PHP 代码

修改完保存,后台执行【数据更新中心】→【清空全部缓存】。

七、验证配置是否生效

方法一:写个测试文件


新建iptest.php上传到网站根目录:
php
运行
<?php
require('./e/class/connect.php');
echo "egetip获取IP:" . egetip();
echo "<br/>REMOTE_ADDR:" . $_SERVER['REMOTE_ADDR'];
echo "<br/>X-Forwarded-For:" . @$_SERVER['HTTP_X_FORWARDED_FOR'];
?>

浏览器访问https://你的域名/iptest.php,输出的 IP 是你自己的公网 IP 就说明配置成功;如果输出的是 CDN 节点 IP,说明配置没生效。
测试完记得删掉这个文件,不要留在服务器上。

方法二:看后台登录日志


登录帝国 CMS 后台 →【用户】→【登录日志】,最新一条登录记录显示的是你自己的公网 IP,不是 CDN 节点 IP,就说明完全生效了。

八、常见问题排查

1、Nginx 配置保存重载了,PHP 还是拿到 CDN 节点 IP

  • 检查set_real_ip_from是不是写在了location里面,必须写在server {}层级,写在 location 里不生效;
  • 确认 Nginx 编译包含 realip 模块;
  • 去 CDN 控制台确认已经开启 "转发真实 IP" 或 "开启 X-Forwarded-For",部分 CDN 实例默认是关闭的。

2、配置完后台 IP 白名单还是拦截自己


CDN 的 IP 段没有填完整,Nginx 没有识别到 CDN 代理,自然没有解析真实 IP。去 CDN 官网复制完整最新 IP 段。

3、宝塔防火墙还是显示 CDN 节点 IP


宝塔防火墙 → 设置 → 开启【CDN 来源 IP 解析】,选择你用的 CDN 服务商。宝塔防火墙自己也需要单独配置,和 Nginx realip 是两套独立的。

4、IP 被伪造的风险说明


再次强调:只改 PHP 读取 HTTP 头、不配 Nginx realip 模块,攻击者可以伪造X-Forwarded-For请求头随意改 IP,IP 白名单等于摆设。生产环境一定优先服务器层处理。

九、配套安全建议

  1. CDN 服务商 IP 段会更新,定期(建议每季度)更新 Nginx 的set_real_ip_fromIP 列表;
  2. IP 获取正常之后,再开启帝国 CMS 后台 IP 白名单,避免配置没生效把自己锁在外面;
  3. IP 白名单配合后台访问密码、管理员强密码、修改后台目录,多层防护才安全;
  4. 家用宽带公网 IP 会变,动态 IP 用户不建议开启强制 IP 白名单,容易把自己锁死。

十、写在最后


CDN 加速和后台安全防护不冲突,关键是把真实 IP 解析这一步做对。很多站长接了 CDN 就不管了,以为 IP 白名单还在工作,实际上早就失效了,等于后台裸奔。花十分钟把 realip 模块配好,IP 白名单、登录限制、防火墙这一套防护才能真正发挥作用。
本文为aliz.cn原创教程,转载请保留来源链接。

本文配套模板、静态源码可前往艾立兹素材库alisucai.com下载

发表评论 共有0条评论
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
公众号二维码

扫码关注公众号
获取全套技术教程