Cloudflare 反代非标准端口绕过国内备案(腾讯云 + Nginx 自签名证书)

国内云服务器只对 80/443 端口强制 ICP 备案检测,非标准端口(如 8443)不受限。利用 Cloudflare 支持回源到非标准 HTTPS 端口的特性,即可在未备案的情况下通过 https://api1.example.com:8443 访问源站服务。

原理

1
用户 → Cloudflare(CDN 边缘节点)→ 腾讯云源站:8443
  • 云厂商只检测 80/443,8443 等非标准端口不触发备案拦截。
  • CF 免费版默认支持回源到 8443、2083、2053 等非标准 HTTPS 端口。
  • 源站用自签名证书 + CF Full 加密模式即可回源,无需 CA 证书。
  • 访问 URL 必须带端口号,CF 回源端口与 URL 端口一致。

第一步:腾讯云(源站)

1. 放行安全组

控制台 → 实例 → 安全组,添加入站规则:TCP / 8443 / 0.0.0.0/0(后续可收紧为 CF IP 段,见第四步)。

2. 生成自签名证书

1
2
3
4
5
6
7
8
9
sudo mkdir -p /etc/nginx/ssl
cd /etc/nginx/ssl

# 有效期 10 年,SAN 中列出所有子域名
sudo openssl req -x509 -nodes -days 3650 -newkey rsa:2048 \
-keyout /etc/nginx/ssl/selfsigned.key \
-out /etc/nginx/ssl/selfsigned.crt \
-subj "/C=CN/ST=Beijing/L=Beijing/O=MyOrg/CN=example.com" \
-addext "subjectAltName=DNS:api1.example.com,DNS:api2.example.com"

验证 SAN 是否包含所有子域名:

1
2
openssl x509 -in /etc/nginx/ssl/selfsigned.crt -text -noout | grep DNS
# DNS:api1.example.com, DNS:api2.example.com

3. 配置 Nginx 反向代理

编辑 /etc/nginx/conf.d/yourdomain.conf,以两个子域名分别反代到本地 11025、11026 为例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
server {
listen 8443 ssl;
server_name api1.example.com;

ssl_certificate /etc/nginx/ssl/selfsigned.crt;
ssl_certificate_key /etc/nginx/ssl/selfsigned.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

client_max_body_size 50M;

location / {
proxy_pass http://127.0.0.1:11025;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

# WebSocket 支持(用不到可删)
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}

server {
listen 8443 ssl;
server_name api2.example.com;

ssl_certificate /etc/nginx/ssl/selfsigned.crt;
ssl_certificate_key /etc/nginx/ssl/selfsigned.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers HIGH:!aNULL:!MD5;
ssl_prefer_server_ciphers on;

client_max_body_size 50M;

location / {
proxy_pass http://127.0.0.1:11026;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;

proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";

proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}

测试并重载:

1
2
sudo nginx -t
sudo systemctl reload nginx

第二步:Cloudflare

1. 添加 DNS 记录并开启代理

DNS → Records,为每个子域名添加 A 记录:Name 填子域名前缀(如 api1),IPv4 填腾讯云公网 IP,Proxy status 保持橙色云开启

2. 设置 SSL/TLS 加密模式(关键)

SSL/TLS → Overview,加密模式设为 Full

  • 不能选 Full (Strict):严格校验会导致自签名证书回源失败(526 错误)。
  • 不能选 Flexible:CF 到源站退化为 HTTP,失去该段加密。

3. 确认端口支持(可选)

Network → Custom ports for HTTPS,确认 8443 在支持列表中(默认开启)。

第三步:验证与排错

浏览器访问 https://你的腾讯云IP:8443,忽略证书警告继续前往,能看到网站内容即源站配置成功;再通过 https://api1.example.com:8443 验证完整链路。

常见问题:

  • 526:加密模式误设为 Full (Strict),改为 Full。
  • 超时:安全组或系统防火墙(iptables/firewalld)未放行 8443。
  • 502:后端服务未启动或端口不对。

第四步:防止源站 IP 泄露(进阶)

CF 代理不能阻止别人扫到源站 IP 后直接访问 8443。推荐开启 Authenticated Origin Pulls,只允许 CF 回源:

  1. CF 控制台 SSL/TLS → Origin Server,开启 Authenticated Origin Pulls。
  2. 下载 CF 客户端 CA 证书(origin-pull-ca.pem)放到 /etc/nginx/ssl/
  3. Nginx 配置中添加:
1
2
3
# 验证 CF 客户端证书
ssl_client_certificate /etc/nginx/ssl/origin-pull-ca.pem;
ssl_verify_client on;

此后直接通过 IP 访问会被 Nginx 拒绝(400 错误),彻底隐藏源站。

总结

  • 核心思路:非标准端口避开备案检测 + Cloudflare Full 模式兼容自签名证书
  • 三个要点:安全组放行 8443 → Nginx 监听 8443 + 自签名证书 → CF 橙色云 + Full 模式。
  • 上线后建议开启 Authenticated Origin Pulls 保护源站。