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


29

我定期将计算机放入双引导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.9hostname还是hostname.domainname,或者它是否使用其Linux主机密钥或OSX主机密钥。但是,如果仍然存在真正的中间人攻击,如果使用了不同于这两者的另一个密钥,我仍然希望收到警告。


您想做什么?编辑它的目的是什么?
Rhyuk 2012年

@Rhyuk:编辑它,以便能够将IP地址,主机名和hostname.domainname的OSX和linux主机密钥都识别为有效。
弗雷德里克·格罗斯汉斯

@Rhyuk:我已经编辑了问题。现在更清楚了吗?
弗雷德里克·格罗斯汉斯

2
您是否简单地考虑过使两个安装具有相同的密钥?
Zoredache

3
在某些情况下,使用一个IP地址访问多个实体(每个实体都有单独的SSH主机密钥)是合理的,并且仍然保持严格的控制权,即只有那些主机密钥才是SSH客户端看到的密钥。例如,一些高可用性设置,其中使用一个共享的IP地址访问一组设备,但是(由于某种原因)客户端看到的SSH主机密钥在何处根据当前处于活动状态的群集设备而变化。另一种情况是,当多个SSH主机位于经过NAT转换的防火墙后面并从外部访问时,它们似乎都具有相同的IP。
IllvilJa

Answers:


12

此处最直接的解决方案是针对Linux和OS X使用相同的主机密钥。即,选择一组/etc/ssh/ssh_host_*_key*文件并将其复制到另一OS。然后,无论您引导到哪个操作系统,都将向SSH客户端提供相同的主机密钥,而SSH客户端则更明智。


我希望使用客户端版本,但是如果找不到,我将尝试使用该版本。顺便说一下,文件的OSX(非标准)本地化/private/etc/ssh_host*不是/etc/ssh/ssh_host*
弗雷德里克·格罗斯汉斯

将文件从一台机器复制到另一台(两台Linux机器)对我不起作用。尽管文件内容相同,但哈希值却不相同,所以我仍然遇到问题(也许是修改时间?)。下面的解决方案好得多。
Stav

sshd在启动时加载一次主机密钥,因此您很可能需要重新启动sshd。我将其添加到答案中。至于其他更好的解决方案,则取决于您的情况。我认为这种方法的主要优点是只需要一次性设置,并且更有可能与多种SSH客户端实现一起使用。
jjlin

奇怪的是,似乎我相对较新的OpenSSH 7.4p1 sshd在每个新连接上加载了主机密钥。也许很长一段时间以来,我只是假设主机密钥被视为其他sshd配置。所以无论如何,这可能不是您的问题。
jjlin

对共享相同VRRP地址的群集中的两个主机执行此操作是否是一个坏主意?故障转移时,响应的主机将有所不同。我不想收到警告。
Colin't Hart

26

正如@Izzy在上面的注释中所建议的那样,ssh告诉您有问题的行,然后删除该行(将其保存在其他位置),接受新的密钥,然后将删除的行复制回去,就可以得到两个相同的密钥主机,而ssh将接受其中一个。

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

如果有人知道如何让PuTTY做同样的事情,那么我将很感兴趣。


4
实际上,如果您有Linux客户端,甚至不需要删除有问题的行,只需在前面加一个井号(#)即可将其注释掉。然后,一旦您接受了新密钥,就可以只编辑known_hosts文件,并用旧密钥取消注释该行。但是,是的,这在Putty中也很有用。
IllvilJa

1
如果有两个具有相同名称,但IP地址和主机密钥不同的主机,则此变通办法也适用:注释掉(或临时删除)该主机的两行(一个基于IP地址的行和一个基于主机的行)名称),连接到未知主机,然后重新添加已注释或删除的行。
Kai Petzke

13

我发现这可以帮助您实现目标。

来源: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)

CheckHostIP

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

HostKeyAlias

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

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

% ssh server1
% ssh server2

我看到了这篇文章,但与我的情况不符:这两个服务器通过本文中的端口号进行区分,而不是我的情况。此外,我想保持在盐渍哈希中带来的额外安全防护层known_hostsCheckHostIP
弗雷德里克Grosshans

1
@FrédéricGrosshans,我检查了一下。您不必具有单独的端口,并且HashKnownHosts选项可与HostKeyAlias配合使用。
Zoredache

不利的一面是,除非我错了,否则它是基于每个客户端配置的,而仅在接受ssh服务器上配置了接受的答案。
FreeSoftwareServers

2

解决问题的最简单方法是为每个主机分配一个自己的/不同的IP地址。您的(专用)网络和IPv4中有253个可用地址,这没什么大不了的。给它们提供固定的IP(因为DHCP服务器将根据网卡的MAC地址识别计算机,并且两者都将获得相同的地址)。如果您想保留安全措施,那么我看不到任何其他解决方案(我也不会因为那种“安慰”而放弃)。


实际上,该IP地址不是也不192.168.0.xx是私有的。这是我大学提供的“真实” IPv4地址,我不能随意更改。
弗雷德里克·格罗斯汉斯

如果您使用Wikipedia进行检查,您将看到192.168.0.0-192.168.255.255(您指定的问题192.168.0.9,属于该范围)属于“私有IPv4地址空间”。因此,“私有”不是指您“拥有”它,而是指IETF的规范。在您的问题中,您没有表示无法更改IP,对不起-但是,在提供了输入之后,我的回答很合适。
Izzy 2012年

对不起,这个措辞不好的问题。我没有投票。
弗雷德里克·格罗斯汉斯

没有问题,而tnx可以让我知道-减少了反对投票的压力。但是,另一个想法是:我不确定known_hosts文件从哪里获取主机名,反向DNS还是由客户端提供。您可以尝试重命名其中一个“主机”,以便它显示不同的主机名。或者添加两个主机密钥:ssh告诉您“ known_hosts”文件中的“违规行”(当包含#1且与#2连接时ynd)。因此,您可以将该行复制到另一个文件,将其从known_hosts中删除,让#2连接并添加其行,然后将删除的行添加回去。不知道它是否有效,但是您可以尝试。
Izzy 2012年

2

连接到共享相同IP的各个VPS盒时,我没有遇到这个问题,因为每个盒都有不同的SSH端口(20022、30022等),因此它们被注册为具有不同密钥的已知主机。

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


嗨@Pyheme,欢迎来到超级用户!请注意,这个问题已有将近4年的历史了。回答它没有错,但是请记住,您可能没有得到回应。
Hewbot '16

我已经没有OS X机器了,但是您的回答可能对其他人有用。这是堆栈交换整点
弗雷德里克Grosshans

@Hewbot ...确实,我现在看到了。不知道为什么,它出现在最近的问题列表中……
Pyheme,2016年

1

另一篇文章,描述了解决问题的几种方法:

第二种方法使用两个openSSH参数:StrictHostKeyCheckinUserKnownHostsFile。此方法通过将SSH配置为使用空的known_hosts文件来欺骗SSH,而不是要求您确认远程主机标识密钥。


本文是关于禁止密钥检查的。我想保持键检查,我不希望禁止它每次hostname重新启动到Linut或OSX
弗雷德里克Grosshans

1
欢迎来到超级用户!虽然从理论上讲这可以回答问题,但最好在此处包括答案的基本部分,并提供链接以供参考。我只介绍了其中一小部分,但这可能不是您想要的...
Tamara Wijsman 2012年

1

由于您想保持严格的主机密钥检查,我希望它们使用不同的known_hosts文件。为此,请按以下步骤设置您的~/.ssh/config文件(/etc/ssh/ssh_config如果需要在多个本地用户帐户上使用,也可以设置该文件):

Host myserver.osx
  UserKnownHostsFile ~/.ssh/known_hosts.dual.osx
  # default is ~/.ssh/known_hosts
  Hostname $REALHOSTNAME

Host myserver.linux
  UserKnownHostsFile ~/.ssh/known_hosts.dual.linux
  Hostname $REALHOSTNAME

$REALHOSTNAME当然要用实际的主机名或IP地址代替。(选择哪个都没关系,只要您在“主机名”之后选择可以解析为IP地址的内容即可,但是出于一般原则,我会优先使用主机名而不是IP地址。)

然后ssh myserver.linuxssh myserver.osx因此可以具有不同的主机密钥,但是您仍然可以进行检查。如果运行的是Linux,并且您键入OS X(反之亦然),则会收到警告(我认为这是理想的效果)。

如果遇到此问题,我将确保主known_hosts文件中完全有错误,而这两个都不匹配,因此如果您键入$REALHOSTNAME而不是myserver.osx得到警告。:-)我可以这样放一些东西

<ip-address-of-github.com> $REALHOSTNAME

在我的/etc/hosts,然后输入ssh $REALHOSTNAME并接受新密钥,然后取出该条目。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.