
在现代 Web 架构中,为了兼顾国内访问速度和海外访问的稳定性(以及抗 DDoS 能力),“多 CDN 分流” 是一种非常流行的策略。例如:国内流量走腾讯云/阿里云,海外流量走 Cloudflare 或 AWS CloudFront。
然而,这种架构带来了一个严重的安全隐患:源站 IP 暴露。一旦黑客绕过 CDN 直接攻击源站 IP,或者通过 Host 碰撞进行扫描,CDN 的防护就形同虚设。
本文将分享一套基于 HTTP Header 鉴权的源站隐身方案,并解决了 AWS CloudFront 回源 502、HTTPS 死循环等经典“坑”点。
🚀 方案核心逻辑
我们不依赖防火墙 IP 白名单(因为 AWS 和部分国内 CDN 的 IP 段变化频繁),而是采用 “应用层暗号鉴权”。
- CDN 侧:配置回源策略,在请求源站时强制添加一个自定义 Header(例如
X-Origin-Auth: MySecretPass)。 - 源站 Nginx 侧:检查请求头。
- 有暗号 -> 放行,并根据情况智能处理 HTTPS 跳转。
- 无暗号(直接 IP 访问/扫描) -> 直接返回
403 Forbidden。
🛠️ 第一步:源站 Nginx 配置 (核心)
这是整个方案的灵魂。我们需要修改 Nginx 配置文件,植入鉴权逻辑和智能跳转逻辑。
解决的痛点:
- 防止直接 IP 扫描。
- 解决 AWS CloudFront 只能使用 HTTP 回源导致的“强制 HTTPS 跳转死循环”问题。
- 兼容 Let’s Encrypt (SSL) 证书自动续期。
Nginx 配置文件模板
适用于 宝塔面板、1Panel 或原生 Nginx。
server {
listen 80;
listen 443 ssl;
# 其他 HTTP2/QUIC 配置...
server_name [www.yourdomain.com](https://www.yourdomain.com) cdn.yourdomain.com;
root /www/wwwroot/your_site;
# SSL 证书配置 (略)...
# =========================================================
# [第一关] CDN 源站保护 / Header 鉴权配置
# =========================================================
# 1. 默认拒绝所有请求
set $deny_access 1;
# 2. 检查暗号:请将下面的密码换成你自己生成的复杂字符串
# 注意:Nginx 中 Header 变量会自动转为小写,中划线变下划线
if ($http_x_origin_auth = "Your_Complex_Password_2024") {
set $deny_access 0;
}
# 3. 特殊放行:SSL 证书验证请求 (.well-known) 必须放行,否则无法续期证书
if ($uri ~* "^/\.well-known/") {
set $deny_access 0;
}
# 4. 执行拦截:如果上面两条都没通过,直接返回 403 Forbidden
if ($deny_access = 1) {
return 403;
}
# =========================================================
# =========================================================
# [第二关] 智能 HTTPS 跳转 (防止 AWS/CloudFront 502 死循环)
# =========================================================
set $is_http 0;
# 1. 检测是否为 HTTP 端口 (非 443)
if ($server_port !~ 443) {
set $is_http 1;
}
# 2. 特赦 CDN:如果带着密码(说明是 CDN 回源),允许使用 HTTP
# 解释:AWS CloudFront 配置 HTTP 回源可以避免 502 错误,
# 这里必须允许 HTTP 不跳转,否则会产生重定向循环。
if ($http_x_origin_auth = "Your_Complex_Password_2024") {
set $is_http 0;
}
# 3. 特赦证书验证
if ($uri ~* "^/\.well-known/") {
set $is_http 0;
}
# 4. 对普通用户(不带密码)的 HTTP 请求执行强制跳转
if ($is_http = 1) {
rewrite ^(/.*)$ https://$host$1 permanent;
}
# =========================================================
# ... 其他业务配置 (location / 等) ...
}
⚙️ 第二步:各大 CDN 厂商配置指南
所有厂商配置的核心目标一致:添加回源请求头 (Origin Request Header)。
-
Header Name:
X-Origin-Auth -
Header Value:
Your_Complex_Password_2024(需与 Nginx 一致)
1. AWS CloudFront (亚马逊云)
AWS 是最特殊的,需要额外注意回源协议。
-
进入设置:Distributions -> 选你的 ID -> Origins 标签页 -> 编辑源站。
-
添加 Header:找到 Custom headers -> Add header -> 填入 Name 和 Value。
-
关键设置 (避坑):
-
Protocol (协议):必须选择 HTTP only (端口 80)。
-
原因:如果选 HTTPS,AWS 会验证源站 IP 的证书,极易导致 502 Bad Gateway。
-
-
-
防拦截设置:
-
在 Behaviors -> Origin request policy 中,选择 None。
-
原因:防止将 CloudFront 的 Host 头传给源站,导致腾讯云/阿里云防火墙拦截未备案域名。
-
2. 腾讯云 CDN / 内容分发网络
-
进入设置:域名管理 -> 点击域名 -> 回源配置。
-
添加 Header:找到 “HTTP请求头配置” (部分界面叫回源 HTTP 请求头)。
-
操作:
-
参数名称:
X-Origin-Auth -
参数值:你的密码
-
动作:设置 或 添加。
-
3. 腾讯云 EdgeOne (TEO / 边缘安全加速)
EdgeOne 的配置在规则引擎里,功能更强大。
-
进入设置:站点 -> 规则引擎 -> 新建规则。
-
匹配条件 (IF):选择 “全部(站点任意请求)”。
-
执行操作 (THEN):
-
选择 “修改 HTTP 回源请求头” (注意是回源,不是响应头!)。
-
头部名称:
X-Origin-Auth -
头部值:你的密码。
-
-
保存并发布。
4. Cloudflare
-
进入设置:Rules -> Origin Rules。
-
创建规则:
-
Field:
Hostnameequalsyourdomain.com(或 Apply to all)。 -
Header: Set request header。
-
Header name:
X-Origin-Auth -
Header value: 你的密码。
-
5. UCloud CDN
-
进入设置:域名管理 -> 配置 -> 高级设置 (或回源配置)。
-
添加 Header:找到 “自定义回源 Header”。
-
操作:选择“自定义”,填入 Name 和 Value。
🔍 第三步:验证与排查
配置完成后,请按照以下顺序进行验证:
-
直接访问源站 IP:
-
命令:
curl -I http://1.2.3.4 -
预期结果:403 Forbidden (说明鉴权生效,成功阻断扫描)。
-
-
访问 CDN 域名:
-
浏览器打开
https://www.yourdomain.com -
预期结果:200 OK (网页正常显示)。
-
-
常见故障排查:
-
502 Bad Gateway (AWS):检查 AWS 源站协议是否选了 HTTPS,请改为 HTTP Only。
-
403 Forbidden (CDN 访问):检查 CDN 填写的密码是否与 Nginx 配置的 完全一致(注意空格)。
-
腾讯云拦截页面 (蓝白页):检查 CloudFront 的 Origin request policy 是否选了
None,不要透传 Host 头。
-
📝 总结
通过这套方案,我们实现了一个高可用的“三明治”架构:
-
外层:多 CDN 智能调度,国内直连高速,海外 CF/AWS 抗攻击。
-
传输层:基于 Header 的私有鉴权通道。
-
核心层:Nginx 严防死守,只认暗号不认人。
这不仅保护了源站 IP,还完美解决了跨国加速中的各种协议兼容性问题。


评论(0)