SSH 隧道与内网穿透实战

作者:Yolo 发布时间: 2026-05-16 阅读量:16

SSH 隧道与内网穿透实战

很多内网服务无法直接从外部访问,SSH 隧道是最简单可靠的解决方式之一。不需要额外工具,只要一台有公网 IP 的跳板机就够了。


一、SSH 为什么能做隧道

SSH 本身是一套加密通信协议。除了远程登录,它还支持端口转发,把网络流量通过加密隧道传输。三种模式覆盖了绝大多数穿透场景。

二、本地转发(-L)

场景:你在公司内网,能访问一台跳板机 A,但不能直接连数据库服务器 B。A 可以访问 B。

原理:在 A 上监听一个本地端口,把流量通过 SSH 加密隧道转发到 B。

[你] → A:本地端口 → SSH隧道 → B:目标端口

命令

# 在跳板机 A 上执行
ssh -f -N -L 127.0.0.1:3306:B主机IP:3306 root@B主机

参数说明

参数作用
-f后台运行
-N不执行远程命令,只做转发
-L本地转发格式:本地地址:本地端口:目标主机:目标端口

之后访问 A 的 127.0.0.1:3306,实际上就是在访问 B 的数据库。

注意:默认只监听 127.0.0.1。想让局域网其他机器也能用,加 -g 参数绑定到 0.0.0.0

ssh -g -f -N -L 0.0.0.0:3306:B主机IP:3306 root@B主机

三、远程转发(-R)

场景:你在家里跑了个服务,但没有公网 IP。你有一台云服务器 A(有公网 IP),家庭电脑 B 能访问互联网。你想让外部用户通过 A 访问 B 上的服务。

原理:在 B 上执行 SSH 命令连到 A,让 A 监听一个端口,流量反向穿透回 B。

[外部用户] → A:公网端口 → SSH隧道 → B:本地端口

命令

# 在家庭电脑 B 上执行
autossh -M 10000 -f -N -R A公网IP:8080:127.0.0.1:3000 root@A主机

关键问题:远程转发默认只在 A 的 127.0.0.1 监听。要让别人能访问,需要修改 A 的 SSH 配置:

# 在 A 上编辑 /etc/ssh/sshd_config
GatewayPorts yes

# 重启 SSH
systemctl restart sshd

⚠️ 安全提醒GatewayPorts yes 会把转发端口暴露在公网,务必配合防火墙或只监听特定 IP。


四、动态转发(-D)

场景:你想让某台机器的所有流量都走跳板机,或者访问一个子网里的多台机器。

原理:在本地开一个 SOCKS 代理端口,所有经过这个端口的流量都通过 SSH 隧道转发,由跳板机决定最终去向。

ssh -f -N -D 1080 root@跳板机

然后在浏览器或系统代理设置里配置 SOCKS5 127.0.0.1:1080。适合临时翻墙或访问受限网络。


五、用 AutoSSH 保持隧道稳定

SSH 隧道最大的问题是不稳定:网络波动、IP 变化、超时断开,都会导致隧道失效。

AutoSSH 解决了这个问题——它会自动检测隧道状态,断开后立即重建。

安装

wget https://www.harding.motd.ca/autossh/autossh-1.4g.tgz
tar zxvf autossh-1.4g.tgz
cd autossh-1.4g
./configure && make

# 拷贝到 PATH
cp autossh /usr/local/bin/

使用

autossh -M 10000 -f -N -R 8080:127.0.0.1:3000 root@公网主机
参数作用
-M 10000监控端口,AutoSSH 用它检测连接状态
-f后台运行(需先配置公钥免密登录)
-N不执行远程命令
-R远程转发

必须配置公钥登录,因为 -f 后台模式下不会提示输入密码。

验证稳定性

ps aux | grep autossh

故意杀掉 ssh 进程,AutoSSH 会秒级重启一个新进程,隧道不断。


六、实际建议

  1. 能用本地转发就别用远程转发,远程转发对服务器配置有要求,安全隐患更大
  2. 公网跳板机务必关闭密码登录,只用密钥认证,改默认 22 端口
  3. 防火墙只开放必要端口,不要 GatewayPorts yes 了就不设防
  4. 重要服务用 AutoSSH + systemd 守护,保证开机自启、崩溃重启
  5. 长期隧道建议用 frp/ngrok 替代,SSH 隧道适合临时或轻量场景

总结

类型命令典型场景
本地转发 -Lssh -L 本地端口:目标主机:目标端口 跳板机访问内网数据库、Redis
远程转发 -Rssh -R 公网端口:本地主机:本地端口 公网服务器把家庭服务暴露到公网
动态转发 -Dssh -D 本地代理端口 跳板机SOCKS 代理、访问子网

SSH 隧道胜在零配置、随处可用,几乎所有 Linux 服务器自带 SSH,不需要额外安装软件。理解这三种转发模式,大部分内网穿透需求都能搞定。

整理自腾讯云社区文章,有删减和补充 🐾