如何正确定向到具有多台机器(因此有多个 SSH 服务器)的 LAN 的 public IP 地址的传入 SSH 连接请求?

How does an incoming SSH connection request to a public IP address of a LAN with multiple machines (thus multiple SSH servers) get directed correctly?

假设我在同一局域网内有两台机器mA(私有IP:192.168.0.3)和mB(私有IP:192.168.0.4)谁是public IP地址是 2.2.2.2。这些机器都有使用共同用户名 root 的用户。此外,mA 有用户 uAmB 有用户 uB

我了解从 mAmB 到另一个 public IP 3.3.3.3ssh 通信是如何工作的。来自 mA port 22 的 SSH 在路由器中创建一个 NAT table,它对应于 2.2.2.2 port 22 作为源地址。因此,从 3.3.3.32.2.2.2 port 22 的 ssh 请求的任何传入回复都可以反向转换为 mA port 22。这是可能的,因为 NAT table entry for mA.

的存在

现在,如果 LAN 外的任何其他服务器尝试使用 ssh root@2.2.2.2 sshmB。路由器怎么知道局域网中的哪台机器发送这个SSH请求呢? (因为现在NATtable里面没有什么可以识别mB了,而且mAmB都有root了)

这与您尝试 ssh uB@2.2.2.2 时发生的情况是否不同,其中用户 uB 仅存在于 mB 中?

传出连接数

on mA: ssh 3.3.3.3

这会在路由器上创建一个 NAT table 条目,其中包含以下连接信息

Source-IP   IP of mA
Source-Port >1024
Dest-IP     3.3.3.3
Dest-Port   22

Source-IP被NATed到2.2.2.2,每次一个带有上述连接信息的数据包(Source-IP是NATed Source-IP)到达路由器时, NATed Source-IP 被转换回 mA 的 IP,然后数据包被转发到 mA.

传入连接

对于传入连接,路由器上没有可用的连接信息,这意味着路由器不知道如何处理具有

的数据包
Dest-IP     2.2.2.2
Dest-Port   22

在 TCP/IP header 中,假设路由器本身无法通过 SSH 访问。因此,路由器能够定义所谓的 port forwarding 规则。端口转发规则的形式为

[Dest-IP:]Dest-Port  -->  Real-Dest-IP:Real-Dest-Port

如果路由器接受更多的IP地址端口转发规则也可以区分不同Dest-IPs.

因此,在您的情况下,您必须创建两个端口转发规则,一个用于 mA,一个用于 mB

  22  -->  mA:22
2222  -->  mB:22

不幸的是,您必须从外部连接到不同的端口才能访问您的服务器。

根据此规则,用于访问您的服务器的 ssh 命令如下:

mA: ssh 2.2.2.2
mB: ssh -p 2222 2.2.2.2

顺便说一句:出于安全原因,不建议直接以 root.

访问您的服务器