SSH隧道全流程:从本地端口转发到远程跳板,一篇给你讲透!
说实话,我第一次接触SSH隧道的时候,脑子里全是问号,什么本地转发、远程转发、动态转发……听着就头大对吧?但后来用着用着才发现,这玩意儿简直是运维和开发者的救命稻草!今天我就用最接地气的方式,把SSH隧道全流程给你从头到尾捋一遍,保证你看完就能上手。

SSH隧道到底是个啥?为啥要用它?
SSH隧道就是通过一条已经加密的SSH连接,把其他网络流量"塞"进去传,你想想啊,公司内网的数据库只允许跳板机访问,你在家想连怎么办?直接连肯定连不上嘛,但如果你先SSH到跳板机,再让跳板机帮你转发流量到数据库,这不就通了?
我当时第一次配通的时候,那感觉,哇,真香!
SSH隧道全流程之本地端口转发
这是最常用的一种,命令长这样:
ssh -L 本地端口:目标地址:目标端口 用户@跳板机
举个例子哈,我想通过跳板机 jump.example.com 访问内网数据库 0.0.5:3306,本地开个 13306 端口:
ssh -L 13306:10.0.0.5:3306 user@jump.example.com
然后我本地连 0.0.1:13306 就等于连上了那台数据库,是不是很神奇?
这里的关键点在于:流量走向是 本地→跳板机→目标,整个SSH隧道全流程中,本地转发是最直观的,因为你只需要在本地发起连接就行了。
远程端口转发,方向反过来
有时候情况反过来,比如你想让外网的人访问你内网的机器,这时候就得用 -R:
ssh -R 远程端口:目标地址:目标端口 用户@远程服务器
打个比方,你本地跑了个Web服务在 8080,想让公网服务器 public.com 的 9090 端口转发过来:
ssh -R 9090:localhost:8080 user@public.com
这样别人访问 public.com:9090 就能看到你本地的服务了,不过这中间还得注意 GatewayPorts 配置,不然默认只绑定 0.0.1,外网还是访问不了,我第一次踩这个坑的时候,调试了半个小时才反应过来,哎。
动态转发,也就是常说的SOCKS代理
这个更猛,一条命令搞定全局代理:
ssh -D 1080 user@跳板机
然后你浏览器设置SOCKS5代理 0.0.1:1080,所有流量都走跳板机出去了。SSH隧道全流程里,动态转发是最灵活的一种,因为它不限定目标端口,爱连啥连啥。
完整流程总结与实用参数
一个完整的SSH隧道全流程,其实就这几步:
- 建立SSH连接(认证方式可以用密码或密钥)
- 指定转发类型(
-L/-R/-D) - 保持连接稳定(加
-N不执行远程命令,-f后台运行) - 加上保活参数(
ServerAliveInterval=60防止断线) - 验证隧道是否生效(
netstat或直接访问测试)
我常用的组合是:
ssh -N -f -L 13306:10.0.0.5:3306 -o ServerAliveInterval=60 user@jump.example.com
这样一条命令下去,后台默默帮你干活,稳得很。
几个容易踩的坑
- 端口被占用?换个本地端口就行。
- 权限不够?低于1024的端口需要root。
- 连接老断?加上保活参数,或者用
autossh。 - 转发不生效?检查
sshd_config里的AllowTcpForwarding。
说真的,SSH隧道全流程掌握之后,你会发现很多网络限制都不是事儿了,不管是调试内网服务、临时穿透、还是做个加密代理,SSH隧道都能帮你搞定,希望这篇能帮你少走点弯路,有啥问题欢迎留言交流哈!