Skip to content

🔑 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 后也先不要关闭旧会话,避免配置写错把自己锁在门外。

bash
sudo 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(密钥始终留在本地)。