SSH 端口转发实战:三种隧道让远程运维不再难

举报
yd_227985793 发表于 2026/10/27 12:10:41 2026/10/27
【摘要】 远程运维时内网服务连不上、本地服务想给外部看,不用买公网 IP 也不用搭 VPN,SSH 自带的三种端口转发就能解决:本地转发 -L 把远程服务拉到本地,远程转发 -R 把本地服务推出去,动态转发 -D 一条命令变成 SOCKS 代理。本文用真实场景讲清三种隧道的命令写法与适用边界,并附后台运行、心跳保活、autossh 断线自愈等实用细节。

做远程运维的同学多少都遇到过这样的场景:服务器上跑着一个 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 加密保证。掌握这三种隧道,大部分临时性的网络打通需求都能就地解决,比走流程申请策略变更、部署专用工具快得多。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。