丢掉端口,使用cloudflare tunnel 实现免端口访问内网服务

楔子

何为内网穿透,简单来说就是在公网可以直接访问到你在内网搭建的各种服务。
起初是我前两天在serv00搭建了alist,并且把原本在openwrt上面搭建的数据都迁移了过去。今天发现上面挂载的国内网盘(百度、阿里云及115)都加载不出来,全部显示timeout超时,cloudflare的R2存储可以正常打开。而我之前挂载在openwrt上面的却能正常访问,想想可能是serv00对访问国内网盘的api有做限制或是国内网盘限制从serv00服务器登录?所以我还是想着把挂在openwrt上的Alist开放出来做存储站点附件的网盘用,因为在serv00上的alist地址不带端口,所以就想到了做内网穿透。

传统DDNS设置

对于普通家用宽带用户来说,一般需要做DDNS域名+端口的形式来访问内网服务,当然这个前提是你家宽带获取到了公网IP。这个方法也是我目前常用的方法,一般的操作步骤如下:
1.在主路由添加并设置DDNS服务,常用的DDNS服务商是花生壳。首先你需要先去花生壳注册一个账户,还要注册一个壳域名。然后在路由器相关界面输入账号和域名信息。目前国内主流的路由器基本上都内置了oray花生壳的ddns服务。
image.png

2.在主路由添加NAT端口映射服务,设置外部访问端口,这里内部端口和外部端口可以不一致。内部端口是你内网环境下该服务使用的端口,而外部端口是你希望在外网环境下访问该服务使用的端口。目前国内运营商基本上都封禁了类似于80、443、21、22等常用的端口,所以我们如果需要外网访问这些端口服务的话,就需要将这些端口映射成其他不同的端口。
image.png

这样设置完之后就可以通过ddns域名+外部访问端口来访问对应的服务了。

如果你家宽带没有公网IP,那这个办法就行不通了,而且这种方法访问的时候需要加端口号,形式上不太美观,更重要的是会直接暴露你家的公网IP地址。
这个时候就需要用到内网穿透技术了,常用的内网穿透技术还有frps,但这个需要搭建一个单独的服务器,门槛比较高。今天介绍的是使用cloudflare的tunnel服务来实现内网穿透,只需要一个可以运行docker的环境即可。因为我家里还有一个刷了openwrt的旁路由,可以运行docker容器,所以我就在这台openwrt上跑cloudflare tunnel服务了。

cloudflare tunnel设置

登录到cloudflare网站,进入站点,左侧菜单找到Access。进入Zero Trust。

image.png
进入Network,找到Tunnel,新增一条tunnel记录。

tunnel01.png

给tunnel起一个名字。

tunnel02.png

环境选择Docker,并复制下面的运行命令。

tunnel03.png

接着输入你想要设置的二级域名,并且输入内网主机地址及端口,Type选择HTTP。完成之后会自带https。

tunnel04.png

接着使用复制出来的命令在旁路由上新建容器,确保容器正常运行即可。

等待几分钟在Tunnels中看到状态为healthy,就可以用我们设置好的二级域名直接访问内网服务了。
image.png

如果你后续还需要穿透更多的服务,直接编辑现有的tunnel就可以增加了,无需再次部署docker。
image.png

image.png

如果我们回到这个域名的解析列表中查看,可以看到刚刚设置的二级域名被CNAME解析到了cfargotunnel.com结尾的站点,并且开启了黄色小云朵。无论你在这个tunnels下创建了多少个hostname,这个地址都是相同的。
image.png

访问速度

基于国内的网络状况,相较于传统的ddns,cloudflare tunnels在国内的访问速度比较一般,主要表现在第一次打开时比较慢。