零基础教程:用 Cloudflare Tunnel 把家里网站搬到公网上
很多小伙伴家里搭了 NAS、智能家居控制中心、个人博客,或者各种好玩的服务,但都被困在内网里——出门就访问不了。买公网 IP?运营商 increasingly 不给。搞 DDNS+端口映射?路由器一层层 NAT,烦得要死。
今天讲一个 cleaner 的方案:Cloudflare Tunnel。不需要公网 IP,不需要开端口,一条命令就能让外网安全访问你家里的网站。而且免费。
什么是 Cloudflare Tunnel
简单来说,Cloudflare Tunnel(以前叫 Cloudflare Argo Tunnel)是在你本地机器上跑一个轻量级守护进程(cloudflared),它主动连到 Cloudflare 的边缘网络,建立一个加密隧道。外网用户通过你的域名访问 Cloudflare,Cloudflare 再把流量通过这个隧道转发到你本地。
关键点:
- 连接是出站的(从你家里连出去),所以不需要公网 IP,不需要在路由器上开端口
- 全程 TLS 加密,Cloudflare 替你挡掉大量攻击
- 免费额度对个人用户完全够用
你需要准备什么
- 一个域名 — 任何域名都行,可以在 Cloudflare 注册,也可以把已有的域名 DNS 转到 Cloudflare
- 一台能跑 cloudflared 的设备 — 树莓派、NAS、旧笔记本、甚至路由器都可以
- Cloudflare 账号 — 免费版即可
步骤一:把域名接入 Cloudflare
如果你还没把域名放到 Cloudflare 管理,先去 Dashboard 添加站点。Cloudflare 会扫描你现有的 DNS 记录,然后给你两个 NS 服务器地址。去你的域名注册商那把 NS 改过去,等生效(通常几分钟到几小时)。
这一步很简单,就不展开了。
步骤二:安装 cloudflared
以 Linux 为例,一条命令搞定:
# 下载并安装
wget -q https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64.deb
sudo dpkg -i cloudflared-linux-amd64.deb
# 验证安装
cloudflared --version
其他系统(macOS、Windows、Docker)参考官方文档,思路一样。
步骤三:登录并授权
cloudflared tunnel login
这条命令会给你一个链接,浏览器打开后登录 Cloudflare 账号并授权。授权成功后,本地会生成一个证书文件(~/.cloudflared/cert.pem),后续操作都用它。
步骤四:创建隧道
cloudflared tunnel create my-home-server
my-home-server 是你给隧道起的名字,随便取。创建成功后,会输出一个 Tunnel ID,记下来,后面要用。
同时,配置文件会生成在 ~/.cloudflared/ 目录下,比如 my-home-server.json。
步骤五:配置路由
在 ~/.cloudflared/ 下创建 config.yml:
tunnel: <你的 Tunnel ID>
credentials-file: /home/你的用户名/.cloudflared/<Tunnel ID>.json
ingress:
- hostname: blog.yourdomain.com
service: http://localhost:8080
- hostname: nas.yourdomain.com
service: http://localhost:5000
- service: http_status:404
解释一下:
hostname是你想要的外网域名(要先在 Cloudflare DNS 里添加对应的 CNAME)service是本地实际跑的服务地址和端口- 最后一行
http_status:404是兜底规则,没有匹配到的请求返回 404
多个服务? 加多行 hostname + service 就行,一个隧道可以代理无数个本地服务。
步骤六:把域名指向隧道
现在需要把你的子域名(比如 blog.yourdomain.com)指向这个隧道。Cloudflare 的方式是创建一个 CNAME 记录,但值不是 IP,而是隧道的特殊路由:
cloudflared tunnel route dns my-home-server blog.yourdomain.com
执行后,Cloudflare 会自动在你的 DNS 记录里添加一条 CNAME:blog.yourdomain.com → <Tunnel ID>.cfargotunnel.com。
如果你有多个子域名,每条都跑一遍上面的命令。
步骤七:启动隧道
前台测试:
cloudflared tunnel run my-home-server
看到 Connected 的日志,说明隧道通了。此时用手机流量访问 blog.yourdomain.com,应该就能看到家里的网站了。
步骤八:设为系统服务(开机自启)
前台运行不靠谱,得让它成为系统服务:
sudo cloudflared service install
sudo systemctl start cloudflared
sudo systemctl enable cloudflared
注意:用 service install 时,cloudflared 会读取 /etc/cloudflared/config.yml。建议把 ~/.cloudflared/config.yml 和凭证文件复制过去:
sudo mkdir -p /etc/cloudflared
sudo cp ~/.cloudflared/config.yml /etc/cloudflared/
sudo cp ~/.cloudflared/*.json /etc/cloudflared/
然后重启服务验证:
sudo systemctl restart cloudflared
sudo systemctl status cloudflared
进阶:HTTPS 自动搞定
很多家里跑的服务默认是 HTTP。Cloudflare Tunnel 有个贴心功能:自动把 HTTP 升级成 HTTPS,而且证书由 Cloudflare 统一签发管理。你什么都不用做。
如果你本地服务本身就是 HTTPS,或者需要保留原始协议,可以在 config.yml 里加 originRequest 配置:
ingress:
- hostname: secure.yourdomain.com
service: https://localhost:8443
originRequest:
noTLSVerify: true # 如果本地是自建证书
总结
Cloudflare Tunnel 的核心优势:
- ✅ 零公网 IP 需求 — 对没有公网 IP 的用户是救命稻草
- ✅ 零端口暴露 — 路由器不需要做任何端口映射,攻击面极小
- ✅ 免费 + 自带 HTTPS — 个人使用完全免费,SSL 证书自动续期
- ✅ 一个隧道代理多个服务 — 子域名随便加
- ✅ 稳定 + 全球加速 — Cloudflare 的边缘网络做中继,速度不差
缺点也有:
- 流量走 Cloudflare,敏感数据你信不信任它自己判断
- 免费版有一些功能限制,但个人用基本碰不到
对于想安全地把家里服务暴露到公网、又不想折腾 DDNS 和端口映射的人来说,Cloudflare Tunnel 是目前最省心的方案之一。建议试试。
有问题欢迎在评论区交流。