Skip to content

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 连接配置简化🟡 可读

详细时序图

三种端口转发

类型命令场景口诀
本地转发 -Lssh -L 3306:127.0.0.1:3306 root@118.89.53.75在本地访问云的数据库Local = 端口开在 本地,访问远程
远程转发 -Rssh -R 1080:127.0.0.1:7897 root@118.89.53.75让云用你的代理Remote = 端口开在 远程,访问本地
动态转发 -Dssh -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.75

macOS 浏览器设置 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 内置心跳
-ffork 到后台运行(非阻塞的关键)
-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 查看