当多个主机共享相同的 IP 和 DNS 名称时,如何编辑 known_hosts?

当多个主机共享相同的 IP 和 DNS 名称时,如何编辑 known_hosts?

我经常通过 ssh 连接到一台双启动 OS X / Linux 计算机。这两个 OS 实例不共享相同的主机密钥,因此可以将它们视为共享相同 IP 和 DNS 的两个主机。假设 IP 为192.168.0.9,名称为hostnamehostname.domainname

据我所知,要连接到这两台主机,解决方案是将它们都添加到文件中~/.ssh/know_hosts。但是,说起来容易做起来难,因为文件是散列的,每个主机可能有几个条目(192.168.0.9hostnamehostname.domainname)。因此,我收到以下警告

Warning: the ECDSA host key for 'hostname' differs from the key for the IP address '192.168.0.9'

有没有一种简单的方法可以编辑known_hosts文件,同时保留哈希值。例如,如何找到与给定主机名相对应的行?如何为某些已知主机生成哈希值?

理想的解决方案是允许我使用 ssh 无缝连接到这台计算机,无论我将其称为还是192.168.0.9,也无论它使用 Linux 主机密钥还是 OSX 主机密钥。但是,如果发生真正的中间人攻击,我仍然希望收到警告,hostnamehostname.domainnameIE如果使用除这两个之外的其他密钥。

答案1

这里最直接的解决方案就是对 Linux 和 OS X 使用相同的主机密钥。也就是说,选择一组/etc/ssh/ssh_host_*_key*文件并将其复制到另一个操作系统。然后,无论您启动哪个操作系统,相同的主机密钥都会呈现给 SSH 客户端,而 SSH 客户端将一无所知。

答案2

正如@Izzy 在上面的评论中所建议的那样,ssh 会告诉您有问题的行,通过删除该行(将其保存在其他地方),接受新密钥,然后将删除的行复制回来,您最终会得到同一主机的两个密钥,ssh 将接受其中任意一个。

(您还可以使用ssh-keygen -H -F <hostname>它在 known_hosts 文件中查找与该主机名匹配的行。将删除的行复制回来后运行此命令应该会列出两个条目。)

如果有人知道如何让 PuTTY 做同样的事情,我会非常感兴趣听到它。

答案3

我发现这也许能帮助你实现你想要的目标。

来源:https://stackoverflow.com/questions/733753/how-to-handle-ssh-host-key-verification-with-2-different-hosts-on-the-same-but

在您的 .ssh 目录中创建一个配置文件,如下所示:

Host server1
  Hostname x1.example.com
  HostKeyAlias server1
  CheckHostIP no
  Port 22001
  User karl

Host server2
  Hostname x2.example.com
  HostKeyAlias server2
  CheckHostIP no
  Port 22002
  User karl

以下解释(来自 man ssh_config)

检查主机IP

如果此标志设置为“yes”,ssh(1) 将另外检查 known_hosts 文件中的主机 IP 地址。这允许 ssh 检测主机密钥是否由于 DNS 欺骗而更改。如果选项设置为“no”,则不会执行检查。默认值为“yes”。

主机密钥别名

指定在主机密钥数据库文件中查找或保存主机密钥时应使用的别名,而不是真实主机名。此选项对于隧道 SSH 连接或在单个主机上运行的多个服务器很有用。

用户名和端口行也避免了您必须在命令行上提供这些选项,因此您只需使用:

% ssh server1
% ssh server2

答案4

当连接到共享同一 IP 的各种 VPS 盒时,我不会遇到该问题,因为每个 VPS 盒都有不同的 SSH 端口(20022、30022 等),因此它们使用不同的密钥注册为已知主机。

这对您来说是一种解决方法吗?

相关内容