🔑 SSH 密钥认证与跳板机
为什么用密钥不用密码?
密码登录有三大问题:暴力破解风险、每次都要输入、自动化脚本不方便。SSH 密钥认证用非对称加密,安全性和便利性都碾压密码。
bash
# 第一步:在本地生成密钥对
ssh-keygen -t ed25519 -C "your_email@example.com"
Enter file in which to save the key (/home/user/.ssh/id_ed25519):
Enter passphrase (empty for no passphrase): ← 建议设置 passphrase
Enter same passphrase again:
Your identification has been saved in /home/user/.ssh/id_ed25519
Your public key has been saved in /home/user/.ssh/id_ed25519.pub
# 第二步:把公钥复制到服务器
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server
Number of key(s) added: 1
# 现在可以直接免密登录了
ssh user@server # 不再问密码!
# 查看服务器上的公钥
cat ~/.ssh/authorized_keys
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA... your_email@example.com⚠️ 注意: ⚠️ 安全加固:生成密钥后,建议在服务器上禁用密码登录:/etc/ssh/sshd_config PasswordAuthentication no PubkeyAuthentication yes
修改前先开一个新终端确认
ssh user@server已经能用密钥登录;重启 sshd 后也先不要关闭旧会话,避免配置写错把自己锁在门外。
bashsudo sshd -t sudo systemctl restart sshd
这样即使密码泄露,也登不进来。
SSH Config 多服务器管理
bash
# 编辑 ~/.ssh/config,给服务器起别名
cat >> ~/.ssh/config << 'EOF'
Host prod-web
HostName 203.0.113.50
User deploy
Port 2222
IdentityFile ~/.ssh/id_ed25519_prod
Host prod-db
HostName 203.0.113.51
User admin
IdentityFile ~/.ssh/id_ed25519_prod
Host staging-*
User staging
IdentityFile ~/.ssh/id_ed25519_staging
# 只有确实需要在远端继续使用本地密钥时才开启
# ForwardAgent yes
EOF
# 现在用别名就能连接
ssh prod-web # 等价于 ssh -p 2222 deploy@203.0.113.50
ssh prod-db # 等价于 ssh admin@203.0.113.51
scp file.txt prod-web:/tmp/ # 用别名传文件也行SSH 跳板机(ProxyJump)
你的内网服务器没有公网 IP,必须先连跳板机(堡垒机)才能访问。以前要用 ssh -t 两步跳,现在 ProxyJump 一行搞定:
bash
# 场景:本地 → 跳板机(bastion) → 内网服务器(internal)
# 方法 1:命令行直接跳
ssh -J user@bastion:22 user@internal
# 方法 2:写进 SSH config(推荐,一劳永逸)
cat >> ~/.ssh/config << 'EOF'
Host bastion
HostName 203.0.113.1
User admin
Host internal
HostName 10.0.0.100
User deploy
ProxyJump bastion
EOF
# 现在直接 ssh internal 就能穿透跳板机!
ssh internal
scp file.txt internal:/tmp/
# 多级跳板也行
Host deep-server
HostName 10.0.1.50
ProxyJump bastion,internal # 先跳 bastion,再跳 internal💡 提示: 💡 Agent Forwarding:如果你想在跳板机上用本地密钥操作内网服务器(比如ssh internal时用本地密钥),需要开启ForwardAgent yes。但注意:Agent Forwarding 有安全风险——跳板机的 root 可以劫持你的密钥。更安全的替代方案是ProxyJump(密钥始终留在本地)。