bepr 是一个小巧的认证客户端/服务器反向 Shell 程序,基于出站 WebSocket 连接。
单个二进制文件涵盖所有三种模式:服务器模式、客户端模式和用户模式。它打包了 rpm、deb 和 pkg 的安装指引,体积约 1MB。
我创建 bepr 是因为我经常旅行,希望远程控制家里的电脑,同时又不让它们暴露在公共互联网上。只需一个域名(用于 TLS)和一台服务器即可运行。
访问 https://github.com/Aperocky/bepr/releases 找到适用于你平台的软件包版本。下载后使用以下命令安装:
sudo installer -pkg bepr-<版本>.pkg -target /
sudo dpkg -i bepr_<版本>_<架构>.deb
sudo rpm -i bepr-<版本>-<架构>.rpm
或者使用更新脚本来自动安装,运行脚本:
curl -fsSL https://raw.githubusercontent.com/Aperocky/bepr/main/packaging/scripts/update-deb.sh | sh
curl -fsSL https://raw.githubusercontent.com/Aperocky/bepr/main/packaging/scripts/update-macos.sh | sh
curl -fsSL https://raw.githubusercontent.com/Aperocky/bepr/main/packaging/scripts/update-rpm.sh | sh
现在,根据你的机器用途配置每一台主机。该二进制文件在所有三种模式下都能工作,但不会自动同步——出发前请设置好!
你需要自己的 TLS 证书和域名;这部分 bepr 不负责。创建服务器配置:
# cat /etc/bepr/server.conf
bind = 0.0.0.0:443
key_dir = /etc/bepr/client-keys
tls_cert = /etc/bepr/tls/cert.pem
tls_key = /etc/bepr/tls/privkey.pem
启动服务:
Linux:
sudo systemctl enable --now bepr
在服务器上,你可以通过本地 socket 列出已注册的客户端和已连接的用户。
[email protected]:~# bepr list
aperocky user disconnected
laptop client disconnected
mac_m1 client connected
pi_zero client connected
你也可以通过本地 socket 直接连接到某个客户端,其行为与用户模式相同。
bepr connect laptop
这会在你的域名上提供用户和客户端路径:
$domain/bepr/client/mac_m1 # 客户端从此连接
$domain/bepr/user/aperocky # 用户从此连接
一旦连接,bepr connect 终端的 stdin/stdout 会通过管道连接到所选客户端的 shell。客户端 shell 在 PTY 内运行,而服务器是原始透传字节路由器。多个客户端可以同时连接到服务器,但单个客户端一次只能有一个用户连接。
在每个客户端主机上,生成一对密钥:
ssh-keygen -t ed25519 -f /etc/bepr/client-keys/pi_zero
将公钥复制到服务器的 key_dir:
/etc/bepr/client-keys/pi_zero.pub -> 服务器上的客户端 ID pi_zero
创建客户端配置。URL 中的客户端 ID 必须与服务器上的公钥文件名匹配:
# cat /etc/bepr/client.conf
server = wss://server.example/bepr/client/pi_zero
private_key_path = /etc/bepr/client-keys/pi_zero
shell = /bin/sh
启动服务/守护进程:
Linux:
sudo systemctl enable --now bepr
mac:
sudo launchctl bootstrap system /Library/LaunchDaemons/com.bepr.plist
sudo launchctl enable system/com.bepr
sudo launchctl kickstart -k system/com.bepr
为了向后兼容旧客户端,旧路径 domain/bepr/$name 也被接受。以与服务器相同的方式启动服务。
注意:客户端在连接到服务器后会立即生成一个 shell,而不是在用户连接时。该 shell 会在后台持续运行。如果连接后发现终端状态不佳,请运行 stty sane。如果 shell 本身无响应,请在客户端机器上通过 PID 杀死它——客户端会在 10 秒内自动重新连接并生成一个新 shell。
要从远程机器操作(不通过 SSH 转发服务器 socket),请使用用户模式。在服务器上,向服务器配置添加 user_key_dir:
# cat /etc/bepr/server.conf
bind = 0.0.0.0:443
key_dir = /etc/bepr/client-keys
user_key_dir = /etc/bepr/user-keys
tls_cert = /etc/bepr/tls/cert.pem
tls_key = /etc/bepr/tls/privkey.pem
将用户的公钥复制到服务器:
/etc/bepr/user-keys/aperocky.pub -> 用户 ID aperocky
在用户机器上,创建用户配置:
# cat ~/.config/bepr/user.conf
server = wss://server.example/bepr/user/aperocky
private_key_path = ~/.ssh/aperocky_user_ed25519
bepr list 和 bepr connect 会自动使用此配置,无需额外参数。你的命令会从服务器直接桥接到客户端主机。
可以直接使用命令和参数手动运行 bepr 二进制文件,无需服务和打包:
./bepr server --config $服务器配置路径
./bepr client --config $客户端配置路径
./bepr connect --socket $socket文件路径 $目标