在现代 Web 架构中,为了兼顾国内访问速度和海外访问的稳定性(以及抗 DDoS 能力),“多 CDN 分流” 是一种非常流行的策略。例如:国内流量走腾讯云/阿里云,海外流量走 Cloudflare 或 AWS CloudFront。

然而,这种架构带来了一个严重的安全隐患:源站 IP 暴露。一旦黑客绕过 CDN 直接攻击源站 IP,或者通过 Host 碰撞进行扫描,CDN 的防护就形同虚设。

本文将分享一套基于 HTTP Header 鉴权的源站隐身方案,并解决了 AWS CloudFront 回源 502、HTTPS 死循环等经典“坑”点。

🚀 方案核心逻辑

我们不依赖防火墙 IP 白名单(因为 AWS 和部分国内 CDN 的 IP 段变化频繁),而是采用 “应用层暗号鉴权”

  1. CDN 侧:配置回源策略,在请求源站时强制添加一个自定义 Header(例如 X-Origin-Auth: MySecretPass)。
  2. 源站 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 是最特殊的,需要额外注意回源协议。

  1. 进入设置:Distributions -> 选你的 ID -> Origins 标签页 -> 编辑源站。

  2. 添加 Header:找到 Custom headers -> Add header -> 填入 Name 和 Value。

  3. 关键设置 (避坑)

    • Protocol (协议):必须选择 HTTP only (端口 80)。

      • 原因:如果选 HTTPS,AWS 会验证源站 IP 的证书,极易导致 502 Bad Gateway。

  4. 防拦截设置

    • Behaviors -> Origin request policy 中,选择 None

    • 原因:防止将 CloudFront 的 Host 头传给源站,导致腾讯云/阿里云防火墙拦截未备案域名。

2. 腾讯云 CDN / 内容分发网络

  1. 进入设置:域名管理 -> 点击域名 -> 回源配置

  2. 添加 Header:找到 “HTTP请求头配置” (部分界面叫回源 HTTP 请求头)。

  3. 操作

    • 参数名称:X-Origin-Auth

    • 参数值:你的密码

    • 动作:设置添加

3. 腾讯云 EdgeOne (TEO / 边缘安全加速)

EdgeOne 的配置在规则引擎里,功能更强大。

  1. 进入设置:站点 -> 规则引擎 -> 新建规则。

  2. 匹配条件 (IF):选择 “全部(站点任意请求)”

  3. 执行操作 (THEN)

    • 选择 “修改 HTTP 回源请求头” (注意是回源,不是响应头!)。

    • 头部名称:X-Origin-Auth

    • 头部值:你的密码。

  4. 保存并发布。

4. Cloudflare

  1. 进入设置:Rules -> Origin Rules

  2. 创建规则

    • Field: Hostname equals yourdomain.com (或 Apply to all)。

    • Header: Set request header

    • Header name: X-Origin-Auth

    • Header value: 你的密码。

5. UCloud CDN

  1. 进入设置:域名管理 -> 配置 -> 高级设置 (或回源配置)。

  2. 添加 Header:找到 “自定义回源 Header”

  3. 操作:选择“自定义”,填入 Name 和 Value。


🔍 第三步:验证与排查

配置完成后,请按照以下顺序进行验证:

  1. 直接访问源站 IP

    • 命令:curl -I http://1.2.3.4

    • 预期结果:403 Forbidden (说明鉴权生效,成功阻断扫描)。

  2. 访问 CDN 域名

    • 浏览器打开 https://www.yourdomain.com

    • 预期结果:200 OK (网页正常显示)。

  3. 常见故障排查

    • 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,还完美解决了跨国加速中的各种协议兼容性问题。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。