ssh隧道提供三种端口转发:-l将本地端口流量经ssh加密转发至远程目标(如数据库),需注意绑定地址与端口占用;-r需服务端启用gatewayports yes,否则静默失败;-d创建socks5代理,需客户端正确配置。

Linux SSH 隧道是构建安全内部服务访问通道最直接、可靠的方式。它不依赖额外组件,复用已有的 SSH 服务和 22 端口,天然加密、认证严谨,且配置轻量——一条命令即可打通本地与内网服务之间的加密通路。
本地端口转发(-L):访问远程内网服务
这是最常用场景:你在本地想安全连接服务器上的 MySQL、Redis 或 Web 服务,而这些服务只监听 127.0.0.1 或内网地址,未对外暴露。
- 目标地址必须是「跳板机视角」可访问的地址:若数据库在远程服务器本机运行,填 127.0.0.1 或 localhost;若在同局域网另一台机器(如 192.168.1.100),需确认跳板机能连通该 IP 且服务监听 0.0.0.0:3306 而非仅 127.0.0.1
- 基础命令:
ssh -L 3306:127.0.0.1:3306 user@server-ip,执行后访问本地127.0.0.1:3306即等效于直连服务器上的 MySQL - 后台常驻运行加
-fN:例如ssh -fNL 3306:127.0.0.1:3306 user@server-ip,避免终端关闭导致隧道中断 - 绑定失败常见原因:本地端口被占用(
lsof -i :3306查看)、普通用户尝试绑定 1–1023 端口(换用 ≥1024 的端口,如 13306)
远程端口转发(-R):让外网临时访问本地服务
适合开发调试:你本地起了一个 Flask 或 Node.js 服务(如 8080),需要让同事或测试环境通过公网服务器访问它。
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 中间服务器必须开启
GatewayPorts yes(修改/etc/ssh/sshd_config并重启 sshd),否则无法将收到的请求转发给你的本地机器 - 命令示例:
ssh -fNTR 8080:localhost:8080 user@jump-server,表示“把 jump-server 的 8080 端口映射到我本机的 8080” - 若希望他人通过 jump-server 的任意 IP 访问(如
http://jump-server:8080),需加0.0.0.0:8080前缀,但前提是GatewayPorts设为yes或clientspecified - 加心跳保活:
-o ServerAliveInterval=30 -o ExitOnForwardFailure=yes,防止 NAT 超时断连或端口冲突时静默失败
动态端口转发(-D):SOCKS5 代理访问多内网资源
当你需要一次性访问多个不同协议、不同端口的内网资源(如 HTTP、HTTPS、SSH、数据库管理界面),动态转发比逐个配置 -L 更高效。
- 启动命令:
ssh -D 1080 user@server,会在本地开启 SOCKS5 代理服务(监听 127.0.0.1:1080) - 浏览器或工具配置 SOCKS5 代理指向
127.0.0.1:1080,所有流量经加密隧道由远程服务器代为发出 - 验证是否生效:
curl --socks5 127.0.0.1:1080 http://内网地址 - 注意:部分应用(如某些 GUI 数据库客户端)不支持 SOCKS 代理,此时仍需用 -L 显式映射端口
关键细节与避坑要点
很多隧道连不上,问题不在命令本身,而在服务监听配置或权限设置。
-
数据库服务必须监听 127.0.0.1 或 0.0.0.0:MySQL 的
bind-address = 127.0.0.1是安全的,也正符合隧道需求;若设为内网 IP(如 192.168.1.100),则只有该网段能连,跳板机可能无法中转 -
数据库账号 Host 字段需匹配:用
SELECT User,Host FROM mysql.user;检查,确保对应用户 Host 是'%'或'localhost',而非具体 IP - 防火墙只需放行 22 端口:其他服务端口(如 3306、6379)完全无需开放公网,隧道内走加密通道即可
-
密钥认证优于密码:生成 RSA 密钥对,禁用密码登录(
PasswordAuthentication no),提升长期使用的安全性










