如何通过 SSH 连接到具有相同 IP 和不同 SSH 端口号的两个不同 Linux SSH 主机(docker)

Posted

技术标签:

【中文标题】如何通过 SSH 连接到具有相同 IP 和不同 SSH 端口号的两个不同 Linux SSH 主机(docker)【英文标题】:How to SSH into two different Linux SSH hosts (docker) with same IP and different SSH port numbers 【发布时间】:2020-12-03 16:06:24 【问题描述】:

以下是 IP 和端口号配置 - 所有主机都运行某个版本的 Ubuntu 或其他

HostA : 192.168.1.200

DockerHostA (running in HostA) : 172.17.0.8

MyLaptop : 192.168.1.201

In the docker specification, I have mapped port 22 (of DockerHostA) to port 9090 of (HostA).

我可以通过

连接到 HostA
ssh user@192.168.1.200

这会在 ~/.ssh/known_hosts 文件中添加一个条目。

我也可以像这样连接到DockerHostA

ssh -p 9090 user@192.168.1.200

这还会在 known_hosts 文件中添加一个条目(第二个)。发生这种情况后,我只能连接到 DockerHostA,无法通过 ssh 连接到 HostA。

ssh user@192.168.1.200
ssh -p 9090 user@192.168.1.200

这两个 ssh 进入 DockerHostA。

我可以删除 known_hosts 文件,这样就可以在问题再次发生之前只对两个主机进行一次 ssh 连接。

~/.ssh/known_hosts has two entries
|1|883fTHa....
|1|t89sTmV....

所以,我的问题是

    如何连接到具有相同 IP 地址但不同端口的两台不同主机? 我可以做些什么来路由 ip:172.17.0.8 (DockerHostA) 的流量,这样我就可以直接 ping 该 IP 地址了吗?。

【问题讨论】:

【参考方案1】:

问题 1:

我假设您完全了解指纹检查的目的以及自动确认新指纹或认为指纹更改合法的风险:

ssh -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" user@192.168.1.200
ssh -p 9090 -o "UserKnownHostsFile=/dev/null" -o "StrictHostKeyChecking=no" user@192.168.1.200

问题 2:

我假设您的 docker 容器是在 docker-bridge 网络上启动的。这是一个单独的子网,通常默认为 172.17.0.0/16。默认情况下,没有从 192.168.0.0/24 到 172.17.0.0/16 的路由。

你基本上可以创建你需要的任何路由和iptables规则,但通常你想让docker管理一切:当你使用docker run -p <src>:<dst>时,docker会自动创建一个从你的host:<src>到你的container:<dst>的转发规则

【讨论】:

【参考方案2】:

您可以将两个 SSH 容器端口(即 22)映射到主机上的任意端口。通过这种方式,您将能够做到这一点,例如

容器 1

ssh -p 9000 user@localhost

容器 2

ssh -p 9001 user@localhost

【讨论】:

以上是关于如何通过 SSH 连接到具有相同 IP 和不同 SSH 端口号的两个不同 Linux SSH 主机(docker)的主要内容,如果未能解决你的问题,请参考以下文章

如何使用私有 IP 连接到 EC2 上的后端

处理从具有相同 IP 的多个客户端中的服务器接收值

无法通过 SSH 连接到曾经正常工作的 GCP 虚拟机实例

仅从 ZeroTier 网络内通过 SSH 连接到服务器

如何自动输入密码ssh连接到其他机器

如何通过 PHP 连接到远程服务器 [重复]