好文集ChatGPT Plus¥119

内网穿透别再花钱了!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 installToken不要外传;跑cloudflared的机器别开代理TUN
发布服务添加路由,子域名对应服务地址Docker里的cloudflared不能填localhost
多个服务同一条隧道加多条路由,局域网设备也能发子域名有旧记录要先删
保护后台Access加邮箱验证码带App的服务别加
长期在线防睡眠、断电自启、服务自启真的重启一次验证

折腾完这一套,你就可以畅通无阻地在外访问家里的服务了~

感谢看到这里,如果这篇文章对你有帮助的话,欢迎关注、点赞、收藏。如果有其他想看的干货文章或者文章中存在错误的地方,也欢迎在评论区指出。我们下篇文章再见。

全文完
查看原文