前提条件

  • 一台内网服务端(例如 NAS 或本地 Web 服务,监听在 127.0.0.1:80 或其他端口)。

  • 一个已托管在 Cloudflare 的域名,例如 example.com

  • Cloudflare Tunnel 已可用(免费版也可以)。


1. 安装 cloudflared(Debian/Ubuntu)

# 添加 Cloudflare 官方源

curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg > /dev/null

echo "deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/ $(lsb_release -cs) main" | sudo tee /etc/apt/sources.list.d/cloudflare.list

# 更新并安装

sudo apt update

sudo apt install cloudflared

检查版本:

cloudflared --version


2. 创建 Tunnel 并绑定域名

在 Cloudflare Dashboard 中:

1. 进入 Zero Trust → Networks → Tunnels

2. 新建一个 Tunnel(选择 Cloudflared)。

3. 保存生成的 Tunnel Token

4. 在 Public Hostname 设置里添加入口,例如:

  • Hostname: a.example.com

  • Service: http://127.0.0.1:80

这样 Cloudflare 会自动在 DNS 里加 a.example.comcfargotunnel.com 的解析。


3. 在 VPS 上运行 cloudflared 并接通 Tunnel

TUNNEL_TOKEN="abc"   # 复制 Cloudflare 给的 Tunnel Token

sudo cloudflared service install "$TUNNEL_TOKEN"

sudo systemctl enable cloudflared

sudo systemctl start cloudflared

检查状态:

systemctl status cloudflared

正常的话,访问 https://a.example.com → 就会转发到 VPS 本地 127.0.0.1:80


4. 使用 Let’s Encrypt 签发证书

安装 certbot:

sudo apt install certbot

执行签发(以 nginx 为例):

sudo certbot certonly --webroot -w /var/www/html -d a.example.com

验证流程:

  • Let’s Encrypt 会访问 http://a.example.com/.well-known/acme-challenge/...

  • 请求先到 Cloudflare 边缘节点,再经 Tunnel 转发到 VPS 的 127.0.0.1:80

  • 本地 certbot 在 /var/www/html/.well-known/acme-challenge 放置验证文件

  • 验证成功,证书下发。


5. 自动续签

Certbot 默认会在系统定时任务中写入自动续签。你可以手动测试:

sudo certbot renew --dry-run

6. 验证证书

成功后,证书保存在:

/etc/letsencrypt/live/a.example.com/fullchain.pem

/etc/letsencrypt/live/a.example.com/privkey.pem

可以用:

openssl x509 -in /etc/letsencrypt/live/a.example.com/fullchain.pem -noout -text

确认颁发者为 Let’s Encrypt,域名为 a.example.com


🔑 总结

1. Cloudflare Tunnel 负责 让无公网 IP 的服务可被公网访问

2. Let’s Encrypt 只需要能访问 http://a.example.com/.well-known/acme-challenge/... → 因为有 Tunnel,所以验证能通过。

3. 证书获取后,内网 / 外网访问同域名时都能使用合法的 TLS 证书。