Appearance
SSH 必知必会
命令速查
| 命令 | 作用 |
|---|---|
ssh-keygen -t ed25519 -C "备注" | 生成密钥对 |
ssh-copy-id user@host | 一键把公钥复制到服务器 |
ssh -i key_file user@host | 指定私钥连接 |
ssh -L 本地:目标IP:目标端口 user@跳板机 | 本地端口转发 |
ssh -R 远程:本地IP:本地端口 user@服务器 | 反向/远程端口转发 |
ssh -D 本地端口 user@服务器 | SOCKS 代理 |
ssh-keygen -R hostname | 清除已知主机记录 |
ssh-add -l | 查看已加载的密钥 |
SSH 工作流程
~/.ssh 目录文件详解
| 文件 | 用在哪 | 作用 | 可以公开? |
|---|---|---|---|
id_ed25519 | 客户端 | 你的私钥,证明"我是我" | ❌ 绝对不行 |
id_ed25519.pub | 客户端 | 你的公钥,放到别人的 authorized_keys | ✅ 可以 |
authorized_keys | 服务端 | 存放允许登录的公钥 | 🟡 可读但不建议公开 |
known_hosts | 客户端 | 记录服务器指纹,防中间人攻击 | 🟡 可读 |
config | 客户端 | SSH 连接配置简化 | 🟡 可读 |
详细时序图
三种端口转发
| 类型 | 命令 | 场景 | 口诀 |
|---|---|---|---|
本地转发 -L | ssh -L 3306:127.0.0.1:3306 root@118.89.53.75 | 在本地访问云的数据库 | Local = 端口开在 本地,访问远程 |
远程转发 -R | ssh -R 1080:127.0.0.1:7897 root@118.89.53.75 | 让云用你的代理 | Remote = 端口开在 远程,访问本地 |
动态转发 -D | ssh -D 1080 root@118.89.53.75 | 把云当代理 | Dynamic = 动态代理,访问 任意 |
本地转发 -L
让本地端口 → 访问远程内网服务
举例1:访问云服务器内网数据库
bash
# 在 macOS 上执行
ssh -L 3306:127.0.0.1:3306 root@118.89.53.75在 macOS 上连接 localhost:3306,实际访问的是云服务器上的 MySQL
举例2:通过云访问云背后的内网
bash
# 云服务器能访问 10.0.0.5 的内网服务
ssh -L 8080:10.0.0.5:80 root@118.89.53.75远程转发 -R
让远程端口 → 访问本地服务
举例1:让云服务器用你的代理
bash
# 在 macOS 上执行
ssh -R 1080:127.0.0.1:7897 root@118.89.53.75在云服务器上设置 export ALL_PROXY=socks5://127.0.0.1:1080,云服务器的请求通过 SSH 隧道 → macOS 代理 → Google
举例2:让别人访问你的本地开发服务
bash
# 在 macOS 上执行
ssh -R 8080:127.0.0.1:3000 root@118.89.53.75访问 http://118.89.53.75:8080,实际访问的是你 macOS 上跑的 localhost:3000
动态转发 -D
把服务器当 SOCKS 代理
举例1:把云服务器当代理
bash
# 在 macOS 上执行
ssh -D 1080 root@118.89.53.75macOS 浏览器设置 SOCKS 代理 127.0.0.1:1080,所有请求通过云服务器出去,云服务器能访问什么,你就能访问什么
SSH 反向隧道
从 macOS 建立反向隧道到云
bash
ssh -R 1080:127.0.0.1:7897 root@101.33.234.24 -N这样云服务器的 127.0.0.1:1080 就会转发到 macOS 的 127.0.0.1:7890
在云服务器上配置代理,并测试代理连接
bash
# 1、检查 1080 端口是否有服务监听
netstat -tlnp | grep 1080
# 或
ss -tlnp | grep 1080
# 2、测试 SOCKS5 代理是否工作
curl -x socks5://127.0.0.1:1080 -I https://www.google.com通过 .bashrc 开关代理
bash
# 添加代理函数,方便开关
vpn() {
export http_proxy=socks5://127.0.0.1:1080
export https_proxy=socks5://127.0.0.1:1080
export ALL_PROXY=socks5://127.0.0.1:1080
echo "Proxy ON"
}
vpn-unset() {
unset http_proxy https_proxy ALL_PROXY
echo "Proxy OFF"
}SSH 连接可能会断,可以用 autossh 自动重连,保持隧道稳定
bash
# macOS 上安装
brew install autossh
# 使用 autossh
autossh -M 0 -f -N -R 1080:127.0.0.1:7897 root@101.33.234.24拆解每个参数
| 参数 | 含义 |
|---|---|
autossh | 自动重连的 SSH 工具 |
-M 0 | 禁用 autossh 自己的监控端口,改用 SSH 内置心跳 |
-f | fork 到后台运行(非阻塞的关键) |
-N | 不执行远程命令,只做端口转发 |
-R 1080:127.0.0.1:7897 | 反向隧道:远程 1080 → 本地 7897 |
root@101.33.234.24 | 连接目标:云服务器 |
管理后台的 autossh
bash
# 查看运行中的 autossh
ps aux | grep autossh
# 杀掉所有 autossh
pkill autossh
# 查看 autossh 日志(如果配置了)
# autossh 会输出到 stderr,可以用 -o LogLevel=DEBUG 查看