
在使用 Cloudflared Tunnel 进行内网穿透时,后端服务的配置常常是一个令人困惑的点,尤其是关于 TLS 的处理。本文将详细说明在 Cloudflared 反向代理模式下,Caddy 服务的最佳配置实践,帮助你避免常见的配置陷阱。
一、核心配置原则
整个配置的核心思想可以概括为:职责分离。Cloudflared 与 Caddy 各司其职,能简化配置并提升稳定性。
-
Caddy 仅需配置为纯 HTTP 服务
这意味着你无需在 Caddy 配置中设置 internal tls 或任何其他与 TLS 相关的指令。Caddy 只需监听本地的某个端口(例如 :8080),专注于处理应用层的业务逻辑即可。这种配置方式极大地简化了 Caddy 侧的 配置管理 复杂度。
-
TLS 加密由 Cloudflared 全权负责
Cloudflared Tunnel 会负责与公网客户端之间建立 TLS 加密连接。当请求通过隧道到达你的服务器时,Cloudflared 会先完成 TLS 解密,然后将解密后的纯 HTTP 请求转发给本地监听的 Caddy 服务。因此,Caddy 完全不参与这部分的加密环节,自然也不需要配置 TLS。
二、为什么不建议配置双重 TLS?
你可能会想,既然 Cloudflared 可以处理 TLS,那让 Caddy 也开启 TLS 不是更安全吗?实际上,这种“双重 TLS”配置弊大于利。
- 功能冗余:Cloudflared 已经完成了公网侧的端到端加密,在本地回环(localhost)上再叠加一层 TLS,并不会带来额外的安全增益,反而是一种资源浪费。
- 增加配置成本:你需要额外管理 Caddy 的证书,并配置 Cloudflared 信任这个本地证书,同时还需要调整端口映射规则(例如从
http://localhost:8080 改为 https://localhost:8443)。
- 提升出错概率:双重 TLS 可能引发证书验证、协议兼容性或端口映射错误,一旦出现问题,排查故障的复杂度和时间成本会大幅上升。
三、关键注意事项
遵循以上原则配置时,还需要注意两个关键细节:
- 确保 Caddy 监听地址正确:Caddy 应该监听本地可访问的地址,例如
127.0.0.1:8080 或 :8080(后者默认绑定所有接口,但在本机环境也可用)。目的是避免服务意外暴露在公网端口上。
- 核对 Cloudflared 转发配置:在你的 Cloudflared 配置文件(通常是
config.yml)中,ingress 规则里指向的后端服务地址,必须与 Caddy 的监听地址和端口完全一致。例如,如果 Caddy 监听 127.0.0.1:8080,那么 Cloudflared 的配置就应该是 service: http://127.0.0.1:8080。这一步是确保流量能正确送达的关键,务必仔细核对。
以下是配合此场景的一个简单 Caddyfile 示例和代码片段:
# Caddyfile
# 监听本地 8080 端口,提供纯 HTTP 服务
:8080
# 你的路由规则
route {
# 这里配置你的各种路由、反向代理或文件服务
reverse_proxy /api/* localhost:3000
file_server /static/* {
root /var/www/html
}
}
// 一个简单的 Node.js 后端示例,运行在 3000 端口,由上面的 Caddy 代理
const express = require('express');
const app = express();
app.use(express.json());
// 定义路由
app.get('/api/data', (req, res) => {
res.json({ message: 'Hello from server!' });
});
app.post('/api/data', (req, res) => {
const { name, age } = req.body;
if (!name || !age) {
return res.status(400).json({ error: 'Name and age are required' });
}
res.json({ message: `Hello ${name}, you are ${age} years old.` });
});
// 启动服务器
const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server running on port ` + PORT);
});

总结
总而言之,在 Cloudflared Tunnel 的反向代理架构下,让 Caddy “轻装上阵”,只作为纯 HTTP 后端服务,是最简单、最稳定也最合理的配置方式。这遵循了 系统 架构中单一职责和最小化配置的原则。记住这个关键点,可以帮你节省大量不必要的调试时间。
更多关于 Cloudflared 隧道本身的配置细节,你可以参考其官方文档。

|