SSH 端口转发实战:三种隧道让远程运维不再难
做远程运维的同学多少都遇到过这样的场景:服务器上跑着一个 Web 服务或数据库,但它只监听内网地址,办公电脑死活连不上;或者反过来,本地开发的服务想让客户先看看效果,对方却不在同一张网里。这类问题不用专门买公网 IP,也不用搭 VPN,SSH 自带的端口转发就能解决,一个命令的事。
一、本地转发:把远程的服务"拉"到本地
这是用得最多的一种。假设跳板机 10.0.0.5 能访问内网数据库 10.0.0.20 的 3306 端口,而你的电脑连不上那台数据库,只需要一条命令:
ssh -L 13306:10.0.0.20:3306 user@10.0.0.5
执行后,本地 13306 端口的数据会被加密送到跳板机,再由它转发给数据库。之后在本机用 127.0.0.1:13306 就能直连内网 MySQL,跟连本机服务一样。参数三个数字很直观:本地端口:目标地址:目标端口。在 Navicat 这类 GUI 工具里填 127.0.0.1:13306 即可。
二、远程转发:把本地服务"推"出去
方向反过来。本地起了一个演示服务(8000 端口),想让能访问服务器 20.0.0.8 的同事看到:
ssh -R 18000:127.0.0.1:8000 user@20.0.0.8
这样访问 20.0.0.8:18000 的流量会穿过 SSH 隧道回到你本地的 8000 端口。注意两点:一是服务器默认只绑定 127.0.0.1,其他人访问不到,需要在服务器 sshd 配置里把 GatewayPorts 设为 yes 才能对外监听;二是端口别撞车,服务器上 18000 必须是空闲的。
三、动态转发:一条命令变成 SOCKS 代理
ssh -D 1080 user@jump.example.com
这条命令不指定具体目标,SSH 会在本地 1080 端口起一个 SOCKS5 代理,浏览器或命令行把代理指向它,流量统一从跳板机出去。临时排查"只有内网环境才能复现"的问题时特别好用,用完 Ctrl+C 关掉,不留痕迹。
几个实用细节
1. 后台运行:加 -N 参数只转发端口不执行命令,配合 -f 放到后台,终端不会被占住:ssh -fNL 13306:10.0.0.20:3306 user@10.0.0.5。
2. 保持心跳:长连接建议加上 -o ServerAliveInterval=60,每分钟发一次心跳,防止 NAT 超时把隧道悄悄掐断。
3. 断线自愈:需要长期驻留的隧道可以用 autossh 包一层:autossh -M 0 -o ServerAliveInterval=60 -o ServerAliveCountMax=3 ...,断了会自动重连。
4. Windows 同样可用:PowerShell 自带 OpenSSH 客户端,这些命令原样能跑;习惯图形界面的也可以在 Xshell、Tabby 的会话属性里配置 Tunnel,原理完全相同。
端口转发的本质,是借一条已经打通的 SSH 连接"捎带"其他流量,不在防火墙上额外开口,安全性由 SSH 加密保证。掌握这三种隧道,大部分临时性的网络打通需求都能就地解决,比走流程申请策略变更、部署专用工具快得多。
- 点赞
- 收藏
- 关注作者
评论(0)