致谢

CloudFlare真的是赛博活佛😍

起因

无聊看了几篇写CF Tunnel的文章,发现用来内外穿透效果还不错?(仅对于Web网站,游戏联机就不要想了)

虽然自己也有服务器可以搭建Frp进行穿透,但一个是配置麻烦,更改配置还需要重启Frpc,另外也不想什么都通过主服务器穿透,万一哪天主服务器被打进黑洞了超麻烦(阿里云的鸡一摸就死,服务还没死呢就给你扔黑洞去了)

更何况有些服务自带的验证安全程度还达不到我的要求,例如cockpit,仅仅是验证主机的Linux账户密码(为了防止自己锁自己,宿舍服务器密码没有用keepass生成),1panel还好,我用keepass,但是为了方便没开2fa。

这就导致离开寝室局域网后将无法控制我的宿舍服务器,只能使用部分映射出来的服务。

前几天就因为宿舍忘记交电费意外断电后我忘记启动kvm上挂的实验环境,导致实验室的学弟用不了虚拟机,当时在实验室也没办法远程启动,只能等我回寝室后登录后台启动

play

CF Tunnel现在被归类到Zero Trust内

目前我用过的就3个大块:Gateway,Access,网络

Gateway管理的就是原来的warp以及warp+,不过现在大陆已经用不了了

CF Tunnel则在网络内

安装客户端与创建隧道

首先需要安装cloudflared,这里为了方便管理我选择的docker安装

按照官方给出的含token的命令创建好容器后,将容器网络改为host方便访问主机内各个服务

建议一个隧道对应一个主机,一个主机只需要创建一个隧道就行

创建公共主机名

这里就是配置具体服务(有点类似配置反向代理)

子域配置的是公共访问地址,访问内网服务就访问该地址

类型配置的是内网具体是什么服务,cloudflare如何访问你的内网服务,和设置CDN差不多,只是说CDN的话如果设置HTTP,那cf到你源服务器的流量就真的是完全未加密,而Tunnel默认是完全加密的

Tips:一个常见小坑是,源服务开启HTTPS并开启HTTP自动跳转HTTPS,但CF后端地址却填写的HTTP协议,这会造成无限跳转,无论用户访问是HTTPS还是HTTP。因为当流量从cf流向源服务器时进入的是80端口,源服务器会返回一个301跳转指向HTTPS,客户端收到301并继续跳转访问,然后流量继续从cf流向源服务器的80端口,无限循环。

一个大坑:如果你是用的docker部署,后端协议选的HTTPS的话,下发的配置默认不会带originServerName,导致cf会把源服务器返回的证书SNI与你填写的后端地址进行对比。一般来说本地服务都会填写127.0.0.1或者localhost,这就会导致remote error: tls: internal error",解决方案一个是开启noTLSVerify,不要验证TLS证书,一个是填写源服务器名称,而且我发现填写一次后哪怕之后删掉,也不会出现这个问题了。

创建完后就可以愉快的使用公共主机名地址访问了

添加Access

用来管理访问策略

策略

可以先创建一些策略,例如ban掉海外ip,仅允许自己的邮箱访问等等

应用程序

这里就对应之前的公共主机名,一个公共主机名可以对应一个应用程序(虽然设置上可以对应多个)

应用程序名称爱怎么填怎么填

公共主机名内容和服务公共主机名一致

然后在策略一栏选择自己创建的策略

登录方法默认的只有向邮箱发送一次性OTP代码的选项,不过支持很多第三方OAuth,例如github,google等,还支持自定义openid connect,可以对接我自己部署的zitadel

不过自从隔壁博主的casdoor出现 CVE-2025-4210 Casdoor <=v1.811.0 - Unauthenticated SCIM Operations导致 【警告】我们注意到moeworld.tech发生了邮件盗用现象后,我就有点不敢用自托管的统一身份认证了,在这种可能会危及到内网安全的重要服务上还是算了,邮件OTP也不是不行

目前市面上常见的IAM基本上都会有角色控制功能,不仅仅提供IdP的功能,也就是说应用开发可以完全不需要自己独立的账户权限管理功能而依赖IAM,但一旦IAM出现问题那就不好玩了

创建完应用程序后在Tunnel内的公共主机名进行绑定即可

后记

这下内网一些私密服务可以通过Tunnel+Access暴露出来了🥰

至于网站访问速度,虽然延迟有点高,但至少可以正常访问,不像CF的CDN,正常访问都是挑战