平时买便宜的低配海外 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)” 的组合我已经实打实用了一年多了,一直极其稳定。下面把整套架构的原理、配置与避坑细节完整记录下来。
一、为什么需要“双域名”和“自定义主机名”?
很多人初看这个方案,最容易懵的地方是:为什么非得准备两个域名?
看一眼常规方案与本方案的对比:
- 常规小黄云方案: 客户端请求
b.com-> 本地 DNS 查询b.com-> Cloudflare 权威 DNS 随机返回一个国内访问很差的 CDN IP -> 客户端连上这个慢 IP。你不能在本地写 hosts 强行指向别的优选 IP,否则 Cloudflare 边缘节点会因为找不到该域名的路由而直接报Error 1003 / 1034 Direct IP Access Not Allowed。 - 双域名 + 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!
- 域名 B(源站宿主,如
整个流量流转链路如下图所示:
+-------------------------------------------------------------+
| 客户端 (本地网络) |
| 目标地址: 填自选优选 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 协议流量解密并对外直连 |
+-------------------------------------------------------------+原版网络流转图也可以参考:

二、前期准备工作
- Cloudflare 账号:推荐用常见的干净邮箱(如 Gmail)注册。
- 两个域名:
- 假定为
a.com和b.com(在 Namesilo、Spaceship、Porkbun 随便哪里买都行,两三美元一年的便宜后缀都可以)。 a.com:对外给客户端填写的域名,保留在第三方 DNS 解析(如 Spaceship 默认 DNS)。b.com:内部回退源域名,NS 改为 Cloudflare 托管。
- 假定为
- 一台低配置海外 VPS:
- 我个人在用的是 RackNerd 的便宜 VPS(经常有 10 多美元/年的活动),系统选用 Ubuntu 22.04 或 Debian 12。
- SSH 连接工具:
- Windows 推荐用 MobaXterm 或 Termius,Mac/Linux 直接用自带终端。
三、步骤一:配置源站域名与回退源(域名 B)
- 将
b.com接入 Cloudflare:- 在 Cloudflare 控制台点击“添加站点”,输入
b.com,选择 Free 计划; - 按照提示,去域名注册商(如 Spaceship)后台将域名的 Nameservers 修改为 Cloudflare 分配的两个 NS 地址;
- 等待几分钟,直到状态变为“有效”。
- 在 Cloudflare 控制台点击“添加站点”,输入
- 添加回退源 DNS 解析:
- 进入
b.com-> DNS -> 记录; - 添加一条 A 记录:
- 类型:
A - 名称:
aa(即二级域名aa.b.com,作为回退源) - 内容:填入你 VPS 的真实 IPv4 地址
- 代理状态:务必开启(显示橙色小云朵)
- 类型:
- 进入
- 设置 SSL/TLS 加密模式为“完全(严格)”:
- 进入 SSL/TLS -> 概述;
- 加密模式选择 完全(严格)/ Full (Strict)。
- 这一步要求 VPS 源站必须配置受信任的有效 SSL 证书,防止中间人篡改。
四、步骤二:VPS 安装与证书申请(acme.sh)
因为 aa.b.com 开启了 Cloudflare 小黄云代理,80 端口无法直接穿透回 VPS 源站,所以无法使用常规的 HTTP 文件验证方式。我们需要使用 acme.sh 的 DNS API 验证 来申请泛域名证书 *.b.com。
1. 安装基础依赖与工具
连接到 VPS 终端,执行:
sudo apt update && sudo apt install -y nginx curl socat jq2. 获取 Cloudflare API Token
- 打开 Cloudflare 控制台右上角个人头像 -> 我的个人资料 -> API 令牌 -> 创建令牌;
- 选择模版“编辑区域 DNS”;
- 区域资源选择:包含 -> 特定区域 ->
b.com; - 点击继续以显示令牌并复制,同时记下
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 生效的核心桥梁。
- 设置回退源:
- 在 Cloudflare 进入
b.com-> SSL/TLS -> 自定义主机名; - 在“回退源”输入框填入我们之前建好的二级域名:
aa.b.com; - 点击“添加回退源”,等待几秒刷新,确保状态显示为 “有效” (Active)。
- 在 Cloudflare 进入
- 添加自定义主机名:
- 点击右侧的“添加自定义主机名”;
- 自定义主机名:填入你用于客户端连接的域名,例如
a.a.com; - TLS 版本选默认,证书验证方法选 TXT 验证;
- 点击添加。
- 在域名 A(如 Spaceship)添加 DNS 验证记录:
- 添加完成后,Cloudflare 会给出两组 TXT 记录:
- 主机名所有权验证:名称
_cf-custom-hostname.a.a,内容类似一串字符哈希; - SSL 证书验证:名称
_acme-challenge.a.a,内容同样是一串字符哈希;
- 主机名所有权验证:名称
- 登录你的域名服务商(如 Spaceship 后台),进入
a.com的高级 DNS 设置,把这两条 TXT 记录加上; - 等待 2~10 分钟,回到 Cloudflare 刷新自定义主机名页面,当看到 证书状态 与 主机名状态 两个都变成绿色的 有效 (Active),就代表全套握手链路已经就绪。
- 添加完成后,Cloudflare 会给出两组 TXT 记录:
八、步骤六:获取与切换极速优选 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) | 443 | Cloudflare 边缘只接受标准 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,完成完美闭环。
十、一年来的日常体验与维护心得
- 源站 IP 极其安全:由于国内客户端从头到尾只知道
a.a.com和一堆 Cloudflare Anycast IP,真实 VPS 的 IP 从未暴露给任何公网探测,一整年下来稳如泰山。 - 晚高峰卡顿怎么办?
绝大多数情况下并不是 VPS 出故障,而是某个 IP 段的出口路由被运营商 QoS 调整了。此时不用登录服务器,直接在客户端把“地址”换成最新测出来的另一个优选 IP,几秒钟就能回到几十毫秒的丝滑状态。 - 证书自动续期注意事项:
b.com的证书由acme.sh自动续期并触发 Nginx 重载;a.a.com的边缘证书由 Cloudflare SaaS 自动轮换管理。两端都完全静默运行,无需人工干预。
