对大多数开发者来说,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 在连接过程中处理密码会非常麻烦。
七、安全最佳实践
- 密钥认证 + 禁用密码登录:生成 Ed25519 或 4096 位 RSA 密钥(
ssh-keygen -t ed25519),用ssh-copy-id复制公钥,然后在sshd_config中设置PasswordAuthentication no - 限制转发权限:如果不需要端口转发,可在服务器
sshd_config中设置AllowTcpForwarding no;如果只需要本地转发,可设置为AllowTcpForwarding local - 密钥加口令保护:生成密钥时设置口令(passphrase),配合
ssh-agent缓存,兼顾安全与便利
总结
SSH 不仅仅是远程登录工具,更是一套强大的网络访问和安全通信平台。掌握以下进阶技能,能让你在运维和开发中游刃有余:
| 技能 | 核心价值 |
|---|---|
~/.ssh/config |
简化连接,统一管理 |
本地转发 (-L) |
安全访问远程内网服务 |
远程转发 (-R) |
将本地服务暴露到公网 |
动态转发 (-D) |
通用流量转发通道 |
跳板机 (-J/ProxyJump) |
透明穿透跳板机,直达目标 |
| 连接复用 + 保活 | 提升连接速度,避免超时断开 |
把 SSH 当作一个瑞士军刀来用,你会发现它能解决很多“网络不通”的难题。
原文 https://blog.csdn.net/2301_79518550/article/details/146297834