Duet G. Blog

Keep It Simple, Stupid

使用Cloudflare Tunnel通过标准http(s)端口访问内网服务器

其实访问内网服务器本身就是隧道的功能之一,这并没有什么可多说的。但Cloudflare Tunnel的优势在于,不但能够内网穿透,还可以为原本不具备使用标准http(s)端口的服务(如国内的家庭宽带)增加标准端口访问。当然还有Cloudflare提供的其他付费免费的安全功能和加速功能就不细说了。

大多数人用家宽架设服务器的时候都会选择在路由器上用一个非标准的端口映射到内网的机器上。也许你内网的机器是标准的80或者443端口,但映射的时候只能给他随便挑个吉利(冷僻)的端口。再用DDNS把wan口获得的公网IP同步到DNS服务上。然后在浏览器的地址栏里敲上你的域名外加冒号和端口号,就能看到内网开的服务了。

但是假如电信公司没给你公网IP呢?

这时候用Cloudflare Tunnel就会非常方便了(其实有公网IP也可以用)。借官网的图来解释一下:

通过加密隧道,你的内网资源与Cloudflare建立了访问通道,而Cloudflare又把资源映射到你托管在它上面的域名上,无视你是否有公网IP(因为资源是通过隧道访问的),也不管你是否是标准端口(因为域名在Cloudflare上托管,不管实际是什么端口,它只管从标准端口转发过去就好)。这样我们就实现了使用标准端口访问内网资源的目的。

使用之前要弄明白一点:你的内网只要有一台机器和Cloudflare建立的Tunnel连接,且内网设备间互相访问是没有障碍的。那么你内网的所有机器都可以在Cloudflare上映射一个标准端口的域名,哪怕是一台空调或者一个冰箱。这个功能类似于Tailscale的路由功能。

先选择一台机器作为与Cloudflare建立Tunnel的客户端。这里有几点建议。尽量不要选需要频繁切换代理的机器,因为Tunnel连接在切换代理的时候会断掉,而是否能够重新连上是不一定的,重启客户端是比较可靠的方法。但有时不一定能物理接触到那台机器,然而Tunnel又断了,很有可能就没办法处理了。其次尽量选择能够一直开机的服务器来部署,因为如果关机了整个内网都会无法访问。最后是把客户端安在路由器里是个不错的选择,但可能没有在某台机器上方便管理和调整。

具体的安装可以部分参照少数派的《CloudFlare Tunnel 免费内网穿透的简明教程

由于我的域名目前已经在SNI/HOST黑名单,所以才会出现http协议映射后跳转https连接失败的情况。如果你的域名没问题,按照少数派的教程映射http是可以的。但如果你想用自己申请的证书,可以参考后面没有划线的文字。虽然少数派的教程算是详尽,但最后在“5. 配置域名和转发URL”环节是有一些表述上的问题的。如果是以http协议映射,即域名使用默认80端口访问,内网服务也是http协议,大多数情况是没有问题的,但请不要在域名SSL/TLS设置部分开启“始终使用 HTTPS”,否则会强行自动跳转https。可如果像少数派的教程所讲用https协议映射内网http端口的话,虽然Cloudflare能够给你一个免费的证书,但通过我的测试,在大陆网络环境下这种方式是无法访问到服务的,具体情况是浏览器会报无法获取证书的错。所以如果想要使用https,建议还是在本地服务器上配置证书,再用Nginx开启ssl监听端口(比如443),最后再以https协议在Cloudflare Tunnel中映射内网服务器的该端口,并且务必开启下方“Additional application settings”中“TLS”里的“No TLS Verify”开关,否则Cloudflare Tunnel会拒绝访问,返回502错误。

至于如何在没有公网IP以及80端口的情况下为主机申请免费证书,建议使用acme.shDNS API功能。


订阅评论
提醒
guest

0 评论
内联反馈
查看所有评论