通过 SSH 连接到相同公共 IP 地址上的 NAT 服务器

Cop*_*art 16 linux solaris ssh ssh-keys

我试图通过 SSH 从办公室 X 到办公室 Y 中的几个 Linux 机器。办公室 Y 中的 Linux 机器在 NAT 之后,每个机器都在自己的端口上运行。我可以通过 SSH 成功访问所有这些,但我无法进行身份验证。

我能够通过 SSH 进入第一个框,但是当我到达第二个框时,它说:

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
@    WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!     @
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY!
Someone could be eavesdropping on you right now (man-in-the-middle attack)!
It is also possible that the RSA host key has just been changed.
The fingerprint for the RSA key sent by the remote host is
[edited out fingerprint]
Please contact your system administrator.
Add correct host key in /root/.ssh/known_hosts to get rid of this message.
Offending key in /root/.ssh/known_hosts:1
Run Code Online (Sandbox Code Playgroud)

我的理解是它希望从该公共 IP 地址看到相同的密钥,但它看到的是不同的密钥,因为它是不同的 SSH 服务器。

我该如何修复它,以便它在同一 IP 地址后面的每个服务器上创建/接受不同的密钥?

在此处输入图片说明

lar*_*sks 22

有几种方法可以解决这个问题:

  1. 您可以禁用此特定主机的主机密钥检查。在您的ssh_config文件 ( ~/.ssh/config) 中,输入如下内容:

    Host remote.host.name
    UserKnownHostsFile /dev/null
    StrictHostkeyChecking no
    
    Run Code Online (Sandbox Code Playgroud)

    这配置ssh为从不为 存储主机密钥remote.host.name,但缺点是现在您容易受到中间人攻击(因为您盲目接受主机密钥,您无法判断远程主机密钥是否已更改)。

  2. 您可以使用类似的技术简单地为每个主机提供一个唯一的known_hosts文件:

    Host hosta
    Port 10098
    Hostname remote.host.name
    UserKnownHostsFile ~/.ssh/known_hosts_hosta
    
    Host hostb
    Port 10099
    Hostname remote.host.name
    UserKnownHostsFile ~/.ssh/known_hosts_hostb
    
    Run Code Online (Sandbox Code Playgroud)

    然后,您将使用ssh hosta或连接到这些主机ssh hostb,并ssh从配置文件中获取实际的主机名和端口。

  • 不,修改`/etc/hosts` 文件也可以。我更喜欢这个,因为(a)它不需要升级的权限,(b)这意味着你不需要在命令行上指定端口号。 (4认同)
  • 如果我可以对 ~/.ssh/config 投两次票,我会。摆弄 /etc/hosts 必然会导致其他故障排除问题。 (3认同)
  • @CopyRunStart:你不需要在命令行上指定端口,因为它已经在你的`~/.ssh/config`(每个`hosta``hostb`的不同端口)中指定,如larsks中所述回答。同样,您可以在此配置文件中为不同的主机指定不同的用户名、密钥等,因此您只需在命令行上执行 `ssh hosta` 或 `ssh hostb` (2认同)

Bra*_*ier 15

主机名或 IP 地址作为散列(或纯文本,取决于选项和版本默认值)存储在您的known_hosts文件中。最简单的解决方法是为每个主机添加一个条目到 DNS 或/etc/hosts(呃!)具有相同 IP (WAN) 地址的文件,例如/etc/hosts

your.wan.ip.address      servera serverb
Run Code Online (Sandbox Code Playgroud)

然后ssh按主机名和端口。


Mad*_*ter 8

您没有说明您使用的是哪个版本的 Solaris(更重要的是 SSH),但足够最新的 OpenSSH 版本已经解决了这个问题。

这是我的known_hosts文件中的两个条目,它们具有相同的 IP 地址但不同的端口号(一个是隐式 22);如您所见,存储的密钥不一样。

[10.69.55.47]:2222 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEAo+zenWwhFWAa/exdxbm3A3htDFGwFVjFlHLO83AfOaloBbBrr6whmLeDqVPBSwI/yrePClpahLUMYE6qGBFCbbOYiQkMDwacNFfxvxd6oCMDDqZH6NWGiBCt0b2M6YKYhYCw6z8n0yvlLk1eTdpp2OpjbfwAIe4eBkWyKNZY9+17VtzARqGR9tgHC8Dh7HBApDR8wooc+XzY6FhD2b21meIt8r8bjfBIu5t6eQgDHh/TzUT1rGH6W0HeUJxpDnpud5Af1ygMEQFrGrzHi5HKtg+K6HFBggMF8t6p2Dz8oMds5pi6IuPlVi3UvO1X7mMJ9pP7ByMQqiVrQ9wtAbC2QQ==
10.69.55.47 ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA1clJ6vp8NDy7D9YVgAKQQzERfx3scR0c0027yOYGGpeLg+nW+x8mJk1ia9GouUTDME+NP2YDVZUEDog9rtTJvuLd22ZxfoC8LGboyBsmlhOVxdSCxmA/+blPCp1pyocr8pXyXjSkb/qQKKQMRoAU7qKKHPfI5Vugj04l6WbW2rJQTqFD/Lguc8AAUOE6K4DNhETOH2gOnwq6xi0vutDmeUKSqEvM/PQFZSlOL4dFDYO5jAUjvgm6yGHP3LlS9fmCzayJgGgLSnNz0nlcd94Pa1Cd441cCAZHFDvDPniawEafH9ok4Mmew0UGopQGUGbfb5+8g8YphLW6aLdrvnZbAw==
Run Code Online (Sandbox Code Playgroud)

我不知道哪个版本的 OpenSSH 引入了这个,但我正在运行

[me@risby fin]$ ssh -V
OpenSSH_6.9p1, OpenSSL 1.0.1k-fips 8 Jan 2015
Run Code Online (Sandbox Code Playgroud)