无公网出口的 VPS SSH 连接方案指南
无公网出口的 VPS SSH 连接方案指南
在云计算与私有云部署中,出于成本控制(如纯内网 NAT VPS)、网络环境限制(如校园网/公司内网/家庭宽带无公网 IP)或极致的安全考虑(不希望将 22 端口直接暴露在公网遭暴破),我们经常会遇到没有公网 IP(甚至没有公网出口)的 VPS。
针对这种场景,如何安全、高效地通过 SSH 远程连接并管理 VPS?本文为你盘点目前主流的五大解决方案,并提供详细的实施指南。
方案概览
| 方案分类 | 代表工具 / 技术 | 依赖条件 | 核心特点 |
|---|---|---|---|
| 即时终端共享 | sshx |
可访问 sshx.io 节点 |
开箱即用,0 配置,秒级生成 Web 共享终端 |
| 应用层 Web 终端 | ttyd + Cloudflare Tunnel |
免费 Cloudflare 账号 | 零客户端依赖,搭配身份认证打造持久化 Web Shell |
| 虚拟局域网 (SD-WAN) | Tailscale / ZeroTier / headscale | 控制平面的连接 | 体验最接近直连,设备自动组成 P2P 内网 |
| 反向穿透 (Reverse Proxy) | Frp / Rathole / SSH Reverse Tunnel | 一台带公网 IP 的中转机器 | 稳定、自建自由度高、传统穿透方案 |
| 边缘穿透 (Zero Trust) | Cloudflare Tunnel (cloudflared) |
免费 Cloudflare 账号 + 域名 | 安全性极高,无公网 IP 节点自动打通 Tunnel |
方案一:基于 WebRTC 的即时终端共享(sshx)
如果你需要最快速度连上
VPS,或者想要临时分享终端给他人协作调试,sshx
是目前最方便的轻量级无公网连接方案。
工作原理
sshx 是一个用 Rust
编写的开源轻量工具。运行后,它会自动建立与 sshx.io
官方中继节点的双向加密连接(基于 WebRTC /
WebSocket),并生成一个唯一的加密控制台网址。任何人在浏览器打开该网址即可直接控制终端,且支持多人协同操作。
实施步骤
第一步:下载并运行 sshx
在无公网 IP 的 VPS 上直接运行安装与启动脚本:
curl -sSf https://sshx.io/get | sh -s run运行后,控制台会立即输出类似如下的连接信息:
sshx v0.2.3
➜ Link: https://sshx.io/s/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
第二步:浏览器访问
复制控制台输出的链接到本地电脑或手机的浏览器中打开,即可立刻进入可交互的 Shell 界面。
第三步:作为后台持久化服务运行(可选)
如果你希望 sshx
能够常驻后台,在系统启动时自动建立链接,可以将其写成
init.d 或 systemd 服务:
# 下载二进制文件至系统目录
curl -sSf https://sshx.io/get | sh
mv sshx /usr/local/bin/创建 /etc/init.d/sshx 服务脚本:
#!/bin/sh
### BEGIN INIT INFO
# Provides: sshx
# Required-Start: $network $remote_fs
# Short-Description: sshx web terminal sharing
### END INIT INFO
SSHX_BIN="/usr/local/bin/sshx"
SSHX_PID="/var/run/sshx.pid"
LOG_FILE="/var/log/sshx.log"
start() {
echo "Starting sshx..."
if [ ! -f "$SSHX_PID" ] || ! kill -0 $(cat "$SSHX_PID") 2>/dev/null; then
$SSHX_BIN run > "$LOG_FILE" 2>&1 &
echo $! > "$SSHX_PID"
echo "sshx started. Check $LOG_FILE for the connection link."
fi
}
stop() {
echo "Stopping sshx..."
[ -f "$SSHX_PID" ] && kill $(cat "$SSHX_PID") 2>/dev/null && rm -f "$SSHX_PID"
}
case "$1" in
start) start ;;
stop) stop ;;
restart) stop; sleep 1; start ;;
*) echo "Usage: $0 {start|stop|restart}" ;;
esac赋予执行权限并启动:
chmod +x /etc/init.d/sshx
/etc/init.d/sshx start启动后查看 /var/log/sshx.log
即可获取远程访问的专属网址。
方案二:Web 终端 + Cloudflare 穿透(全自主掌控 Web Shell)
如果你希望拥有一个固定域名、支持长效密码认证的私有 Web
终端,将 ttyd 与 Cloudflare Tunnel
结合是更优雅的持久化方案。
工作原理
ttyd 在 VPS 本地将 Bash/Zsh 暴露为一个 Web
服务(如 127.0.0.1:7681),再利用
cloudflared 建立一条由内向外的加密隧道连接至
Cloudflare 边缘节点。
实施步骤
第一步:VPS 部署 ttyd
curl -L -o /usr/local/bin/ttyd https://github.com/tsl0922/ttyd/releases/latest/download/ttyd.x86_64
chmod +x /usr/local/bin/ttyd第二步:部署 Cloudflare Tunnel
curl -L -o /usr/local/bin/cloudflared https://github.com/cloudflare/cloudflared/releases/latest/download/cloudflared-linux-amd64
chmod +x /usr/local/bin/cloudflared
# 登录授权并创建隧道
cloudflared tunnel login
cloudflared tunnel create my-vps-tunnel
cloudflared tunnel route dns my-vps-tunnel ttyd.yourdomain.com第三步:编写统一后台管理脚本
(/etc/init.d/webterminal)
#!/bin/sh
### BEGIN INIT INFO
# Provides: webterminal
# Required-Start: $network $remote_fs $syslog
# Short-Description: Web Terminal with ttyd and cloudflared
### END INIT INFO
TTYD_BIN="/usr/local/bin/ttyd"
PORT="7681"
AUTH_USER="admin"
AUTH_PASS='your_password'
TUNNEL_NAME="my-vps-tunnel"
TTYD_PID="/var/run/ttyd.pid"
CF_PID="/var/run/cloudflared.pid"
start() {
echo "Starting Web Terminal Service..."
if [ ! -f "$TTYD_PID" ] || ! kill -0 $(cat "$TTYD_PID") 2>/dev/null; then
$TTYD_BIN -p $PORT -c "$AUTH_USER:$AUTH_PASS" -W bash > /dev/null 2>&1 &
echo $! > "$TTYD_PID"
fi
if [ ! -f "$CF_PID" ] || ! kill -0 $(cat "$CF_PID") 2>/dev/null; then
cloudflared tunnel run --url http://localhost:$PORT $TUNNEL_NAME > /dev/null 2>&1 &
echo $! > "$CF_PID"
fi
}
stop() {
echo "Stopping Service..."
[ -f "$CF_PID" ] && kill $(cat "$CF_PID") 2>/dev/null && rm -f "$CF_PID"
[ -f "$TTYD_PID" ] && kill $(cat "$TTYD_PID") 2>/dev/null && rm -f "$TTYD_PID"
}
case "$1" in
start) start ;;
stop) stop ;;
restart) stop; sleep 2; start ;;
*) echo "Usage: $0 {start|stop|restart}" ;;
esac给予权限并启动:
chmod +x /etc/init.d/webterminal
/etc/init.d/webterminal start直接在浏览器打开 https://ttyd.yourdomain.com
即可输入账号密码连接。
方案三:全局 overlay 虚拟网(Tailscale / ZeroTier)
如果你希望保留原汁原味的传统 SSH 终端体验(使用本地
Kitty、iTerm2、MobaXterm 等),且需要 SCP/SFTP
传输文件,Tailscale 是最佳选择。
工作原理
利用 WireGuard 加密协议建立内网 P2P 隧道。即使 VPS 无公网
IP,只要它能访问 Tailscale
控制节点,就能与你的本地电脑分配在同一个虚拟内网(如
100.x.y.z)。
实施步骤
- VPS 端安装:
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up点击控制台输出的链接,登录账号完成绑定。
- 本地连接:
本地电脑同样安装 Tailscale 并登录同一账号。查看 VPS 的虚拟
IP(如 100.115.92.10)后,在本地终端直接连接:
ssh root@100.115.92.10方案四:传统反向隧道 (Frp / SSH 反向代理)
如果你手里有另一台带有公网 IP 的中转 VPS,采用
Frp 是最经典的选择。
工作原理
无公网 IP 的内网 VPS(Frpc 客户端)主动向公网 VPS(Frps
服务端)建立长连接。当外界访问公网 VPS 的指定端口(如
2222)时,流量会被转发至内网 VPS 的 22
端口。
实施步骤
- 公网 VPS 配置
frps.toml:
bindPort = 7000启动服务:./frps -c ./frps.toml
- 无公网 VPS 配置
frpc.toml:
serverAddr = "你的公网VPS_IP"
serverPort = 7000
[[proxies]]
name = "vps-ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 2222启动客户端:./frpc -c ./frpc.toml
- 本地连接:
ssh -p 2222 root@你的公网VPS_IP方案五:Cloudflare Tunnel SSH 访问 (零信任原生 SSH)
如果你不想将 SSH 端口露在外网被暴力破解,可以使用 Cloudflare 原生的 SSH Over Cloudflare Tunnel 方案。
工作原理
VPS 仅保持与 Cloudflare 的 WebSocket 隧道,本地电脑安装
cloudflared 并将其配置为 SSH 的
ProxyCommand 建立连接。
实施步骤
- VPS 端配置
config.yml:
tunnel: my-ssh-tunnel
credentials-file: /root/.cloudflared/xxxx.json
ingress:
- hostname: ssh.yourdomain.com
service: ssh://localhost:22
- service: http_status:404启动:cloudflared tunnel run my-ssh-tunnel
- 本地电脑配置
~/.ssh/config:
Host my-vps
HostName ssh.yourdomain.com
User root
ProxyCommand /usr/local/bin/cloudflared access ssh --hostname %h
- 本地直接连入:
ssh my-vps总结与选型建议
- 追求极致快速 / 临时共享调试:首选 方案一(sshx)。不需要域名和账号配置,一行命令生成链接,即开即用。
- 需要私有持久 Web 终端:推荐 方案二(ttyd + Cloudflare)。具备身份验证,适合从任何设备的浏览器随时登录。
- 日常运维 / 多节点管理 / SFTP 文件传输:推荐 方案三(Tailscale)。构建无感虚拟内网,体验与公网 IP 无异。
- 自建可控 / 已有公网中转机:推荐 方案四(Frp)。传统成熟,适合批量配置穿透。
- 企业级安全 / 零信任防护:推荐 方案五(Cloudflare Access SSH)。收拢所有入站端口,彻底规避暴露面。
| 本文由 BOSH 的博客助手 HerMes 整理 🛠️ |
原文链接:[本地上传]