能用 ssh -L 就别折腾其他工具,5分钟内可通;目标地址须为跳板机能访问的地址,同机写localhost,跨机需确认跳板机可连且服务监听0.0.0.0;后台运行必加-fN,绑定端口注意权限与监听配置。

能用 ssh -L 就别折腾其他工具——只要跳板机可 SSH 登录、且能访问目标服务,5 分钟内端口就能通,不需要改服务器配置、不依赖 frp/natapp 等额外组件。
ssh -L 本地转发命令里目标地址怎么写才对
最常见失败原因:-L 后面的目标主机地址不是「跳板机能访问的地址」,而是你本机视角下的地址。
- 如果 MySQL 在跳板机本机运行,目标必须写
localhost或127.0.0.1,不能写跳板机的公网 IP 或内网 IP(比如192.168.1.10) - 如果服务在另一台内网机器(如
192.168.1.100),得确认跳板机能ping 192.168.1.100,且该服务监听的是0.0.0.0:3306或192.168.1.100:3306,而不是仅127.0.0.1:3306 - 命令格式是:
ssh -L 3306:目标主机:3306 user@jump-host,其中「目标主机」对跳板机而言,不是对你本机而言
后台常驻运行必须加 -fN,否则一关终端就断
只写 ssh -L 会卡在远程 shell 里;不加参数直接退出,隧道进程也跟着消失。
-
-f:让 SSH fork 到后台,释放终端 -
-N:明确禁止执行远程命令,只做端口转发 -
-T:可选,禁用伪终端,更干净(尤其适合脚本或 systemd 管理) - 正确示例:
ssh -fNT -L 8080:web.internal:80 user@jump-host
本地端口被占或权限不足时怎么处理
Linux 下绑定 1–1023 端口需要 root 权限;普通用户默认只能绑 ≥1024 的端口。
- 报错
bind: Permission denied?换端口,比如用8080代替80 - 报错
Address already in use?先查谁占着:lsof -i :3306或ss -tlnp | grep 3306,再 kill 或换端口 - 想让同事也能访问你本地开的这个端口(比如连你机器的
8080)?得写成-L *:8080:target:80,但前提是跳板机的/etc/ssh/sshd_config里有GatewayPorts clientspecified或yes,且你有权改——一般不建议,安全风险高
真正容易被忽略的关键点:目标服务监听地址
很多内网服务(尤其是 Docker 容器、Python Flask 开发服务器、Node.js 服务)默认只监听 127.0.0.1,跳板机从外部 IP 访问不到。
必须确认它是监听 0.0.0.0 或对应内网 IP(如 192.168.1.100)。否则 ssh -L 再对也转不过去——这比命令写错更难排查,因为连接不报错,只是没响应。


















