// 安全研究 · 2025-03-28

SSH 进阶用法指南:从端口转发到跳板机

对大多数开发者来说,ssh user@host 可能就是日常工作的全部。但 SSH 的真正威力远不止于此——它是一套完整的安全网络工具集,能帮你解决内网穿透、安全访问、连接转发等棘手问题。本文带你系统掌握 SSH 的进阶用法。

一、为什么需要进阶 SSH 技能?

当你的工作场景从“直连一台公网服务器”扩展到“需要访问公司内网数据库”、“给客户临时演示本地开发环境”、“通过跳板机登录生产环境”时,SSH 的基础命令就不够用了。进阶 SSH 技能的核心价值在于:

  • 安全访问内网服务:无需额外工具,通过 SSH 隧道即可安全访问内网的数据库、Web 管理等服务
  • 绕过网络限制:通过转发功能,让受限网络中的设备也能被访问
  • 简化复杂连接:通过配置文件将多跳、多参数的连接简化为一个别名

二、SSH 配置文件:告别繁琐的命令行参数

每次连接都要输入 -p 2222 -i ~/.ssh/mykey 这样的参数?~/.ssh/config 文件能彻底解决这个问题。

基本配置示例

# ~/.ssh/config
Host myserver
    HostName 192.168.1.100
    User username
    Port 2222
    IdentityFile ~/.ssh/id_rsa
    ServerAliveInterval 60

配置完成后,只需执行 ssh myserver 即可完成连接。ServerAliveInterval 60 会每隔 60 秒发送一个保活信号,防止连接因超时被断开。

配置生效前提

配置文件权限需设为 600(chmod 600 ~/.ssh/config),否则 SSH 客户端会忽略该文件。

三、端口转发(隧道):SSH 的核心进阶功能

SSH 端口转发(也称 SSH 隧道)是在客户端和服务器之间建立加密连接,并通过这个连接转发网络数据,是解决网络访问问题的利器。

flowchart LR
    subgraph 本地端
        L[本地应用]
        LP[本地端口]
    end
    
    subgraph SSH隧道
        SSH[加密SSH连接]
    end
    
    subgraph 远程端
        RP[远程端口]
        R[目标服务]
    end
    
    L --> LP --> SSH --> RP --> R

三种转发模式总览

模式 命令参数 方向 典型场景
本地转发 -L 本地 → 远程 访问远程内网服务(如数据库)
远程转发 -R 远程 → 本地 暴露本地服务给外部访问
动态转发 -D 本地监听 通用流量转发通道

1. 本地端口转发(-L):访问远程内网服务

当你需要访问远程服务器所在内网中的某个服务(如 MySQL、Redis、Web 管理后台),但该服务不对外网开放时,本地转发最合适。

命令格式:

ssh -L [本地端口]:[目标地址]:[目标端口] user@ssh_server

实战示例:访问远程内网 MySQL

# 远程服务器 db-server 的 MySQL(3306) 只允许本地访问
# 通过 SSH 隧道将远程 3306 映射到本地 3307
ssh -L 3307:localhost:3306 user@db-server

# 现在本地可以直接连接
mysql -h 127.0.0.1 -P 3307 -u root -p

后台运行隧道:加 -fNT 参数让隧道在后台运行,不占用终端:

ssh -fNT -L 3307:localhost:3306 user@db-server
# -f: 后台运行  -N: 不执行远程命令  -T: 不分配终端

2. 远程端口转发(-R):暴露本地服务到公网

当你需要让外部用户访问你本地开发环境(如给客户演示、调试 Webhook)时,远程转发通过一台有公网 IP 的服务器做中转,将本地端口映射到公网服务器的某个端口上。

命令格式:

ssh -R [远程端口]:[本地地址]:[本地端口] user@public_server

实战示例:暴露本地 Web 应用

# 本地运行在 3000 端口,通过公网服务器暴露到 8080 端口
ssh -R 8080:localhost:3000 user@your-vps.com

# 外部用户访问 http://your-vps.com:8080 即可看到本地应用

注意:远程转发默认只允许服务器本机访问该端口。如需对外开放,需在服务器 sshd_config 中设置 GatewayPorts yes。

3. 动态端口转发(-D):搭建通用转发通道

动态转发创建一个本地的通用转发通道,支持任意目标地址,适合“所有流量走 SSH”的场景。

命令格式:

ssh -D [本地端口] user@ssh_server

实战示例:

# 在本地 1080 端口启动转发通道
ssh -D 1080 user@remote-server

# 配置浏览器或系统网络设置:127.0.0.1:1080
# 或通过命令行使用
curl --socks5 127.0.0.1:1080 http://example.com

在 Linux 下启动 Chrome 走此通道:google-chrome --proxy-server="socks5://127.0.0.1:8765"

四、连接跳转(Jump Host):穿透跳板机

在企业网络环境中,通常无法直接访问生产服务器,必须先登录一个“跳板机”(Jump Host/Bastion Host)。SSH 提供了优雅的解决方案。

-J 参数:一步直达

OpenSSH 7.3 及以上版本支持 -J 参数,实现“一跳直达”:

# 通过跳板机 jump.example.com 访问目标机 target.example.com
ssh -J userB@jump.example.com userA@target.example.com

配置文件方式(推荐)

将跳转逻辑写入 ~/.ssh/config,日常使用更加方便:

Host jumpbox
    HostName jump.example.com
    User userB

Host target
    HostName target.example.com
    User userA
    ProxyJump jumpbox

配置后,只需 ssh target 即可自动通过跳板机连接目标服务器。

flowchart LR
    A[本地电脑] -->|SSH| B[跳板机<br>jump.example.com]
    B -->|SSH| C[目标服务器<br>target.example.com]
    
    style A fill:#e1f5fe
    style B fill:#fff3e0
    style C fill:#e8f5e9

五、保持连接活跃与连接复用

防止连接超时

网络不稳定或长时间无操作时,SSH 连接容易被断开。在 ~/.ssh/config 中设置全局保活参数:

Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3

这会每隔 60 秒发送一次心跳包,连续 3 次无响应则断开连接。

连接复用

每次 SSH 连接都需要重新握手认证,比较耗时。通过连接复用,同一台服务器的后续连接可以复用已有连接:

# ~/.ssh/config
Host *
    ControlMaster auto
    ControlPath ~/.ssh/sockets/%r@%h:%p
    ControlPersist 1h

首次连接后,1 小时内的后续连接基本秒开。

六、VS Code 远程开发中的 SSH 进阶配置

VS Code 的 Remote-SSH 插件本质上是调用系统的 SSH 客户端。因此,所有 ~/.ssh/config 中的配置都可以无缝生效。

只需在 ~/.ssh/config 中配置好跳板机和目标机,然后在 VS Code 中执行 Remote-SSH: Connect to Host... 并输入目标机的别名(如 target)即可。

强烈建议为本地→跳板机、跳板机→目标机都配置好 SSH 密钥认证,否则 VS Code 在连接过程中处理密码会非常麻烦。

七、安全最佳实践

  1. 密钥认证 + 禁用密码登录:生成 Ed25519 或 4096 位 RSA 密钥(ssh-keygen -t ed25519),用 ssh-copy-id 复制公钥,然后在 sshd_config 中设置 PasswordAuthentication no
  2. 限制转发权限:如果不需要端口转发,可在服务器 sshd_config 中设置 AllowTcpForwarding no;如果只需要本地转发,可设置为 AllowTcpForwarding local
  3. 密钥加口令保护:生成密钥时设置口令(passphrase),配合 ssh-agent 缓存,兼顾安全与便利

总结

SSH 不仅仅是远程登录工具,更是一套强大的网络访问和安全通信平台。掌握以下进阶技能,能让你在运维和开发中游刃有余:

技能 核心价值
~/.ssh/config 简化连接,统一管理
本地转发 (-L) 安全访问远程内网服务
远程转发 (-R) 将本地服务暴露到公网
动态转发 (-D) 通用流量转发通道
跳板机 (-J/ProxyJump) 透明穿透跳板机,直达目标
连接复用 + 保活 提升连接速度,避免超时断开

把 SSH 当作一个瑞士军刀来用,你会发现它能解决很多“网络不通”的难题。

原文 https://blog.csdn.net/2301_79518550/article/details/146297834