我有两个类似的 Web 应用部署,每个部署都在具有私有 IP 地址的独立虚拟网络上。两个部署的虚拟机均位于 10.0.4.4。
我可以通过 VPN 从我的开发机器进入任一网络并通过 SSH 连接到虚拟机,但是当我切换网络时,SSH 会因主机拥有不同的密钥而引发骚动。
我可以针对单个主机名配置多个密钥签名以避免这种情况吗?建议使用哪种方式连接具有相同 IP 的不同机器?
答案1
SSH 检查known_hosts
此主机的所有条目。如果全部其中大部分都不匹配,包括通常的情况全部存在单一入口,那么 SSH 将会抱怨。
如果任何其中匹配 SSH 主机检查成功。
从man sshd
SSH_KNOWN_HOSTS 文件格式:
执行主机身份验证时,如果任何匹配的行具有正确的密钥,则认证被接受;要么是完全匹配的密钥,要么是签署该证书的认证机构的密钥(如果服务器已经提供了证书进行认证)。
[...]
允许(但不建议)为同一个名称设置多行或不同的主机密钥。当文件中放入来自不同域的主机名的短格式时,这种情况不可避免地会发生。文件可能包含冲突的信息;如果可以从任一文件中找到有效信息,则身份验证被接受。
一种(不太)常见的用途是,SSH 服务器通常通过 VIP 在高可用性环境中用作 SFTP 服务器:当从一个节点到另一个节点发生故障转移时,主机身份验证可能会发生变化。
可以两次使用ssh-keyscan 10.0.4.4
可能附加选项(例如-H
用于散列隐私的选项):在每个不同的虚拟机上一次,检索所有可能的主机密钥并将它们或其中一些附加到~/.ssh/known_hosts
。
然后就不会再发生身份验证错误,直到尝试访问具有相同地址的第 3 个不相关节点。
答案2
您无法识别开发机器的操作系统,但这应该适用于 Linux 或 Mac 上的 openSSH。
从命令行
ssh -o StrictHostKeyChecking=no 10.0.4.4
或者使用以下行设置 ~/.ssh/config
Host 10.0.4.4
StrictHostKeyChecking=no
如果您控制虚拟机并且它们是 Linux,则可以将所有密钥文件/etc/ssh/
从一台虚拟机复制到另一台虚拟机,然后重新启动sshd
。这将提供相同的主机密钥。