「TIL」使用 Cloudflare Tunnel 穿透内网并增加登录保护
为了给朋友安利 Cloudflare Tunnel 以及协助他替换掉 frp 这款内网穿透应用,我花了几十分钟进行了学习和操作,将软路由上的 AList 通过 Cloudflare Tunnel 暴露到公网中,并增加了 OTP 验证为暴露出去的内网服务增加了一层安全保护。
准备工作
在开始前需要先拥有一个域名,然后将其托管到 Cloudflare 上,如果嫌麻烦可以直接在 Cloudflare 上注册域名。相关步骤这里略过不表。
创建 Tunnel
访问 Zero Trust 控制台,在侧边栏菜单找到 Access → Tunnels 并打开,点击页面上的 “Create a tunnel” 按钮创建一个新的通道,输入名称之后点击保存,然后会跳转到如下页面:
安装连接器
在页面上半部分根据你的运行环境进行连接器版本的选择,如果这里没有对应的可选项,例如想要在
OpenWRT
中使用,可以在官方的 GitHub 仓库找到更多版本的连接器,我使用的是 R2S,所以选择的是 cloudflared-linux-arm64 这个版本。在选择好后下载并安装连接器,然后根据页面中间部分的指引进行操作,这里需要复制一段带有 Token 的命令在命令行中执行,在操作完毕后,可以看到页面底部的 Connectors 中出现了一条已连接的记录。此时重新打开 Access → Tunnels 页面将会看到刚新增加的通道,它的状态应该是一个绿色的 HEALTHY,连接器已经正确地安装好了。
在 OpenWRT 中安装的指引
通过 SSH 进入到 OpenWRT 系统中,然后执行以下命令安装所选版本连接器,请注意替换链接和所下载的文件名称:
curl -O -L https://github.com/cloudflare/cloudflared/releases/download/2023.3.1/cloudflared-linux-arm64 \ && chmod +x cloudflared-linux-arm64 \ && mv cloudflared-linux-arm64 /usr/bin/cloudflared
创建自启动:
touch /etc/init.d/cloudflared && chmod +x /etc/init.d/cloudflared vim /etc/init.d/cloudflared
如果你的 OpenWRT 没有安装
vim
的话,就改成 nano
或者别的编辑器,然后将以下内容粘贴进去,其中 cfd_token
这个变量需要把上面截图红圈部分的 Token 复制过来填写进去:#!/bin/sh /etc/rc.common USE_PROCD=1 START=95 STOP=01 cfd_init="/etc/init.d/cloudflared" cfd_token="Your Token" boot() { ubus -t 30 wait_for network.interface network.loopback 2>/dev/null rc_procd start_service } start_service() { if [ $("${cfd_init}" enabled; printf "%u" ${?}) -eq 0 ] then procd_open_instance procd_set_param command /usr/bin/cloudflared --no-autoupdate tunnel run --token ${cfd_token} procd_set_param stdout 1 procd_set_param stderr 1 procd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5} procd_close_instance fi } stop_service() { pidof cloudflared && kill -SIGINT `pidof cloudflared` }
保存后执行以下命令启动连接器:
/etc/init.d/cloudflared enable /etc/init.d/cloudflared start
公开服务
点击刚新增的通道名称,在弹出的抽屉页点击 Configure 进入配置页面,然后在 Public Hostname 这个 Tab 中点击按钮 “Add a public hostname” 创建一个公开的服务。
- 填写子域名
- 选择要使用的域名
- 选择本地服务的协议类型
- 本地服务的访问地址,一般为
192.168.x.y:8080
IP + 端口的形式
其他选项可以保持默认不动,保存后即可使用配置的域名访问内网的服务了。
访问认证
将内网服务直接对外暴露是一件很危险的事情,所幸 Cloudflare 提供了配套的认证服务,让我们可以简单几步就为暴露出去的内网服务增加访问认证功能。
在 Zero Trust 控制台打开 Settings → Authentication 页面,在 Login methods 中如果没有 One-time PIN 这个验证方式的话,点击 “Add new” 按钮后,选择 One-time PIN 即可添加 OTP 验证方式。
接下来在 Access → Applications 中点击按钮 “Add an application” 选择 Self-hosted 进入配置页面:
和前面的配置一样,1 和 2 分别是想要增加 OTP 验证的服务对应的域名,这里按需填写即可,如果想要对某个域名下的全部服务都开启,那么可以在 1 中填入通配符
*
。认证服务选择 One-time PIN,其余选项保持默认即可,点击 “Next” 进入下一步,规则的配置。规则配置
每一套配置方案有四种可选的动作,当规则命中时,将会执行方案配置中所选的动作:
规则有多种类型可以选择,可以根据邮件地址、国家、IP 地址等进行匹配,这里我选择使用邮箱后缀进行匹配,当访问者填写的邮箱是指定后缀的邮箱,则会命中规则,触发方案配置中的动作:
规则保存后,可以再次使用配置的域名访问本地服务了,页面会需要填写邮箱接收 OTP 验证码:
当校验通过后,会跳转到本地服务,刷新页面后也不会要求重新认证,是 Cloudflare 帮我们做了背后的所有工作,赞美 Cloudflare!
本文采用 CC BY-NC-ND 4.0 许可协议。转载或引用时请遵守协议内容!