基于 SSH 反向隧道的家庭实验室接入方案
概述
我们经常面临这样的需求:如何在公司或差旅环境中,安全地访问位于家庭内网的AI 训练机?
传统的 DDNS + 路由器端口映射方案暴露面过大,极易招致全网扫描。本文将分享一种 “隐形”架构方案:利用一台公网 VPS(或有公网 IP 的节点)作为跳板,通过 Autossh 建立反向隧道,并将所有流量限制在回环接口(Localhost)内,实现极高的安全性。
架构拓扑
[外部环境] --(SSH加密)--> [公网网关] --(SSH隧道/Localhost)--> [内网工作站]
(公司/咖啡厅) (Gateway) (Target)
- 隐蔽性: 网关对外不开放任何额外端口。
- 安全性: 内网工作站只监听本机流量,对局域网其他设备不可见。
步骤一:环境准备
假设我们有两台主机:
- Gateway (网关): 拥有公网 IP,运行 Linux,SSH 端口为
2222。 - Target (内网目标): 位于家庭 NAT 后,无公网 IP,用户名为
local_user。
在 Target 上安装必要软件:
sudo apt update
sudo apt install openssh-server autossh
步骤二:配置隧道专用凭证
为了实现开机自启和断线重连,我们需要一个无密码的 SSH 密钥专门用于建立隧道(并非用于登录 Shell)。
在 Target 上执行:
# 生成专用密钥,不设置密码
ssh-keygen -t ed25519 -f ~/.ssh/id_tunnel -N "" -C "autossh-tunnel"
# 将公钥上传至 Gateway
ssh-copy-id -i ~/.ssh/id_tunnel.pub -p 2222 gateway_user@gateway.example.com
步骤三:部署 Autossh 守护进程
我们使用 Systemd 来管理 Autossh,确保隧道稳如磐石。
在 Target 上创建服务文件:sudo vim /etc/systemd/system/autossh-tunnel.service
[Unit]
Description=AutoSSH Reverse Tunnel
After=network-online.target ssh.service
Wants=network-online.target
[Service]
User=local_user
Type=simple
# 核心参数解析:
# -M 0: 禁用 autossh 自身的监控端口(使用 SSH 原生保活)
# -N: 不执行远程命令
# -R 127.0.0.1:8888:localhost:22 :
# 关键!将 Gateway 的 8888 端口绑定在 127.0.0.1。
# 这意味着只有登录到 Gateway 本机的人才能访问此端口,公网无法扫描。
ExecStart=/usr/bin/autossh -M 0 -N \
-o "ServerAliveInterval 30" \
-o "ServerAliveCountMax 3" \
-o "ExitOnForwardFailure yes" \
-o "StrictHostKeyChecking no" \
-R 127.0.0.1:8888:localhost:22 \
-p 2222 \
-i /home/local_user/.ssh/id_tunnel \
gateway_user@gateway.example.com
Restart=always
RestartSec=10
[Install]
WantedBy=multi-user.target
启动并验证服务:
sudo systemctl enable --now autossh-tunnel.service
步骤四:连接与验证
现在,隧道已经建立。Target 的 SSH 端口已经投射到了 Gateway 的 127.0.0.1:8888。
连接方式:
- 在外部电脑,SSH 登录 Gateway。
- 在 Gateway 的 Shell 中,跳转到 Target:
ssh -p 8888 local_user@127.0.0.1
此时,你应当能成功登录内网工作站。
步骤五:安全加固
仅建立隧道是不够的,我们必须假设内网环境(如家庭 WiFi)可能是不安全的,或者有人可能攻破了路由器的防火墙。我们需要将 Target 变成一座“孤岛”。
1. 限制监听地址 (Ghost Mode)
修改 Target 的 /etc/ssh/sshd_config,使其不再监听 0.0.0.0,只监听回环地址。
# /etc/ssh/sshd_config
# 取消注释并修改 ListenAddress
ListenAddress 127.0.0.1
ListenAddress ::1
效果: 即使有人连入了你家的 WiFi,直接扫描你的电脑 IP,也会发现 22 端口是关闭的。SSH 服务只接受来自隧道(被系统视为本机流量 ::1)的连接。
2. 禁用密码登录
既然隧道已经打通,通过隧道暴力破解密码成为唯一的风险。彻底关闭它。
首先,确保你的日常使用密钥已经上传:
(在 Gateway 上执行)
ssh-copy-id -p 8888 local_user@127.0.0.1
然后,修改 Target 的 /etc/ssh/sshd_config:
AuthenticationMethods publickey
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
最后,重启 SSH 服务:sudo systemctl restart ssh。
总结
通过这套架构,我们实现了一个完美的“内网”节点:
- Gateway 端:只看到一个本地的监听端口,防火墙无需开放额外端口。
- Target 端:对局域网隐身,仅通过加密隧道与外界单线联系。
- 链路:利用 Autossh 保持长连接,无需担心家庭宽带 IP 变动。

浙公网安备 33010602011771号