1. 先搞清楚:SSH 到底在做什么
• SSH(Secure Shell) 是远程登录与远程执行命令的通道,默认服务端端口为 22。
• 你需要关心两件事:
• 客户端:发起连接的一端(你的电脑)
• 服务端:提供 SSH 登录的一端(服务器/NAS/路由器等)
• 推荐的安全基线:
• 使用 密钥认证(Public Key Authentication)
• 禁用密码登录
• 禁用 root 直接登录(改用普通用户 + sudo)
• 尽量只对可信来源开放(防火墙/跳板机/内网)
2. SSH 密钥与算法类型:选什么更合适
SSH 的密钥是“一对”:私钥(private key) + 公钥(public key)
• 私钥:留在客户端,不要泄露,不要上传到服务器。
• 公钥:放到服务端(~/.ssh/authorized_keys)。
常见密钥类型(推荐顺序):
2. Ed25519(推荐)
• 安全性好、速度快、密钥短
• 大多数现代系统默认支持
3. ECDSA
• 兼容性不错,但历史上不同实现差异较多
4. RSA
• 兼容性最好,但建议至少 3072 或 4096 位
• 老旧系统可能只支持 RSA
建议:
• 新环境优先用:ed25519
• 需要兼容老设备/嵌入式:再考虑 rsa
3. 生成 SSH 密钥(客户端操作)
3.1 Linux / macOS
推荐生成 Ed25519:
ssh-keygen -t ed25519 -a 64 -C "your_email@example.com"说明:
• -a 64:KDF(Key Derivation Function)轮次更高,抗暴力破解更强(生成/加载会稍慢一点,通常可接受)
• 生成后默认文件:
• 私钥:~/.ssh/id_ed25519
• 公钥:~/.ssh/id_ed25519.pub
强烈建议:给私钥设置 passphrase(密码短语)。这不是“SSH 登录密码”,而是保护你本机私钥的第二道锁。
3.2 Windows(两种常见方式)
• Windows 10/11 内置 OpenSSH(推荐)
2. 打开 PowerShell
3. 执行:
ssh-keygen -t ed25519 -a 64 -C "your_email@example.com"4. 默认生成在:
• C:\Users\<你>\.ssh\
• PuTTY(历史遗留)
• 用 PuTTYgen 生成密钥
• 注意它的私钥格式(.ppk)与 OpenSSH 不同;需要时可导出 OpenSSH 格式
4. 把公钥装到服务器:三种方式
目标:让服务端的目标用户拥有你的公钥。
4.1 用 ssh-copy-id(最省事)
(前提:服务端允许密码登录一次,或你已有其他方式登录)
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server4.2 手动追加到 authorized_keys
在服务端(以目标用户身份):
mkdir -p ~/.ssh
chmod 700 ~/.ssh
cat >> ~/.ssh/authorized_keys
# 把本地 id_ed25519.pub 的内容粘贴进来,然后 Ctrl+D 结束
chmod 600 ~/.ssh/authorized_keys4.3 临时用密码登录后再配置(常见场景)
如果你现在只能密码登录:
2. 先 ssh user@server 登录
3. 按 4.2 配置 authorized_keys
4. 验证密钥登录 OK 后,再去禁用密码登录(下一节)
5. 服务端安全基线:强制密钥登录、禁用密码、禁用 root
以下以 Linux 的 OpenSSH 服务端为例(服务端配置文件通常是 /etc/ssh/sshd_config)。
5.1 修改 sshd_config
用 root 或 sudo 编辑:
sudo nano /etc/ssh/sshd_config建议配置(按需取用;不同发行版可能已有默认值):
# 禁止 root 直接登录(推荐)
PermitRootLogin no
# 禁用密码登录(核心)
PasswordAuthentication no
KbdInteractiveAuthentication no
# 明确启用公钥认证
PubkeyAuthentication yes
# 可选:只允许指定用户登录
# AllowUsers user1 user2
# 可选:禁止空密码
PermitEmptyPasswords no
# 可选:收紧认证尝试次数与超时
MaxAuthTries 3
LoginGraceTime 30注意事项:
• 有些系统使用 ChallengeResponseAuthentication 或 KbdInteractiveAuthentication,名字可能略有差异;以你系统实际配置项为准。
• 如果你在云服务器上操作,建议 先开一个第二终端保持登录,避免配置错误导致把自己锁在门外。
5.2 配置生效:校验并重启 sshd
先检查配置是否正确:
sudo sshd -t无输出通常表示 OK。然后重启服务(择其一):
sudo systemctl restart sshd或:
sudo systemctl restart ssh6. 客户端常用连接方式(含跳板/端口/别名)
6.1 基本连接
ssh user@server指定端口:
ssh -p 2222 user@server指定私钥:
ssh -i ~/.ssh/id_ed25519 user@server6.2 用 ~/.ssh/config 做“别名”和“默认参数”(强烈推荐)
在客户端编辑 ~/.ssh/config(Windows 也有同样路径:C:\Users\<你>\.ssh\config):
Host myserver
HostName example.com
User user
Port 22
IdentityFile ~/.ssh/id_ed25519
ServerAliveInterval 30
ServerAliveCountMax 3以后直接:
ssh myserver6.3 通过跳板机(ProxyJump)
常见企业/家庭内网场景:
Host bastion
HostName bastion.example.com
User jumpuser
IdentityFile ~/.ssh/id_ed25519
Host internal-1
HostName 10.0.0.10
User user
ProxyJump bastion连接:
ssh internal-17. SSH Agent 与密钥管理(macOS / Linux / Windows)
如果你的私钥设置了 passphrase,每次使用都输入会烦,SSH Agent 就是用来“帮你缓存解密后的私钥”。
7.1 Linux(常见)
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
ssh-add -l7.2 macOS(常见坑:钥匙串 / agent)
macOS 通常会自动管理一部分密钥;你也可以手动添加:
ssh-add --apple-use-keychain ~/.ssh/id_ed25519并在 ~/.ssh/config 加:
Host *
AddKeysToAgent yes
UseKeychain yes
IdentityFile ~/.ssh/id_ed255197.3 Windows
• PowerShell:
• OpenSSH Agent 服务可启用后自动管理
• VS Code Remote / Git 等场景:
• 优先统一使用系统 OpenSSH(避免多个 SSH 实现互相抢)
8. 常见排查:为什么密钥登录失败
8.1 客户端加 -v 看细节
ssh -v user@server
# 更详细:-vv 或 -vvv重点看:
• 客户端是否“找到并尝试了”你期望的私钥
• 服务端是否拒绝了公钥(权限/格式/用户不匹配)
8.2 服务端权限是重灾区
服务端目标用户应满足:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys并且:
• ~(家目录)权限不要过于宽松(例如某些系统要求 home 目录不可被 group/other 写)
• authorized_keys 一行一个 key,不要多余换行或粘贴错误
8.3 服务端日志
不同系统日志位置不同,常见:
• Debian/Ubuntu:/var/log/auth.log
• CentOS/RHEL:/var/log/secure
• systemd:
sudo journalctl -u ssh -e
# 或
sudo journalctl -u sshd -e9. 进一步加固(可选,但很实用)
9.1 改端口不是“安全”本身,但能降噪
把 22 改为别的端口能明显减少扫描噪声,但不应替代密钥/防火墙等核心措施。
9.2 防火墙只允许可信来源
• 家用:只允许自己的公网 IP / VPN 网段访问 SSH
• 云服务器:安全组限制来源 IP
9.3 Fail2ban / sshguard
自动封禁频繁失败的 IP。
9.4 最小权限原则
• 不要共享账号
• 不要给所有人 root
• 用 sudo 且记录审计