如何在相同(但不断变化的)IP地址上使用2个不同的主机处理ssh主机密钥验证?

use*_*021 17 security ssh verification openssh nat

我在nat防火墙后面有2个ssh服务器,每天都会改变它的wan IP.它们在给定时间内始终处于相同的WAN IP地址,但在不同的端口上.

我这样连接到服务器A:

ssh -p 22001 karl@x1.example.com
Run Code Online (Sandbox Code Playgroud)

和服务器B:

ssh -p 22002 karl@x2.example.com
Run Code Online (Sandbox Code Playgroud)

所以我为同一个IP获得了2个不同的主机密钥,并且当IP改变同一主机的不同IP时也是如此.

我必须在known_hosts文件中一遍又一遍地删除其他密钥或旧密钥(在IP更改的情况下).

我不愿意关闭密钥验证,因为这样会不那么安全.但是始终获得警告也是不安全的(因为我一直忽略这样的警告).有更好的解决方案吗?

这与我在这里的旧问题有关,但不一样:

具有2个DNS名称的服务器上的SSH登录警告消息

Aln*_*tak 36

我认为这会奏效:

config.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
Run Code Online (Sandbox Code Playgroud)

下面的解释(来自man ssh_config)

CheckHostIP

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

HostKeyAlias

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

UsernamePort线避免你不得不放弃在命令行上这些选项,也因此你可以使用:

% ssh server1
% ssh server2
Run Code Online (Sandbox Code Playgroud)