🌩️ 当域名遇上家里的电脑:一条隧道通向世界
"如果代码能飞翔,那我的内网也该走出卧室。"
------ 一个厌倦了光猫折腾的开发者的心声
1️⃣ 为什么我的电脑像隐士?
我们都有一台电脑,可能跑着博客、NAS、Docker 一堆服务,心里想着:
"这玩意儿要是能随时随地访问,不就完美了吗?"
现实却啪啪打脸:
- 没有公网 IP,运营商说"要加钱"。
- 光猫 NAT,配置像解数学奥赛题。
- 证书更新比恋爱还麻烦,还老掉链子。
你的电脑就像一个被困在深山的隐士,高冷、强大,但没人能找到。
2️⃣ 让隐士出山的几条路
出山之路 | 类比 | 优点 | 缺点 |
---|---|---|---|
DDNS + 端口映射 | 砸门牌号、通宵排队 | 免费直连 | 要公网,还得拜访光猫大爷 |
frp/ngrok | 自建驿站 | 灵活、强大 | VPS、配置、维护都要全包 |
ZeroTier/Tailscale | 小圈子微信群 | 内部沟通低延迟 | 分享给外人时一脸懵 |
Cloudflare Tunnel | 全球顺丰快递柜 | 免公网、免折腾、自动 HTTPS | 流量经人家,隐私要信任 Cloudflare |
一句话:别人还在路由器菜单里跳大神,你已经轻描淡写:
arduino
cloudflared tunnel run my-mac
3️⃣ 为什么选择 Cloudflare Tunnel?
因为它让电脑"出山"这件事,不再像修仙,而是像点个外卖:
- 免公网 IP → 不求人
- 免端口映射 → 不折腾
- 自动 HTTPS → 不掉链子
- 全球节点加速 → 访问比送外卖还快
- Zero Trust → 还能假装是大厂 SSO
形象点说:你家门口多了一个 Cloudflare 专属快递柜,世界的请求先放进去,你的 Mac 自己取。你只要偶尔清理一下柜子,不用天天搬门口的大石头。
4️⃣ 安装步骤(macOS + Nginx@80)
4.1 安装 cloudflared
brew install cloudflared
4.2 登录 Cloudflare
cloudflared tunnel login
选择你的主域名 yiqiquhuxi.cn
。
4.3 创建隧道
lua
cloudflared tunnel create my-mac
- 会生成一个 UUID (类似
3a0f23c2-xxxx-xxxx-xxxx-8af5d3d6d123
)。 - 在
~/.cloudflared/
下会生成UUID.json
。 - 👉 记住这个 UUID,后面配置文件要用!
4.4 写配置文件(重点:替换 UUID)
先确认 UUID 和文件名:
bash
cloudflared tunnel list # 查看隧道 ID(UUID)
ls ~/.cloudflared # 确认有 UUID.json
然后编辑 ~/.cloudflared/config.yml
:
yaml
tunnel: YOUR-UUID # 替换为实际 UUID
credentials-file: /Users/neo/.cloudflared/YOUR-UUID.json # 替换为实际 文件路径和 UUID
ingress:
- hostname: mac.yiqiquhuxi.cn
service: http://localhost:80
- service: http_status:404
⚠️ 注意:
- 两处的
YOUR-UUID
必须和UUID.json
一致。 - 常见报错
credentials file doesn't exist
,十有八九是因为这里没替换对。
4.5 绑定域名(首次绑定)
perl
cloudflared tunnel route dns my-mac mac.yiqiquhuxi.cn
👉 Cloudflare 会自动创建一条 CNAME 解析。
4.6 启动测试
arduino
cloudflared tunnel run my-mac
访问 👉 https://mac.yiqiquhuxi.cn
,看到你的本地 Nginx 主页。
4.7 后台常驻
sql
brew services start cloudflared
5️⃣ 一隧道,多服务(多域名 / 多端口)
5.1 标准三步(每新增一个服务/端口/域名都按这个顺序)
- 绑定新域名到隧道(每个新子域名只需一次)
perl
cloudflared tunnel route dns my-mac api.yiqiquhuxi.cn
cloudflared tunnel route dns my-mac blog.yiqiquhuxi.cn
- 在
config.yml
里添加 ingress 规则(把域名映射到本地端口)
yaml
ingress:
- hostname: mac.yiqiquhuxi.cn
service: http://localhost:80
- hostname: api.yiqiquhuxi.cn
service: http://localhost:8080
- hostname: blog.yiqiquhuxi.cn
service: http://localhost:3000
- service: http_status:404
- 重启隧道服务,让新规则生效
perl
brew services restart cloudflared # 如果是后台常驻
# 或者:
pkill cloudflared && cloudflared tunnel run my-mac
5.2 单域名 → 路径分发(交给 Nginx)
只用一个域名也行,把分流交给 Nginx:
/
→ 首页服务(80)/api
→ 本地 8080/blog
→ 本地 3000
Tunnel 负责"把流量打进家门",Nginx 负责"安排进哪个房间"。
5.3 江湖恶搞版流程图
css
🌍 世界各地的请求
│
▼
[ Cloudflare 快递柜 ]
│
┌────────┴────────┐
▼ ▼
[Nginx 门口保安] (404黑名单)
│
┌───────┼─────────────┐
▼ ▼ ▼
[Hexo 小房间] [Spring Boot 书院] [Node.js 茶馆]
6️⃣ 常见坑点
报错 | 原因 | 解决 |
---|---|---|
credentials file doesn't exist |
JSON 文件路径写错 / UUID 不一致 | ls ~/.cloudflared 确认 UUID.json |
404 Not Found | ingress 规则没写对 | 确认 hostname 和 Cloudflare DNS 一致 |
502 Bad Gateway | Nginx 没跑起来 | brew services start nginx 检查服务 |
7️⃣ 工作原理小剧场
很多人会问:Cloudflare Tunnel 到底是怎么做到"外网直接访问内网"的?
简单说,它和我们平时说的 内网穿透(frp、ngrok 之类)一个道理:
- 你的 Mac 上跑的
cloudflared
客户端,会主动向 Cloudflare 建立一条加密隧道(相当于你跑去快递柜,把柜门钥匙插好,随时待命)。 - 当外部有人访问
mac.yiqiquhuxi.cn
时,请求先到 Cloudflare 边缘节点(全球的中继点),再顺着隧道转发进来。 - 因为是你主动连出去的,不需要公网 IP,不用开路由器端口,NAT 和防火墙都拦不住。
类比一下:
- frp → 你租了个快递柜,自己贴小广告让别人来存取快递。
- Cloudflare Tunnel → Cloudflare 给你免费快递柜,顺带还提供全球连锁网点 + 免费保安(证书、DDoS 防御)。
所以,Cloudflare Tunnel 本质上就是 "官方托管的内网穿透 + CDN 加速" 。
缺点是------流量必须经过 Cloudflare,你得信任它不会偷看快递。
8️⃣ 🎤 结语
过去要让域名访问家里的电脑,必须和运营商/路由器斗智斗勇;现在?只要 Cloudflare Tunnel 一开,你的域名就能优雅直通家里的 Nginx,而且一条隧道就能服务全家。
下次别人问你:
"你怎么让外网访问到家里电脑的?"
你就笑一笑:
"我有 Cloudflare 给的专属快递柜,一次能收好多快递!" 😎