Cloudflare Zerotrust 之 Webssh

AI摘要:

参考链接:

使用cloudflare转发ssh端口 - kelley_go - 博客园 (cnblogs.com)

使用 Cloudflare Tunnels 通过 Web SSH 访问服务器 (hellowood.dev)

Linux | systemd详解 | system.service | 参数解析_remainafterexit-CSDN博客

创建本地管理隧道 (CLI) | Cloudflare Tunnel 中文文档 (cloudflared.cn)

先决条件

必须需要一个 cloudflare 账号,以及开通 cloudflare zero trust

安装cloudflare:Releases · cloudflare/cloudflared (github.com)

配置 Tunnels

Cloudflare 提供两种方式创建隧道:

  1. 在 zero trust 页面用 web 添加授权
  2. 在本地服务器(raspberry)上用 config 文件添加

建议采用第一种方法,配置较为直观。本教程只讲述第二种方法

登录cloudflared

先安装cloudflared,然后运行以下命令:

1
cloudflared tunnel login

终端会给出一个类似 https://dash.cloudflare.com/argotunnel?callback=https%3A%2F%2Flogin.cloudflareaccess.org%xxxxxxxxxxxxxxxxxxxxxxx 的登陆地址,复制黏贴该地址到浏览器中,然后按照要求登录即可。
如果是有二步验证的,需要登录了以后,再次黏贴该地址,因为二步验证结束后并不会自动跳转到该 cloudflared 验证登录页面。

授权的话,每次只能选择一个网站,当然,一个网站也就够用了,我们可以解析很多三级域名。

当然如果需要授权多个网站,授权完成后不要关闭网页!依次点击其他需要授权的域名,进行多次授权。

运行成功的话,会生成 ~/.cloudflared/cert.pem文件。

创建tunnel

创建完以后,会把信息保存到 ~ /.cloudflared 文件夹下,注意不要误删了

  • cloudflared tunnel create <你的隧道名字>
  • 示例: cloudflared tunnel create xm2

创建域名 CNAME

添加一个域名:

  • cloudflared tunnel route dns <隧道名字> <域名>
  • 示例cloudflared tunnel route dns xm2 ssh.cngo.us.kg

然后 cloudflare 就会在你的域名下自动生成一个 CNAME,把 ssh.cngo.us.kg 指向 <隧道 UUID>.cfargotunnel.com

以此类推,我们可以如法炮制在面板上添加其他的需要的 CNAME

配置 Config 文件

添加好想要穿透的域名后,我们就可以开始映射了。

1
2
3
4
5
6
7
8
9
# sudo vim  ~/.cloudflared/config.yml

tunnel: 8d7488ac-fae9-4672-bb34-f864c7b0b385
credentials-file: /home/android/.cloudflared/8d7488ac-fae9-4672-bb34-f864c7b0b385.json

ingress:
- hostname: ssh.cngo.us.kg
service: ssh://localhost:22
- service: http_status:404

注意:最后的 - service: http_status:404 一定要加,这是兜底的规则。还有复制黏贴的时候确保格式没有错误,很可能会发生 mapping error。

最后生效的配置文件位置 /etc/cloudflared/config.yml

配置完以后,可以测试下配置文件是否有问题。

1
2
3
# sudo cloudflared --config ~/.cloudflared/config.yml  tunnel ingress validate
Validating rules from /home/android/.cloudflared/config.yml
OK

启动隧道

1
2
cloudflared tunnel --config [配置文件路径] run`
示例:`cloudflared tunnel --config ~/.cloudflared/config.yml run

移除已有服务

若以前配置过cloudflared服务,则需要先卸载,同时移除配置文件/etc/cloudflared/config.yml

1
2
3
sudo cloudflared service uninstall

sudo rm /etc/cloudflared/config.yml

安装cloudflared服务

1
2
3
4
5
sudo cloudflared --config ~/.cloudflared/config.yml service install


2024-06-22T15:40:40Z INF Using SysV
2024-06-22T15:40:41Z INF Linux service for cloudflared installed successfully

指定安装config文件,否则可能报错:

Cannot determine default configuration path. No file [config.yml config.yaml] in [~/.cloudflared ~/.cloudflare-warp ~/cloudflare-warp /etc/cloudflared /usr/local/etc/cloudflared]

配置Linux系统服务cloudflared.service

1
sudo vim /usr/lib/systemd/system/cloudflared.service

加入如下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=Cloudflared
After=network.target

[Service]
Type=simple
ExecStart=/etc/init.d/cloudflared start
ExecReload=/etc/init.d/cloudflared restart
ExecStop=/etc/init.d/cloudflared stop

Restart=on-failure
TimeoutSec=300

[Install]
WantedBy=multi-user.target

然后配置开机自启动,由于chroot容器不支持systemctl,可根据下列链接安装servicectl命令

安卓手机改造服务器——解决chroot下无法使用systemctl - sw-code - 博客园 (cnblogs.com)

1
2
3
sudo systemctl enable cloudflared
#or
sudo servicectl enable cloudflared

创建 SSH 应用

  • 创建应用

在 Cloudflare 控制台 > Zero Trust > Access > Applications 选择 Add an application 创建新的应用;应用类型为 Self-hosted

homelab-cloudflare-ssh-application-create.png

  • 配置应用信息

指定应用名称,并为应用配置域名;session 的过期时间可以按需配置

homelab-cloudflare-ssh-configuration-application.png

  • 指定访问策略

需要配置访问策略,只允许特定的邮箱登陆;如果需要使用其他的认证方式,如 GitHub/Google SSO 等,可以在 Cloudflare 控制台 > Zero Trust > Settings > Authentication > Login Methods 中添加

homelab-cloudflare-ssh-configuration-policy.png

  • 修改应用类型

在 Additional settings 中,将 Browser rendering 的类型改为 SSH;然后选择保存,这样就配置好 SSH 应用了

homelab-cloudflare-ssh-set-application-type.png

踩坑经历

通过cloudns配置的域名未添加子域名NS,导致CNAME不生效,一定要确保域名CNAME是生效的


Cloudflare Zerotrust 之 Webssh
https://blog.cngo.rr.nu/posts/4763.html
作者
cngo
发布于
2024年6月22日
许可协议