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 会秒级重启一个新进程,隧道不断。
六、实际建议
- 能用本地转发就别用远程转发,远程转发对服务器配置有要求,安全隐患更大
- 公网跳板机务必关闭密码登录,只用密钥认证,改默认 22 端口
- 防火墙只开放必要端口,不要
GatewayPorts yes了就不设防 - 重要服务用 AutoSSH + systemd 守护,保证开机自启、崩溃重启
- 长期隧道建议用 frp/ngrok 替代,SSH 隧道适合临时或轻量场景
总结
| 类型 | 命令 | 典型场景 |
|---|---|---|
本地转发 -L | ssh -L 本地端口:目标主机:目标端口 跳板机 | 访问内网数据库、Redis |
远程转发 -R | ssh -R 公网端口:本地主机:本地端口 公网服务器 | 把家庭服务暴露到公网 |
动态转发 -D | ssh -D 本地代理端口 跳板机 | SOCKS 代理、访问子网 |
SSH 隧道胜在零配置、随处可用,几乎所有 Linux 服务器自带 SSH,不需要额外安装软件。理解这三种转发模式,大部分内网穿透需求都能搞定。
整理自腾讯云社区文章,有删减和补充 🐾