
无公网 IP 使用 Cloudflare Tunnel 自动签发/续签 Let’s Encrypt 证书教程(Ubuntu/Debian)
前提条件
一台内网服务端(例如 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.com
→ cfargotunnel.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 证书。