Featured image of post 无公网出口的 VPS SSH 连接方案指南

无公网出口的 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 上直接运行安装与启动脚本:

1
curl -sSf https://sshx.io/get | sh -s run

运行后,控制台会立即输出类似如下的连接信息:

1
2
  sshx v0.2.3
  ➜  Link:  https://sshx.io/s/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

第二步:浏览器访问

复制控制台输出的链接到本地电脑或手机的浏览器中打开,即可立刻进入可交互的 Shell 界面。

第三步:作为后台持久化服务运行(可选)

如果你希望 sshx 能够常驻后台,在系统启动时自动建立链接,可以将其写成 init.dsystemd 服务:

1
2
3
# 下载二进制文件至系统目录
curl -sSf https://sshx.io/get | sh
mv sshx /usr/local/bin/

创建 /etc/init.d/sshx 服务脚本:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#!/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

赋予执行权限并启动:

1
2
chmod +x /etc/init.d/sshx
/etc/init.d/sshx start

启动后查看 /var/log/sshx.log 即可获取远程访问的专属网址。

方案二:Web 终端 + Cloudflare 穿透(全自主掌控 Web Shell)

如果你希望拥有一个固定域名、支持长效密码认证的私有 Web 终端,将 ttydCloudflare Tunnel 结合是更优雅的持久化方案。

工作原理

ttyd 在 VPS 本地将 Bash/Zsh 暴露为一个 Web 服务(如 127.0.0.1:7681),再利用 cloudflared 建立一条由内向外的加密隧道连接至 Cloudflare 边缘节点。

实施步骤

第一步:VPS 部署 ttyd

1
2
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

1
2
3
4
5
6
7
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)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#!/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

给予权限并启动:

1
2
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)。

实施步骤

  1. VPS 端安装
1
2
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

点击控制台输出的链接,登录账号完成绑定。

  1. 本地连接

本地电脑同样安装 Tailscale 并登录同一账号。查看 VPS 的虚拟 IP(如 100.115.92.10)后,在本地终端直接连接:

1
ssh root@100.115.92.10

方案四:传统反向隧道 (Frp / SSH 反向代理)

如果你手里有另一台带有公网 IP 的中转 VPS,采用 Frp 是最经典的选择。

工作原理

无公网 IP 的内网 VPS(Frpc 客户端)主动向公网 VPS(Frps 服务端)建立长连接。当外界访问公网 VPS 的指定端口(如 2222)时,流量会被转发至内网 VPS 的 22 端口。

实施步骤

  1. 公网 VPS 配置 frps.toml
1
bindPort = 7000

启动服务:./frps -c ./frps.toml

  1. 无公网 VPS 配置 frpc.toml
1
2
3
4
5
6
7
8
9
serverAddr = "你的公网VPS_IP"
serverPort = 7000

[[proxies]]
name = "vps-ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 2222

启动客户端:./frpc -c ./frpc.toml

  1. 本地连接
1
ssh -p 2222 root@你的公网VPS_IP

方案五:Cloudflare Tunnel SSH 访问 (零信任原生 SSH)

如果你不想将 SSH 端口露在外网被暴力破解,可以使用 Cloudflare 原生的 SSH Over Cloudflare Tunnel 方案。

工作原理

VPS 仅保持与 Cloudflare 的 WebSocket 隧道,本地电脑安装 cloudflared 并将其配置为 SSH 的 ProxyCommand 建立连接。

实施步骤

  1. VPS 端配置 config.yml
1
2
3
4
5
6
7
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

  1. 本地电脑配置 ~/.ssh/config
1
2
3
4
Host my-vps
    HostName ssh.yourdomain.com
    User root
    ProxyCommand /usr/local/bin/cloudflared access ssh --hostname %h
  1. 本地直接连入
1
ssh my-vps

总结与选型建议

  1. 追求极致快速 / 临时共享调试:首选 方案一(sshx)。不需要域名和账号配置,一行命令生成链接,即开即用。
  2. 需要私有持久 Web 终端:推荐 方案二(ttyd + Cloudflare)。具备身份验证,适合从任何设备的浏览器随时登录。
  3. 日常运维 / 多节点管理 / SFTP 文件传输:推荐 方案三(Tailscale)。构建无感虚拟内网,体验与公网 IP 无异。
  4. 自建可控 / 已有公网中转机:推荐 方案四(Frp)。传统成熟,适合批量配置穿透。
  5. 企业级安全 / 零信任防护:推荐 方案五(Cloudflare Access SSH)。收拢所有入站端口,彻底规避暴露面。

本文由 BOSH 的博客助手 HerMes 整理 🔧

原文链接:[本地上传]

热爱生活 学无止境
使用 Hugo 构建
主题 StackJimmy 设计