SSH 隙道完全指南:本地转发、远程转发与动态代理的原理与实战

SSH 隙道完全指南:本地转发、远程转发与动态代理的原理与实战
什么是 SSH 隧道?
SSH 隧道(SSH Tunnel)是一种利用 SSH 协议将任意 TCP 流量加密转发的技术。简单来说,它在客户端与服务器之间建立一条加密通道,把本地端口的数据"穿透"到远端目标,从而实现安全访问内网服务、绕过防火墙限制等目的。
三种核心模式
1. 本地端口转发(Local Port Forwarding)
命令格式:ssh -L [本地地址:]本地端口:目标主机:目标端口 跳板机
最常见的场景是通过跳板机访问内网数据库。例如,公司数据库在内网 192.168.1.100:3306,只有跳板机 bastion.example.com 能访问:
ssh -L 13306:192.168.1.100:3306 user@bastion.example.com
执行后,本地访问 127.0.0.1:13306 就等同于访问内网 192.168.1.100:3306。数据流方向:本地 → SSH 隧道 → 跳板机 → 目标主机。
2. 远程端口转发(Remote Port Forwarding)
命令格式:ssh -R [远端地址:]远端端口:目标主机:目标端口 远端服务器
这种模式把本地服务"暴露"到公网服务器,常用于内网穿透。例如,本地开发了一个 Web 服务在 :8080,想让外网朋友临时访问:
ssh -R 0.0.0.0:9090:localhost:8080 user@public-server.com
外网访问 public-server.com:9090 即可到达本地的 8080 端口。数据流方向:远端服务器 → SSH 隧道 → 本地机器。
3. 动态端口转发(Dynamic Port Forwarding / SOCKS 代理)
命令格式:ssh -D [本地地址:]本地端口 远端服务器
这种模式在本地创建一个 SOCKS 5 代理,所有通过代理的流量都经由 SSH 隧道转发,适合需要访问整个内网或翻墙场景:
ssh -D 1080 user@gateway.example.com
配置浏览器或系统使用 SOCKS5 代理 127.0.0.1:1080,即可通过远端服务器访问互联网。
持久化与自动重连
直接运行的 SSH 隧道会因网络中断而断开。生产环境推荐以下方案:
- -f -N 参数:
-f后台运行,-N不执行远程命令,只建立隧道 - ServerAliveInterval:在
~/.ssh/config中配置心跳,防止 NAT 超时断连 - AutoSSH:自动重连工具,当隧道意外断开时自动恢复
推荐的 ~/.ssh/config 配置:
Host db-tunnel
HostName bastion.example.com
User ubuntu
LocalForward 13306 192.168.1.100:3306
ServerAliveInterval 60
ServerAliveCountMax 3
ExitOnForwardFailure yes
安全注意事项
- 远程转发默认只监听 127.0.0.1,若要绑定 0.0.0.0(公网),需要服务器
sshd_config中设置GatewayPorts yes - 使用 PKI 密钥认证替代密码,提升安全性
- 定期审计
authorized_keys,及时清理不用的公钥 - 通过
AllowTcpForwarding在服务器端严格控制隧道权限
总结
SSH 隧道是每个开发者和运维工程师的必备技能。本地转发解决"我访问远端",远程转发解决"远端访问我",动态转发构建灵活代理。理解了这三种模式,从数据库远程调试到内网穿透,都可以轻松应对。