前言

在源服务器未开放任何防火墙端口的情况下,Cloudflare Zero Trust 可以安全的代理 SSH 隧道,保护源服务器的安全。

Cloudflare Tunnel SSH

SSH-Chat 是一个 Golang 编写的自定义 SSH 服务器,用户登录这个 SSH 会得到一个终端里的在线聊天室(而不是一个 Shell 环境)。它跟您的服务器正常登录的 SSH 不会冲突,主要特性有:

  • 通过 SSH 访问聊天室
  • 用户可以互相私信,隐藏/仅显示指定用户的消息
  • 支持白名单/黑名单
  • 设置颜色主题
  • 管理员可以踢出不友好的用户
  • 给消息添加时间戳前缀
  • 可以通过用户的 SSH 公钥确认身份

通过 Cloudflare Tunnel,我们得到额外的安全和隐私好处:不必担心 SSH 通道被攻击,也不用担心用户 IP 泄漏

部署 SSH-Chat

SSH-Chat 是 Golang 编写的,没有特殊需求,我们下载编译好的 二进制文件 就可以了,支持 Linux, macOS, FreeBSD, Windows

本文 将以 Ubuntu 22.04.1 LTS x86_64 为例,当前登录正常 SSH 的用户名为 ubuntu

# 当前路径
$ pwd
/home/ubuntu

开始部署(以 SSH-Chat 监听在服务器本地 5566 端口为例)

# 下载编译好的 Linux x64 二进制程序到 
$ export LATEST_SSHCHAT=$(curl -s https://api.github.com/repos/shazow/ssh-chat/releases | grep -om1 "https://.*/ssh-chat-linux_amd64.tgz") && \
wget "${LATEST_SSHCHAT}" && \
sudo tar -xf ssh-chat-linux_amd64.tgz -C /opt &&
# SSH-Chat 程序路径为 /opt/ssh-chat/ssh-chat

# 修改 SSH-Chat 监听端口为 5566
$ sudo sed -i -e '/^Port/s/^.*$/Port 5566/' /etc/ssh/sshd_config && \
sudo service ssh restart

# 在当前用户目录生成一对用户 SSH-Chat 的 OpenSSH 密钥对
# 将 /home/ubuntu 替换成你自己的用户目录
$ sudo ssh-keygen -t ed25519 -N '' -f /home/ubuntu/.ssh/chat

# 当前用户目录的 .ssh 目录下
# 生成了用于 SSH-Chat 的密钥对如下:
# 私钥文件 /home/ubuntu/.ssh/chat
# 公钥文件 /home/ubuntu/.ssh/chat.pub

# 登录正常 SSH 的公钥路径(指定管理员的公钥)
# /home/ubuntu/.ssh/authorized_keys

设置进程守护

# 新建一个 Systemd 服务
$ sudo vim /etc/systemd/system/ssh-chat.service

# 写入以下内容

# 根据实际修改
# 用户 SSH-Chat 的私钥路径
# /home/ubuntu/.ssh/chat
# 用于 SSH-Chat 管理员的公钥路径
# /home/ubuntu/.ssh/authorized_keys

[Unit]
Description=ssh-chat
After=network.target

[Service]
Type=simple
User=root
#You can store keys ouside of root and comment out 'User=root' then uncomment 'User=nobody'
#User=nobody

ExecStart=/opt/ssh-chat/ssh-chat --bind=":5566" -i="/home/ubuntu/.ssh/chat" --admin="/home/ubuntu/.ssh/authorized_keys"
AmbientCapabilities=CAP_NET_BIND_SERVICE
Restart=always

[Install]
WantedBy=multi-user.target

开始运行 SSH-Chat

$ sudo systemctl daemon-reload && \
sudo systemctl enable ssh-chat && \
sudo systemctl start ssh-chat && \
sudo systemctl status ssh-chat

SSH-Chat 已经在本地 5566 端口跑起来了

配置 Cloudflare SSH Tunnel

我这台服务器之前安装过了 Cloudflared,如果您现在的源服务器还没有安装 Cloudflared,可参考 配置 Cloudflare Tunnel 安装和添加 Tunnel。

登录 Cloudflare Zero Trust 控制台,左侧导航菜单选择 Access,进入 Tunnels 子菜单,在连接的 Tunnel 里点击 Add a public hostname 添加一个主机名隧道

Add a public hostname

添加监听的 SSH 端口即可

Config Hostname

点击 Save 保存设置,现在我们的 SSH Chat 聊天室已经可以准备就绪了。

加入聊天室

由于我们没有向公网暴露 SSH Chat 的端口,所以要加入聊天室的朋友们需要现在自己的个人电脑上安装 Cloudflared 并新增一条 SSH 配置(不会影响其他 SSH 配置),以 macOS 为例

# 安装 Cloudflared
$ brew install cloudflared

# 查看 Cloudflared 路径
$ which cloudflared
/opt/homebrew/bin/cloudflared

# 编辑 SSH 配置文件
$ vim vim ~/.ssh/config

添加以下配置(以我刚刚搭建的 SSH-Chat 为例)

  • 将 ssh.dejavu.moe 替换成您自己部署的主机名
  • 将 /opt/homebrew/bin/cloudflared 替换成您的个人电脑上 Cloudflared 的路径
Host ssh.dejavu.moe
ProxyCommand /opt/homebrew/bin/cloudflared access ssh --hostname %h

我们的 SSH Chat 聊天室已经开放,如果您想进来玩,只需要在您的个人电脑上安装 Cloudflared,然后修改 SSH 配置就可以啦 🥸,我们公开信息如下:

  • 主机名 ssh.dejavu.moe
  • 公钥 ssh.dejavu.moe ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIOME3xkK54l+R1opuF5FdybtQVVpeZxulnreYP/H6kof
  • 指纹 SHA256:11jXwBM5F5/WDSLeTnkl/CcUlYRV3iukdriAptoAySI

SSH Chat

加入后使用 /help 获取命令帮助,就可以开始聊天啦~

参考资料: