200字
使用 Cloudflare Tunnels 通过 Web SSH 访问服务器
2025-11-05
2025-11-10

Cloudflare 的 Zero Trust 支持通过 Tunnels 访问 SSH 类型的应用,可以通过 Web SSH 的方式访问服务器;支持多种登陆认证方式,安全性远高于直接暴露公网端口。

1. 🚀 创建 SSH 应用

1.1. 创建应用

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

1.2. 配置应用信息

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

1.3. 指定访问策略

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

1.4. 修改应用类型

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

2. 🔑 配置 Cloudflare Tunnels

关于 Tunnels 配置安装请参考 Cloudflare 相关文档。

2.1. 添加 SSH 服务转发

将 SSH 的路由添加到 /etc/cloudflared/config.yml 文件中:

 tunnel: xxxxxxxxxx
 credentials-file: /root/.cloudflared/xxxxxxxxxx.json
 ingress:
   - hostname: terminal.mydomain.com
    service: ssh://localhost:22
   - service: http_status:403

2.2. 重启 cloudflared

重启后即可通过该 Tunnel 访问 SSH 服务。

sudo systemctl restart cloudflared

2.3. 访问

访问刚才配置的 SSH 服务的域名;会提示使用邮箱或者配置的方式进行登陆。

3. 🛡️ 配置短期证书

在用户使用时,需要输入用户名进行登陆,如果用户不允许密码登陆,还需要使用私钥进行验证;这种方式非常不方便;因此 Cloudflare 提供了短期证书的方式进行认证登陆,用于代替 SSH 密钥。

3.1. 创建用户

通过 Web SSH 访问服务器,那么用户必须和使用 SSO 登陆的用户名一致,比如 SSO 登陆账户是 abc,那么服务器也只能使用同名的用户进行短期证书登陆,其他用户名是不支持的;若验证界面采用邮箱验证,则登录所使用的用户名为你邮箱的用户名,例如使用abc@example.com邮箱认证,则登录用户为abc。

创建同名用户

sudo adduser abc

设置用户权限

如果想让该用户拥有 root 权限,需要将该用户添加到 wheel 用户组 (CentOS 等系统) 或者 sudo 用户组 (Ubuntu 等系统)。

CentOS 等 RedHat 系列

usermod -aG wheel abc

Ubuntu 等

usermod -aG sudo abc

3.2. 生成公钥证书

在 Cloudflare 控制台 > Zero Trust > Access > Service Auth > SSH 选择刚才创建的 SSH 应用,然后生成证书。

3.3. 配置公钥

将公钥添加到服务器
将刚才生成的公钥添加到要登陆的服务器上,路径可以自己配置,最好和 SSH 的配置放在一起。

将公钥添加到 /etc/ssh/cloudflare-ca.pub:

cat <\<EOF /etc/ssh/cloudflare-ca.pub
生成的公钥内容, 如 ecdsa-sha2-nistp256 XXXXXXXX open-ssh <ca@cloudflareaccess.org>
EOF

修改 SSH 配置
需要开启公钥认证,并且指定刚才的公钥为可信任的 CA 公钥;将以下内容添加到 /etc/ssh/sshd_config 文件中。

PubkeyAuthentication yes
TrustedUserCAKeys /etc/ssh/cloudflare-ca.pub

可选,允许隧道

PermitTunnel yes

3.4. 配置客户端

用 cloudflared 生成用户配置,并写入到 ~/.ssh/config 文件中。

cloudflared access ssh-config --hostname terminal.mydomain.com --short-lived-cert \~/.ssh/config

或者可以手动修改写入配置:

Match host terminal.mydomain.com
HostName terminal.mydomain.com
ProxyCommand /usr/local/bin/cloudflared access ssh --hostname %h
IdentityFile \~/.cloudflared/terminal.mydomain.com-cf\_key
CertificateFile \~/.cloudflared/terminal.mydomain.com-cf\_key-cert.pub

3.5. 重启 SSH

sudo systemctl restart ssh

重启完成后,访问配置的 SSH 域名,通过 SSO 登陆后,即可进入到 Web SSH 命令行界面;登陆的用户为 SSO 登陆用户 abc;若验证界面采用邮箱验证,则登录所使用的用户名为你邮箱的用户名,例如使用abc@example.com邮箱认证,则登录用户为abc。

使用 Cloudflare Tunnels 通过 Web SSH 访问服务器
作者
Tano
发表于
2025-11-05
License
CC BY-NC-SA 4.0

评论