内网穿透别再花钱了!Cloudflare Tunnel保姆级教程:不要公网IP、不开端口,家里NAS、路由器在外面直接打开
文章目录
公网IPv4被电信收回之后,我用一条免费的Cloudflare Tunnel,把家里17个服务都搬上了外网,一个端口都没开
上一篇给大家介绍了如何自建密码库,不用公网IP,也不用额外开端口,靠的就是Cloudflare Tunnel,今天单独写一篇再给大家详细讲讲。
前段时间电信把我的公网IPv4收回去了。好在公网IPv6还在,现在留着当备用。 但IPv6有个问题:你在外面连的网络也得有IPv6才行,公司、酒店的Wi-Fi很多都没有,没有就是打不开。 而且IPv6直连要在路由器上放行端口,家里的设备等于直接挂在公网上,还是不太方便而且不太安全。
所以现在主力换成了Cloudflare Tunnel。 Cloudflare被叫「赛博大善人」不是白叫的,Tunnel绝对是它最被低估的一个功能。
我在家里常开的Mac mini上跑了一条隧道,挂了17个服务,一分钱没花:
群晖NAS、路由器后台、OpenWrt、Alist、图床、密码库、网络唤醒,人在外面打开对应的网址就能用。
最好玩的是这个:在任何一台电脑的浏览器里,验证一下邮箱,就能直接打开我家Mac mini的终端。
你可能会担心,后台都挂到网上,不怕被人扫吗? NAS、路由器这几个,打开之前都要先过一道Cloudflare的邮箱验证码,只有我自己的邮箱能进,别人拿到网址也没用。
Cloudflare Tunnel能用来做什么
| 想做的事 | 以前怎么做 | 用Tunnel之后 |
|---|---|---|
| 访问家里部署的服务 站点、图床、密码库等 | 公网IP+端口映射+反向代理+证书 | 加一条路由,自动带HTTPS |
| 远程管理路由器、OpenWrt等 | 基本只能回家再说 | 加一道邮箱验证,直接打开 |
| 远程开家里的电脑 | 买个开机棒 | 网页版网络唤醒,点一下就开机 |
| 给朋友看自己做的网页 | 先买服务器部署 | 一行命令生成临时链接 |
| VPS上的面板不想暴露端口 | 改端口、配防火墙 | 面板走隧道,端口全关 |
工作原理
传统做法是让外面的请求主动进到家里,要公网IP,还得自己配端口映射和证书,端口一开谁都能扫到:
互联网 → 家庭公网IP → 光猫/路由器 → 端口映射 → 家里的电脑
Cloudflare Tunnel反过来,家里的电脑上跑一个cloudflared,主动连出去,请求再顺着这条连接转回来:
访问者 → 你的域名 → Cloudflare → Tunnel → 家里的cloudflared → 家里的服务
所以没有公网IP也行,一个端口都不用开,HTTPS证书Cloudflare自动给,而且免费。 我几台VPS的3X-UI面板也是走隧道发布的,VPS上同样一个端口都不开。
缺点:比直连慢
Tunnel不是直连,流量要先绕一圈Cloudflare。 免费版在大陆没有节点,我家这条隧道连的就是洛杉矶和圣何塞(lax、sjc):
也就是说,人在国内打开家里的NAS,数据要先出国到洛杉矶,再从洛杉矶回到家里,绕了大半个地球。 具体来说:
-
延迟高:打开网页、点点后台没问题,但每一下都比直连慢一拍;
-
速度看运气:晚高峰跨境线路拥堵,下载大文件可能很慢;
-
大文件传不上去:免费版单个请求最大100MB,往NAS网页里传大文件会失败;
-
不能跑视频串流:Cloudflare的条款不允许免费服务大量传视频,Jellyfin、Plex这类流量一大有被限制的风险。
所以我的用法是:网页、后台这类轻量的东西走Tunnel,图的是哪都能打开、不用开端口;传大文件、看视频,在外面有IPv6的网络就走IPv6直连。
和其他方案比一比
远程访问家里,常见的就这几种,各有各的长处:
| 方案 | 怎么访问 | 速度 | 门槛 | 最适合 |
|---|---|---|---|---|
| Cloudflare Tunnel | 浏览器打开域名,访问的设备什么都不用装 | 绕美国,偏慢 | 要一个域名 | 网页类服务、各种后台、分享给别人用 |
| Tailscale | 每台设备都装客户端、登录同一个账号,组成一个虚拟局域网 | 能打洞直连就快,打不通走中转就慢 | 每台设备都要装 | 只有自己用,SMB挂载、远程桌面、SSH这类非网页的 |
| 公网IP+DDNS | 域名直接连到家里 | 最快,跑满家里上行带宽 | 要公网IP,还得自己开端口、配证书 | 大文件、视频串流 |
| VPS+frp | 流量经过自己的VPS转发 | 看VPS的线路和带宽 | 要买VPS,自己配置 | 想全部自己掌控,手上正好有好线路的VPS |
| 花生壳这类 | 用它给的域名访问 | 免费版限速 | 最低,装上就能用 | 不想折腾,也愿意付费 |
几个方案的取舍,展开说一下:
Cloudflare Tunnel:最大的好处是访问的人什么都不用装,浏览器打开就行,所以发给家人、朋友用很方便。缺点就是前面说的,绕路慢,只适合网页类的服务。
Tailscale:它会尽量让设备之间直接连,打洞成功的话速度接近直连;打不通才走它的中转服务器,中转节点都在境外,就会慢。SMB、远程桌面、游戏这些非网页的协议都能用。 但每台要访问的设备都得装客户端,没法把链接随手发给别人。 还有一个对我们很关键的问题:iPhone上同一时间只能开一个VPN,Tailscale和小火箭会互相顶掉,想访问家里就得先关代理。
公网IP+DDNS:速度最快,没有中间商。但公网IPv4现在越来越难要到,家宽的80、443端口一般也被封了,只能用别的端口;IPv6又要访问的网络也支持。端口一开,安全就得自己负责。
VPS+frp:手上有好线路的VPS的话,速度可以比Tunnel快,所有东西也都在自己手里。但要多花一台VPS的钱,配置和维护也要自己来。
简单说:网页类的、要分享给别人的,用Tunnel;只有自己用、要跑非网页协议的,用Tailscale;要速度,就得有公网IP。
它们并不冲突,完全可以同时用。
零、没有域名?先用一行命令试试
Quick Tunnel不用注册账号,也不用域名,Mac上装好cloudflared,把3000换成你本地服务的端口:
brew install cloudflared
cloudflared tunnel --url http://localhost:3000
几秒后终端里会打印一个https://xxxx.trycloudflare.com的临时地址,打开就是你本地的页面:
什么时候用得上?凡是「想让别人临时看一眼我电脑上的东西」,都可以拿它顶一下:
-
临时演示:写了个网页、小工具还没部署,发个链接让朋友或客户直接打开看效果,不用先买服务器、配域名;
-
手机上看效果:电脑上开发的页面,想在手机上看看排版,或者让用安卓、iPhone的朋友都帮忙点一点;
-
调试回调:支付、Telegram机器人这类Webhook,要求填一个公网HTTPS地址,本地开发时拿它临时填上;
-
临时传文件:本地起一个文件服务,把链接发给对方下载,传完一关链接就失效了。
不过它只是测试用的:每次启动地址都会变,按Ctrl+C一关地址就失效,同时最多200个请求。想长期用,咱们继续看后面的步骤。
一、创建隧道,把cloudflared装上
Cloudflare后台左侧菜单联网→Tunnels,点「创建隧道」,名字按设备起:
然后选你的系统。Mac就选macOS,复制第一条命令到终端执行:
service install会把cloudflared注册成系统服务,开机自启、掉线自动重连。 服务都在Docker里的,选Docker,写法和上篇密码库一样,我家Mac mini就是这么跑的。
命令里那串Token等于隧道的钥匙,不要发给别人,截图记得打码。
命令跑完,网页上显示「隧道连接成功」就行:
到这一步只是隧道通了,还没告诉它把哪个域名转到哪个服务,下面继续。
二、发布第一个服务,以路由器后台为例
进入隧道→路由→添加路由,选「已发布的应用程序」,填子域名、域名和Service URL:
路由器在局域网的另一台设备上,所以Service URL填的是它的局域网IP加管理页面端口。
保存后Cloudflare会自动加DNS记录,打开https://子域名.你的域名就能访问。 最后用手机关掉Wi-Fi、开5G再打开一次,家里Wi-Fi下能开,不代表外网能开:
注意:路由器后台这种管理页面,发布出去之后任何人知道网址都能打开,一定要配合第四节的Access一起用,别光发布不加验证。
Service URL最容易填错,看cloudflared装在哪:
| 情况 | Service URL填 |
|---|---|
| cloudflared直接装在电脑上,服务也在这台电脑 | http://localhost:端口 |
| 都在Docker里,同一个网络 | http://服务名:容器内端口 |
| 服务在局域网另一台设备上 | http://局域网IP:端口 |
第三种我用得最多:cloudflared只在Mac mini上装一份,NAS、路由器的服务也能一起发布,它们上面什么都不用装。
注意cloudflared跑在Docker里时,localhost指的是容器自己,所以我家Mac mini上的服务填的也是它的局域网IP,填localhost会直接502。
三、一条隧道挂多个服务
一个服务不用建一条隧道,同一条隧道里加路由就行,每个服务一个子域名。 开头那张17条路由的图,按设备分是这样的:
| 设备 | 发布出去的服务 |
|---|---|
| 群晖NAS 192.168.81.199 | DSM管理页面、Alist |
| 路由器 192.168.81.1 | 路由器后台 |
| OpenWrt 192.168.81.110 | OpenWrt后台 |
| Mac mini本机 192.168.81.172 | Memos、图床、密码库、网络唤醒、Dockge、DDNS-GO等,外加SSH |
以后加新服务:服务跑起来→加一条路由→手机5G打开验证,不用动路由器,也不用申请证书。
四、给后台加一道门:Cloudflare Access
服务发布出去之后,任何人知道网址都能打开。 博客、Demo无所谓,NAS、路由器、OpenWrt这种后台不能裸着,加一道Cloudflare Access:打开网址先跳到验证页,输入邮箱、填验证码,才能看到真正的页面。
我现在加了Access的有这些,用的都是同一个「Only Me」策略:
「Only Me」是我自己建的策略,规则就一条:只允许我的邮箱通过(操作是Allow,规则类型是Emails)。 建一次,以后每个后台直接选它就行:
怎么加
左侧菜单Zero Trust→访问控制→应用程序,右上角「新建应用程序」,选「自托管和私有」:
然后填两样东西:
-
目标:要保护的子域名,和隧道里那条路由一样;
-
Access策略:第一次用就点「创建新策略」,操作选「Allow」,规则选「Emails」填你自己的邮箱。以后再加应用,直接在下拉框里选这个现成的策略就行。
创建之后再打开这个网址,就会先跳到验证页。只有验证通过才能正常访问。
再提一个好玩的:在浏览器里开Mac的终端
路由列表里SSH那条,服务填的是ssh://192.168.81.172:22。 再给它建一个Access应用,打开「允许通过基于浏览器的RDP、SSH或VNC会话进行访问」这个开关,类型就变成了「浏览器SSH」。
验证完邮箱,人在外面用浏览器就能直接操作家里Mac mini的终端
带App的服务别加Access
你可能注意到了,上一篇密码库那条路由我没加Access校验。因为Bitwarden的App和插件是直接调接口的,没法在网页里验证邮箱,加了反而连不上。这类服务靠自己的账号密码和两步验证就行。
五、让它长期在线
第一次跑通只说明链路没问题,想一直在线还要处理两件事:
1. 别让Mac睡着
系统设置→能耗,打开「显示器关闭时,防止自动进入睡眠」,再打开「断电后自动启动」。 这样停电来电后,Mac会自己开机。
2. 服务和cloudflared都要开机自启
-
cloudflared:用service install装的,已经是系统服务;Docker跑的,compose里加restart: unless-stopped,Docker本身也要设成开机启动。
-
你的服务:交给Docker、pm2或者macOS的启动项,不要手动在终端里跑。
理想的状态是:
停电→来电→Mac自动开机→服务和cloudflared自动启动→域名恢复访问
六、打不开怎么办
看报错页面上的代码,两种最常见的我都故意弄出来了一次。
Error 1033:隧道没连上。 cloudflared没在跑,后台看隧道状态是不是「健康」,Docker就看docker logs cloudflared。
502 Bad Gateway:隧道通了,但找不到你的服务。 浏览器✅、Cloudflare✅,只有最右边Host❌。 我是在Docker里的cloudflared上填了http://localhost:80复现的,日志里会写connection refused。先在cloudflared那台机器上curl一下你填的地址,通不了就是服务没起或者地址填错。
开着Clash/小火箭TUN模式的电脑,cloudflared可能连不上。 我在开着Clash fake-ip的MacBook上试的时候,日志一直报edge discovery ... DNS query failed,cloudflared查不到Cloudflare的接入节点。跑cloudflared的机器最好别开代理的TUN模式。
如果必须开着Clash,可以试试把+.argotunnel.com加进fake-ip-filter让它走真实DNS,这个我还没实测过。
其他
| 现象 | 原因 |
|---|---|
| 保存路由时提示DNS记录冲突 | 这个子域名之前有别的记录,去DNS页面删掉 |
| Wi-Fi下能开,5G打不开 | 你在家其实走的是局域网,用流量重新测 |
排查顺序记住一句:先服务,再隧道,最后域名。
写在最后
| 步骤 | 做了什么 | 最容易踩的坑 |
|---|---|---|
| 试水 | cloudflared tunnel --url拿临时地址 | 地址每次都变,只适合测试 |
| 创建隧道 | 后台建隧道,Mac上service install | Token不要外传;跑cloudflared的机器别开代理TUN |
| 发布服务 | 添加路由,子域名对应服务地址 | Docker里的cloudflared不能填localhost |
| 多个服务 | 同一条隧道加多条路由,局域网设备也能发 | 子域名有旧记录要先删 |
| 保护后台 | Access加邮箱验证码 | 带App的服务别加 |
| 长期在线 | 防睡眠、断电自启、服务自启 | 真的重启一次验证 |
折腾完这一套,你就可以畅通无阻地在外访问家里的服务了~
感谢看到这里,如果这篇文章对你有帮助的话,欢迎关注、点赞、收藏。如果有其他想看的干货文章或者文章中存在错误的地方,也欢迎在评论区指出。我们下篇文章再见。


















