Cloudflare 自定义主机名 + 优选 IP + sing-box 实战:搭建低延迟、隐藏源站的科学节点

Cloudflare 自定义主机名 + 优选 IP + sing-box 实战:搭建低延迟、隐藏源站的科学节点

  1. 大全前端 🛫
  2. 2026-08-08 12:35
  3. 18 min read

平时买便宜的低配海外 VPS(比如 RackNerd 一年十来刀的机器),最大的痛点往往不是性能不够,而是直连线路太差:白天跑不满,晚高峰丢包率飙升到 30% 以上,延迟动不动就 300ms 开外,甚至源站 IP 哪天就被精准屏蔽。

很多人尝试给 VPS 套 Cloudflare CDN(点亮小黄云),但普通小黄云分配给免费用户的 Anycast 节点在国内往往也是“众生平等”地被挤爆,速度甚至比直连还慢,俗称“减速云”。

其实,借助 Cloudflare 的 SSL for SaaS(自定义主机名)+ 回退源(Fallback Origin),配合自选优选 IP(Cloudflare Anycast IP),可以彻底盘活廉价 VPS:

  • 隐藏真实源站:客户端完全不和你的 VPS 直连,流量只打到 Cloudflare 边缘节点;
  • 全链路免费合规证书:Cloudflare 自动为自定义主机名签发并管理边缘证书,源站配合 acme.sh 开启严格(Strict)加密;
  • 速度自由控制:客户端直接连接对本地运营商延迟最低、丢包最少的优选 Anycast IP,晚高峰一旦遇到网络波动,只要换个优选 IP 就能满血复活,根本不用动服务器。

这套 “Cloudflare 优选 IP + 便宜 VPS + Nginx 调优 + sing-box (VLESS + WS + TLS)” 的组合我已经实打实用了一年多了,一直极其稳定。下面把整套架构的原理、配置与避坑细节完整记录下来。


一、为什么需要“双域名”和“自定义主机名”?

很多人初看这个方案,最容易懵的地方是:为什么非得准备两个域名?

看一眼常规方案与本方案的对比:

  1. 常规小黄云方案: 客户端请求 b.com -> 本地 DNS 查询 b.com -> Cloudflare 权威 DNS 随机返回一个国内访问很差的 CDN IP -> 客户端连上这个慢 IP。你不能在本地写 hosts 强行指向别的优选 IP,否则 Cloudflare 边缘节点会因为找不到该域名的路由而直接报 Error 1003 / 1034 Direct IP Access Not Allowed
  2. 双域名 + SaaS 自定义主机名方案
    • 域名 B(源站宿主,如 b.com:NS 托管在 Cloudflare,开小黄云指向真实 VPS IP,充当 SaaS 的**“回退源(Fallback Origin)”**;
    • 域名 A(客户端访问,如 a.com:放在常规注册商或第三方 DNS(比如 Spaceship / 阿里),在 Cloudflare 处作为**“自定义主机名(Custom Hostname)”**挂载到回退源上;
    • 客户端自由优选:你在本地把 a.a.com 解析到任何你测出来的 Cloudflare 极速 Anycast IP(或者客户端直接将地址设为该 IP,伪装 SNI / Host 填 a.a.com)。Cloudflare 边缘节点收到带有 a.a.com 的 TLS 握手时,因为在自定义主机名里注册过,会正常接客并走 Cloudflare 全球骨干内网无损转给回退源,最终送到你的 VPS!

整个流量流转链路如下图所示:

+-------------------------------------------------------------+
|                     客户端 (本地网络)                         |
|   目标地址: 填自选优选 IP (例如 104.16.x.x / 日本成田等最优节点)     |
|   伪装域名 (SNI / Host): a.a.com (域名 A)                    |
+------------------------------+------------------------------+
                               |
                               |  直接直连测速最快的 Anycast IP
                               v
+-------------------------------------------------------------+
|                  Cloudflare 优选 CDN 边缘节点                |
|  1. 识别 SNI: a.a.com (匹配自定义主机名 Custom Hostname)      |
|  2. 边缘提供合规证书完成 TLS 握手                              |
|  3. 按照规则命中回退源 (Fallback Origin): aa.b.com           |
+------------------------------+------------------------------+
                               |
                               |  走 Cloudflare 内部骨干优化网络
                               v
+-------------------------------------------------------------+
|             Cloudflare 边缘 -> 源站 (Full Strict 加密)       |
+------------------------------+------------------------------+
                               |
                               |  443 端口加密回源
                               v
+-------------------------------------------------------------+
|                       VPS 源站服务器                         |
|  1. Nginx: 监听 443,加载 *.b.com 证书 (0-RTT / 低 TTFB 调优) |
|  2. 反向代理: 将 /v1 WebSocket 流量转发给本地 127.0.0.1:38123   |
|  3. sing-box: 接收 VLESS 协议流量解密并对外直连                |
+-------------------------------------------------------------+

原版网络流转图也可以参考:

优选IP流转图


二、前期准备工作

  1. Cloudflare 账号:推荐用常见的干净邮箱(如 Gmail)注册。
  2. 两个域名
    • 假定为 a.comb.com(在 Namesilo、Spaceship、Porkbun 随便哪里买都行,两三美元一年的便宜后缀都可以)。
    • a.com:对外给客户端填写的域名,保留在第三方 DNS 解析(如 Spaceship 默认 DNS)。
    • b.com:内部回退源域名,NS 改为 Cloudflare 托管。
  3. 一台低配置海外 VPS
    • 我个人在用的是 RackNerd 的便宜 VPS(经常有 10 多美元/年的活动),系统选用 Ubuntu 22.04 或 Debian 12。
  4. SSH 连接工具
    • Windows 推荐用 MobaXterm 或 Termius,Mac/Linux 直接用自带终端。

三、步骤一:配置源站域名与回退源(域名 B)

  1. b.com 接入 Cloudflare
    • 在 Cloudflare 控制台点击“添加站点”,输入 b.com,选择 Free 计划;
    • 按照提示,去域名注册商(如 Spaceship)后台将域名的 Nameservers 修改为 Cloudflare 分配的两个 NS 地址;
    • 等待几分钟,直到状态变为“有效”。
  2. 添加回退源 DNS 解析
    • 进入 b.com -> DNS -> 记录
    • 添加一条 A 记录:
      • 类型:A
      • 名称:aa(即二级域名 aa.b.com,作为回退源)
      • 内容:填入你 VPS 的真实 IPv4 地址
      • 代理状态:务必开启(显示橙色小云朵)
  3. 设置 SSL/TLS 加密模式为“完全(严格)”
    • 进入 SSL/TLS -> 概述
    • 加密模式选择 完全(严格)/ Full (Strict)
    • 这一步要求 VPS 源站必须配置受信任的有效 SSL 证书,防止中间人篡改。

四、步骤二:VPS 安装与证书申请(acme.sh)

因为 aa.b.com 开启了 Cloudflare 小黄云代理,80 端口无法直接穿透回 VPS 源站,所以无法使用常规的 HTTP 文件验证方式。我们需要使用 acme.shDNS API 验证 来申请泛域名证书 *.b.com

1. 安装基础依赖与工具

连接到 VPS 终端,执行:

sudo apt update && sudo apt install -y nginx curl socat jq

2. 获取 Cloudflare API Token

  1. 打开 Cloudflare 控制台右上角个人头像 -> 我的个人资料 -> API 令牌 -> 创建令牌
  2. 选择模版“编辑区域 DNS”;
  3. 区域资源选择:包含 -> 特定区域 -> b.com
  4. 点击继续以显示令牌并复制,同时记下 b.com 概述页面右下角的 区域 ID (Zone ID)

3. 使用 acme.sh 申请证书

# 1. 安装 acme.sh
curl https://get.acme.sh | sh
source ~/.bashrc

# 2. 配置环境变量
export CF_Token="你的_Cloudflare_API_Token"
export CF_Zone_ID="你的_b.com_Zone_ID"

# 3. 将默认 CA 改为 Let's Encrypt(兼容性最好)
~/.acme.sh/acme.sh --set-default-ca --server letsencrypt

# 4. 申请 b.com 和 *.b.com 泛域名证书
~/.acme.sh/acme.sh --issue --dns dns_cf -d b.com -d '*.b.com'

4. 安装证书并配置 Nginx 自动热重载

创建放证书的目录和自动重载脚本:

mkdir -p /etc/nginx/ssl /etc/acme

新建 /etc/acme/reload-nginx.sh

cat << 'EOF' > /etc/acme/reload-nginx.sh
#!/bin/bash
LOG_FILE="/var/log/nginx-reload.log"
if /usr/sbin/nginx -t; then
    /usr/sbin/nginx -s reload
    echo "[$(date)] Nginx reloaded successfully for acme.sh" >> "$LOG_FILE"
    exit 0
else
    echo "[$(date)] Nginx config test failed for acme.sh" >> "$LOG_FILE"
    exit 1
fi
EOF
chmod +x /etc/acme/reload-nginx.sh

将证书安装到 Nginx 目录:

~/.acme.sh/acme.sh --install-cert -d b.com \
  --key-file /etc/nginx/ssl/b.com.key \
  --fullchain-file /etc/nginx/ssl/b.com.pem \
  --reloadcmd "/etc/acme/reload-nginx.sh"

五、步骤三:安装与配置 sing-box

安装 sing-box 官方或一键核心:

bash <(curl -fsSL https://sing-box.app/deb-install.sh)
# 也可以使用社区成熟的安装脚本

生成一个 UUID:

sing-box generate uuid

创建 sing-box 配置文件 /etc/sing-box/config.json(或根据你所用脚本的路径):

{
  "log": {
    "level": "warn",
    "timestamp": true
  },
  "inbounds": [
    {
      "type": "vless",
      "tag": "VLESS-WS-IN",
      "listen": "127.0.0.1",
      "listen_port": 38123,
      "users": [
        {
          "uuid": "这里替换成你刚刚生成的UUID"
        }
      ],
      "transport": {
        "type": "ws",
        "path": "/v1",
        "max_early_data": 2048,
        "early_data_header_name": "Early-Data"
      },
      "tcp_fast_open": true,
      "multiplex": {
        "enabled": true
      }
    }
  ],
  "outbounds": [
    {
      "type": "direct",
      "tag": "direct"
    }
  ]
}

启动并设置开机自启:

systemctl enable --now sing-box
systemctl restart sing-box

六、步骤四:Nginx 深度调优配置

这一步是整个方案低延迟、不卡顿的关键。很多人直接拿默认的 Nginx 反代配置,经常遇到 WebSocket 断连、看长视频中断、或者首字节响应很慢的问题。

修改 /etc/nginx/nginx.conf

user www-data;
worker_processes auto;
worker_rlimit_nofile 65535;
pid /run/nginx.pid;
error_log /var/log/nginx/error.log;
include /etc/nginx/modules-enabled/*.conf;

events {
    worker_connections 2048;
    use epoll;
    multi_accept on;
}

http {
    limit_conn_zone $binary_remote_addr zone=wsconn:10m;

    sendfile off; # 反向代理必须关
    tcp_nopush off;
    tcp_nodelay on;

    keepalive_timeout 65s 180s;
    keepalive_requests 100000;
    proxy_http_version 1.1;
    proxy_set_header Connection "";

    proxy_buffering off; # 全局关闭响应缓冲,避免打字机/代理排队
    proxy_request_buffering off; # 全局关闭请求缓冲
    proxy_set_header Early-Data $http_early_data;

    types_hash_max_size 2048;

    include /etc/nginx/mime.types;
    default_type application/octet-stream;

    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    access_log /var/log/nginx/access.log;
    gzip off; # 节点通信务必关掉压缩,节省 CPU 且降低延迟

    include /etc/nginx/conf.d/*.conf;
}

修改 /etc/nginx/conf.d/default.conf

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    http2 on;

    # 0-RTT 支持(再次建连实现近 0ms 握手)
    ssl_early_data on;

    # 开启 OCSP Stapling (用 Google DNS 解析加速)
    ssl_stapling on;
    ssl_stapling_verify on;
    resolver 8.8.8.8 8.8.4.4 valid=300s;
    resolver_timeout 5s;

    server_name *.b.com *.a.com;

    # 计算量较小的现代加密套件
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 1d;
    
    # 核心调优:将 Buffer 缩小为 4k。虽然微幅牺牲极限吞吐,但能显著降低 TTFB 首字节延迟,网页和视频秒开
    ssl_buffer_size 4k;

    # 证书路径
    ssl_certificate /etc/nginx/ssl/b.com.pem;
    ssl_certificate_key /etc/nginx/ssl/b.com.key;

    http2_max_concurrent_streams 512;
    large_client_header_buffers 4 64k;
    client_header_timeout 30s;
    keepalive_timeout 180s;
    keepalive_requests 100000;
    gzip off;

    location /v1 {
        limit_conn wsconn 6;
        proxy_redirect off;
        proxy_pass http://127.0.0.1:38123;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $host;
        proxy_set_header Sec-WebSocket-Protocol "";

        # 彻底关闭缓冲,数据实时吞吐
        proxy_buffering off;
        proxy_request_buffering off;
        proxy_cache off;

        proxy_connect_timeout 15s;
        # 延长超时到 1 小时,防止看 YouTube 长视频或挂机时频繁断流
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;

        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;

        # 0-RTT 透传
        proxy_set_header Early-Data $http_early_data;

        proxy_socket_keepalive on;
        proxy_max_temp_file_size 0;
        proxy_buffers 4 8k;
    }

    # 默认伪装主页(可选指向简单静态页)
    location / {
        index index.html index.htm;
        root /var/www/html;
    }
}

测试并重启 Nginx:

nginx -t && systemctl restart nginx

七、步骤五:Cloudflare 配置自定义主机名(接入域名 A)

这是让优选 IP 生效的核心桥梁。

  1. 设置回退源
    • 在 Cloudflare 进入 b.com -> SSL/TLS -> 自定义主机名
    • 在“回退源”输入框填入我们之前建好的二级域名:aa.b.com
    • 点击“添加回退源”,等待几秒刷新,确保状态显示为 “有效” (Active)
  2. 添加自定义主机名
    • 点击右侧的“添加自定义主机名”;
    • 自定义主机名:填入你用于客户端连接的域名,例如 a.a.com
    • TLS 版本选默认,证书验证方法选 TXT 验证
    • 点击添加。
  3. 在域名 A(如 Spaceship)添加 DNS 验证记录
    • 添加完成后,Cloudflare 会给出两组 TXT 记录:
      • 主机名所有权验证:名称 _cf-custom-hostname.a.a,内容类似一串字符哈希;
      • SSL 证书验证:名称 _acme-challenge.a.a,内容同样是一串字符哈希;
    • 登录你的域名服务商(如 Spaceship 后台),进入 a.com 的高级 DNS 设置,把这两条 TXT 记录加上;
    • 等待 2~10 分钟,回到 Cloudflare 刷新自定义主机名页面,当看到 证书状态主机名状态 两个都变成绿色的 有效 (Active),就代表全套握手链路已经就绪。

八、步骤六:获取与切换极速优选 IP

到了这一步,我们不需要把 a.a.com 解析到任何固定服务器上。相反,我们要去获取国内访问体验最好的 Cloudflare Anycast CDN 节点 IP。

方式 A:使用 CloudflareSpeedTest 本地实测(推荐)

使用开源工具 XIU2/CloudflareSpeedTest

下载解压后,在终端或命令行运行:

# 测速测延迟,只测前几个最优节点
./CloudflareST -url https://speed.cloudflare.com/__down?bytes=50000000 -p 10 -f ip.txt

它会按照你的真实网络(电信/联通/移动)实测出几十个当前延迟在 120ms~160ms、丢包率 0%、下行速度能拉满的 IP。

方式 B:使用社区维护的实时优选源

如果懒得每次开软件测,也可以参考社区每日测速维护的公共优选池(例如 https://cf.vvhan.com/ 等)。

这里分享一个我平时自己跑的 Python 简易过滤脚本。如果你从测速源拿到了数据(或本地存了测速结果 SQLite 数据库),可以快速提取出对应运营商的 Top IP:

import sqlite3

def get_best_ips(db_path="cf_ips.db", line="telecom", limit=5):
    """
    根据线路 (telecom / mobile / unicom) 筛选延迟最低、丢包为 0 的优选 IP
    """
    conn = sqlite3.connect(db_path)
    cursor = conn.cursor()
    
    # 假设表名为 cf_ip (电信) 或 cf_yidong_ip (移动)
    table = "cf_yidong_ip" if line == "mobile" else "cf_ip"
    
    query = f"""
        SELECT ip, latency, download_speed 
        FROM {table} 
        WHERE loss_rate = 0 
        ORDER BY latency ASC, download_speed DESC 
        LIMIT ?
    """
    cursor.execute(query, (limit,))
    rows = cursor.fetchall()
    conn.close()
    
    print(f"=== 当前 {line} 线路优选 IP 列表 ===")
    for ip, latency, speed in rows:
        print(f"IP: {ip:<16} 延迟: {latency}ms   下载测速: {speed}MB/s")

if __name__ == "__main__":
    # 示例调用
    # get_best_ips("cf_ips.db", line="telecom")
    pass

九、客户端节点配置(以 v2rayN / Shadowrocket 为例)

客户端配置时,最关键的就是不要把“节点地址”和“伪装域名”填反

客户端配置项正确填写内容说明
协议类型VLESS对应 sing-box 的 inbound 协议
地址 (Address / IP)填你优选出来的 IP例如 104.16.x.x 或日本成田/香港机房优选 IP
端口 (Port)443Cloudflare 边缘只接受标准 HTTPS 端口
UUID你的 sing-box UUID鉴权标识
传输协议 (Network)ws (WebSocket)对应底层传输
路径 (Path)/v1对应 Nginx location /v1
TLS / 安全开启 (TLS)必须开启
SNI / 伪装域名 (Host)a.a.com核心!必须填你添加的自定义主机名

这样,无论客户端在底层向哪个优选 IP 发包,握手时携带的 SNI 和 Host 头始终是 a.a.com。Cloudflare 边缘节点解开握手后,自动通过内部回退源路由转给你的 VPS,完成完美闭环。


十、一年来的日常体验与维护心得

  1. 源站 IP 极其安全:由于国内客户端从头到尾只知道 a.a.com 和一堆 Cloudflare Anycast IP,真实 VPS 的 IP 从未暴露给任何公网探测,一整年下来稳如泰山。
  2. 晚高峰卡顿怎么办?
    绝大多数情况下并不是 VPS 出故障,而是某个 IP 段的出口路由被运营商 QoS 调整了。此时不用登录服务器,直接在客户端把“地址”换成最新测出来的另一个优选 IP,几秒钟就能回到几十毫秒的丝滑状态。
  3. 证书自动续期注意事项
    b.com 的证书由 acme.sh 自动续期并触发 Nginx 重载;a.a.com 的边缘证书由 Cloudflare SaaS 自动轮换管理。两端都完全静默运行,无需人工干预。
Cloudflaresing-boxVPS优选IPCloudflareSpeedTestNginx网络折腾