核心思路是提前将堡垒机真实公钥写入本地 known_hosts 以静默验证,规避中间人攻击;需用 ssh-keyscan -t ed25519 批量采集、去重追加,并确保目录权限正确且禁用 HashKnownHosts。

核心思路不是“跳过验证”,而是提前把堡垒机真实公钥写入本地 known_hosts,让后续所有 SSH 连接(包括脚本、Ansible、rsync)能静默比对,彻底规避中间人攻击风险。
准备可信的堡垒机地址列表
新建一个纯文本文件,比如 bastion-hosts.txt,每行一个堡垒机地址,支持带端口:
bastion-prod.example.com10.20.30.40:2222jumpbox-dev.internal:22
精准采集 ed25519 主机密钥(推荐)
现代 OpenSSH 默认优先使用 ed25519 算法,安全性高、体积小、性能好。执行以下命令一次性获取全部堡垒机的 ed25519 公钥并追加到本地 known_hosts:
ssh-keyscan -t ed25519 -f bastion-hosts.txt 2>/dev/null | sort -u >> ~/.ssh/known_hosts
说明:
-
-t ed25519避免混入老旧 RSA 或 ECDSA 密钥,减少干扰 -
2>/dev/null屏蔽离线或端口不通主机的报错,不影响成功条目 -
sort -u去重,防止重复写入同一台主机的多条记录
确保 known_hosts 可被正确匹配
两个关键配置必须检查,否则预置的指纹可能不生效:
-
权限控制:确保
~/.ssh目录权限为700,known_hosts文件权限为600或644(OpenSSH 8.8+ 推荐600) -
禁用哈希化:如果
/etc/ssh/ssh_config或~/.ssh/config启用了HashKnownHosts yes,新写入的明文主机名会被自动哈希,导致后续连接无法匹配。临时禁用方式:
在扫描前加一句:ssh -o HashKnownHosts=no -o StrictHostKeyChecking=no bastion-prod.example.com true(仅触发配置加载,不真正登录)
集成到自动化流程中(如 Ansible 或部署脚本)
可在每次执行远程任务前插入指纹预热步骤:
- 先清空临时缓存:
rm -f ~/.ssh/bastion.tmp - 批量扫描并保存:
ssh-keyscan -t ed25519 -f bastion-hosts.txt 2>/dev/null > ~/.ssh/bastion.tmp - 校验有效性:
[ -s ~/.ssh/bastion.tmp ] || { echo "错误:未获取到任何堡垒机密钥"; exit 1; } - 安全合并:
cat ~/.ssh/bastion.tmp >> ~/.ssh/known_hosts











