如何让 ssh 将 known_hosts 与 host/ip:port 匹配,而不仅仅是 host/ip?

如何让 ssh 将 known_hosts 与 host/ip:port 匹配,而不仅仅是 host/ip?

我有两台机器位于防火墙后面,ssh 端口转发到 2201 和 2202。

当我

ssh host -p 2201  

它询问我是否信任该机器,我回答是,然后它被添加到 ~/.ssh/known_hosts

然后我

ssh host -p 2202  

它不让我这样做,因为这个 IP 已经有了一个条目~/.ssh/known_host:1(当我启动时文件是空的,所以第 1 行是上次 ssh 运行添加的)。

这发生在 CentOS 5.4 上。

在其他发行版上(我尝试过 Arch),似乎 ssh 也将 known_hosts 与端口匹配,因此我可以在同一主机/ip 上为多个端口获取多个指纹而不会出现任何问题。

我怎样才能在 CentOS 上获得同样的行为?

我找不到任何东西man ssh_config(或者至少在没有禁用指纹检查的情况下找不到)。

我找到了一个临时解决方案。如果known_hosts文件中有多个针对同一 IP 的条目,它会先检查所有条目,然后再断定哪里出了问题。但我真的不希望这是解决方案。

答案1

CentOS 5 附带的 OpenSSH 版本不支持 中的端口号known_hosts。如果您希望此功能正常工作,则需要构建并安装较新版本。

答案2

~/.ssh/config

主机 foohost-2201
    主机名 foohost.domain.tld
    # 这应该符合 OpenSSH 5 中使用的格式。
    HostkeyAlias“[foohost.domain.tld]:2201”
    用户用户名
    端口 2201

认真地升级。

答案3

如果您的 openssh 客户端不支持基于主机+端口的条目,请使用此项:

指令 'GlobalKnownHostsFile' 可以误用指向您两台防火墙保护的机器(这里是 Alice 和 Bob)各自的不同文件。但是,这两个文件必须提前准备好 alice 或 bob 的正确主机密钥,因为在接受未知密钥时不会写入这些密钥。

设置起来并不是很有趣,但一旦完成它就可以工作了。

我之前的解决方法是“StrictHostKeyChecking no”,它不允许 ssh-agent 转发密钥,也不允许转发端口(使用时被 openssh 阻止)。

直到最近,我的 .ssh/config 看起来是这样的:

Host hoppingstation
        Hostname loginhost.somewhere.net
        User me
        LocalForward 2201 alice.somewhere.net:22
        LocalForward 2202 bob.somewhere.net:22
Host alice
        Hostname localhost
        Port 2201
        User root
        ForwardAgent yes
        GlobalKnownHostsFile /home/me/.ssh/known_hosts_alice
Host bob
        Hostname localhost
        Port 2202
        User root
        ForwardAgent yes
        GlobalKnownHostsFile /home/me/.ssh/known_hosts_bob

答案4

我的解决方案;将详细的主机信息添加到~/.ssh/config

Host <someidentifier>
    Hostname ip.add.re.ss
    StrictHostKeyChecking no
    User username
    Port 2201

Host <someotheridentifier>
    Hostname ip.add.re.ss
    StrictHostKeyChecking no
    User username
    Port 2202

ssh someidentifier那么您甚至无需提供-p等等就可以做到。

相关内容