「TIL」使用 Cloudflare Tunnel 穿透内网并增加登录保护

为了给朋友安利 Cloudflare Tunnel 以及协助他替换掉 frp 这款内网穿透应用,我花了几十分钟进行了学习和操作,将软路由上的 AList 通过 Cloudflare Tunnel 暴露到公网中,并增加了 OTP 验证为暴露出去的内网服务增加了一层安全保护。
Cloudflare Tunnel
Cloudflare Tunnel

准备工作

在开始前需要先拥有一个域名,然后将其托管到 Cloudflare 上,如果嫌麻烦可以直接在 Cloudflare 上注册域名。相关步骤这里略过不表。

创建 Tunnel

访问 Zero Trust 控制台,在侧边栏菜单找到 Access → Tunnels 并打开,点击页面上的 “Create a tunnel” 按钮创建一个新的通道,输入名称之后点击保存,然后会跳转到如下页面:
Install Connector
Install Connector

安装连接器

在页面上半部分根据你的运行环境进行连接器版本的选择,如果这里没有对应的可选项,例如想要在 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” 创建一个公开的服务。
notion image
  1. 填写子域名
  1. 选择要使用的域名
  1. 选择本地服务的协议类型
  1. 本地服务的访问地址,一般为 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 进入配置页面:
notion image
和前面的配置一样,1 和 2 分别是想要增加 OTP 验证的服务对应的域名,这里按需填写即可,如果想要对某个域名下的全部服务都开启,那么可以在 1 中填入通配符 *。认证服务选择 One-time PIN,其余选项保持默认即可,点击 “Next” 进入下一步,规则的配置。

规则配置

每一套配置方案有四种可选的动作,当规则命中时,将会执行方案配置中所选的动作:
Policy Actions
Policy Actions
规则有多种类型可以选择,可以根据邮件地址、国家、IP 地址等进行匹配,这里我选择使用邮箱后缀进行匹配,当访问者填写的邮箱是指定后缀的邮箱,则会命中规则,触发方案配置中的动作:
Rules
Rules
规则保存后,可以再次使用配置的域名访问本地服务了,页面会需要填写邮箱接收 OTP 验证码:
notion image
当校验通过后,会跳转到本地服务,刷新页面后也不会要求重新认证,是 Cloudflare 帮我们做了背后的所有工作,赞美 Cloudflare!

©️
 本文采用 CC BY-NC-ND 4.0 许可协议。转载或引用时请遵守协议内容!

© Ruter Lü 2016 - 2024