我用 Cloudflare Tunnel 把家里的小服务搬上公网:一次配置手记

前阵子我在家里一台常开的小主机上搭了个私人笔记服务,只在局域网里能打开,出门就用不了。路由器上开端口转发我是不想碰的:端口一开就等于把家门敞给全网扫描器。朋友推荐了 Cloudflare Tunnel,说是不用开任何入站端口就能把本地服务挂到自己的域名上,我花了一个晚上照着官方文档配了一遍,过程还算顺利,但有几个坑得先想清楚。

动手之前,先把风险想在前面

这部分必须写在所有步骤之前,因为 Tunnel 本身只是把路修通了,路口放不放哨是你自己的事。隧道一通,你的服务就真的在公网了,任何一个疏忽都会被放大。

第一,不要把敏感服务直接暴露。管理后台、数据库、NAS 的管理页、路由器的管理页,这些东西天生就不是给公网准备的。我的原则是:只暴露那个确实需要在外面用的服务,而且是只读或者低权限的那个,其余一律不挂。数据库和管理后台如果非要在外面用,走另外的路,比如只对自己开放的私有网络,而不是挂一个公网域名。

第二,访问控制要和隧道一起上。Tunnel 只是连通,鉴权要靠 Cloudflare Access 来补。做法是在 Zero Trust 里给这个域名建一个 Access 应用,配一条只放行你自己的邮箱或者指定账号的规则,没通过验证的人连服务长什么样都看不到。只建隧道不加 Access,就等于修了条路却没装门,任何人输入域名都能敲门。

第三,隧道令牌就是钥匙。创建隧道时 Cloudflare 会给一串安装命令,里面带着隧道的令牌,谁拿到这串令牌,谁就能以你的名义把隧道跑起来。别把它贴到聊天记录、截图或者公开的笔记里,换机器时重新生成,怀疑泄露了就立刻在后台吊销重建。

第四,免费版的功能边界要先认清。Cloudflare 官方文档写明,Tunnel 在所有套餐上都可用,不用开入站端口(核实日期为 2026-11-09)。但免费版具体有哪些限额、哪些高级功能需要付费,我这次没有逐项核对,免费版的具体限额未核实,动手前请以 Cloudflare 官网当前的套餐说明为准,不要照着旧教程里说的免费额度去规划。

第五,认清 Tunnel 不是万能钥匙。它是为 Web 服务设计的,笔记、相册这类走 HTTPS 的服务最合适;非 HTTP 的服务需要客户端额外装软件才能连,视频流这类大流量场景也不适合走这条路(未核实:具体哪些流量类型受 Cloudflare 服务条款限制,请以官网条款原文为准)。远程桌面或者大文件串流,先确认 Tunnel 是不是合适的工具,别硬套。

准备工作:三样东西缺一不可

动手之前我先确认了三件事。第一,一个 Cloudflare 账号和一个已托管在 Cloudflare 的域名,没有域名挂不上去,这是官方文档的前提条件(核实日期为 2026-11-09)。第二,一台常开的机器,我用的就是跑笔记服务的那台小主机,要能联网。第三,本地服务本身已能在局域网里正常打开,我先用内网地址确认了一遍,服务没跑起来就配隧道,只会让排错变成两头找问题。

第一步:在后台创建一个隧道

我先登录 Cloudflare 仪表盘,进 Zero Trust,再进网络、隧道,点创建隧道,选 Cloudflared 作为连接器类型,起名比如 home-notes,保存。官方文档里的路径就是仪表盘的网络、隧道下创建隧道(核实日期为 2026-11-09),菜单位置可能随版本微调,以实际看到的为准。

建好之后,页面会让你选运行环境,我选了 Linux,页面随即给出一条安装命令,里面带着这条隧道的令牌。官方文档给出的 Linux 形态大致是先装 cloudflared,再用令牌把它装成系统服务(核实日期为 2026-11-09),命令里的令牌就是上一节说的钥匙,复制时注意别多复制了空格,也别把它留在终端历史里到处传。

第二步:在小主机上把 cloudflared 跑起来

回到小主机终端,把后台给的那条安装命令原样粘贴执行,装完确认 cloudflared 已在运行。回到仪表盘的隧道页面等了一会儿,状态变成了已连接。官方文档的说法是,隧道正常后会在隧道页面显示健康状态(核实日期为 2026-11-09),我这边不到一分钟就变绿了。

如果状态一直不变,先别急着重装:检查小主机能不能正常联网,再检查令牌有没有复制完整,服务是不是真的在运行。我这次一次就通了,但之前看别人踩过的坑,十有八九是令牌复制时少了一截,或者机器时间不对导致握手失败(未核实:机器时间导致握手失败是我在社区讨论里看到的说法,未经官方文档确认)。

第三步:给服务挂一个公网主机名

隧道通了只是路通了,还要告诉 Cloudflare 把哪个域名指向哪台本地服务。在隧道详情里找到公开主机名,添加一条:子域名填一个你想要的前缀,比如 notes,域名选你自己的域名,服务地址填本地服务的内网地址,比如 http://localhost:8000 这种形式。官方文档里发布应用的描述就是这样:一条隧道路由把公网主机名映射到本地服务(核实日期为 2026-11-09),我用的端口号是我自己服务的实际端口,你要填你自己的,不要照抄示例。

保存之后,Cloudflare 会自动处理这个子域名的解析,不用再去 DNS 里手动加记录。

第四步:打开浏览器,用 HTTPS 访问

做完上一步,我直接在手机浏览器里打开 https://notes.我的域名,页面正常打开,地址栏带锁,证书是 Cloudflare 自动配的,不用自己申请和续期。HTTPS 是 Tunnel 自带的,官方文档的原话是隧道建立的是出站加密连接,不需要开放入站端口或改防火墙(核实日期为 2026-11-09)。

验证的时候我做了三件事:第一,手机关掉 Wi-Fi 用流量打开,确认外网真的能访问;第二,在局域网里也打开一次,确认内外看到的是同一个服务;第三,退出登录状态再打开一次,确认 Access 的登录拦截确实在工作,未登录时打不开服务页面。这三步都通过,我才算这件事真正做完了。

收尾:Access 规则与日常维护

Access 应用我是这样配的:在 Zero Trust 里进访问、应用程序,新建一个应用,域名填上面挂好的子域名,策略里只放行我自己的邮箱。配完用另一个浏览器打开验证了一次,确实先跳到验证页,输邮箱收一次性验证码才能进。具体菜单名称可能随版本变化(未核实:我操作时看到的菜单名称与官方文档截图是否一致,未逐项核对),思路不变:隧道负责连通,Access 负责放行谁。

日常维护没多少事:小主机重启后确认 cloudflared 还在运行、隧道还是已连接;有更新时 cloudflared 会自己跟进,我只在仪表盘里偶尔看一眼。要养成习惯的是两件事:一是定期检查 Access 的放行名单,别让早就不用了的邮箱还留在里面;二是任何时候都不要把管理后台挂到公网域名上,新增服务前先问自己一句,这个服务真的需要在外面打开吗?

回头看,整个配置最花时间的不是敲命令,而是动手前想清楚暴露什么、不暴露什么。隧道本身十几分钟就能跑起来,但一个没加访问控制就挂上公网的管理后台,收拾起来可能要花几天。先想风险,再动手,这句话放在任何一次内网穿透之前都适用。

本文关键步骤的官方口径核实日期为 2026-11-09,来源为 Cloudflare 开发者文档的 Tunnel 入门页;免费版具体限额与文中标注未核实的内容,请以 Cloudflare 官网当前说明为准。