我仍然对在不同内部网络上的两台计算机之间建立 SSH 连接(端口 22)感到困惑。例如:我在内部 IP 地址为 IIP-1 的计算机上,连接到路由器 RT-1。有 10 个 IIP 连接到 RT-1。我想建立与连接到路由器 RT-2 的 IIP-3 的 SSH 连接。有 10 个 IIP 连接到 RT-2。在任何时候,RT-1 和 RT-2 上的 IIP 之间都可以有多个 SSH 连接。由于我只有端口 22 可用,所以我不知道哪个 SSH 会话在哪个 IIP 之间进行通信。我查看了几个类似的问题,但仍然不清楚解决方案。非常感谢,Jerry
答案1
如果您的路由器在 WAN 端具有单个公共 IP 地址,并在 LAN 端使用私有 IP 地址子网,那么它不仅仅是一个路由器,它是一个 NAT(技术上是 NAPT:网络地址和端口转换,但大多数人只说 NAT)网关。
当主机尝试启动新连接时,它会从临时端口号(高于 49152)发送数据包。当 NAT 网关处理此传出数据包时,它会查看该源端口在 NAT 网关的 WAN 接口(公共 IP 地址)上是否可用。如果可用,它会允许该客户端使用该端口号;如果正在使用中,它会为该数据包分配一个不同的公共端口号并修改数据包以使其看起来像是来自其他端口号。无论哪种方式,它都会创建一个表条目,将该公共端口号映射到该私有 IP 地址和端口,以便它可以正确地转换和转发该连接上的任何进一步的数据包,无论是在哪个方向。
对于在其公共 IP 地址上进行的新传入连接尝试,NAT 网关无法自动知道将连接尝试转发给谁。因此,NAT 网关将默认丢弃数据包,并可能使用 TCP 重置数据包或 ICMP“目标无法访问:端口无法访问”消息进行响应。这就是为什么您必须创建端口转发(又称端口映射、虚拟服务器等)规则。
但是单个端口(例如ssh
众所周知的端口 22)只能转发到单个主机。因此,对于从外部发起的连接,只能通过端口 22 访问一个主机。因此,如果您在 NAT 网关后面有多台机器,并且希望它们都可以通过ssh
外部访问,则需要选择其他端口号来映射到这些主机。例如,将公共端口 22 映射到第一台主机上的端口 22,然后将公共端口 50022 映射到第二台主机上的端口 22,然后将公共端口 50122 映射到第三台主机上的端口 22,等等。
然后,当您需要连接到第二台主机时,使用ssh -p 50022 username@PublicIPAddrOfNATGateway
。
实际上,最好不要将公共端口 22 映射到任何东西。ssh
的端口 22 是最容易受到攻击的端口之一。使用其他端口并不会让您更安全,但确实会降低您遭受攻击的可能性。
答案2
我不太明白你的问题,因为你知道有多个 SSH 会话。
我不明白路由器有什么用。因为如果只有一个路由器,你也会有同样的问题。
我不明白它们是内部 IP 还是外部 IP 对你的问题有什么影响。
您从不同的计算机与 SSH 服务器建立了多个连接。
我认为每个用户都是不同的,一个以一个用户身份登录,一个以另一个用户身份登录。
每个操作都是由不同的 IP 发起的,各有不同。
如果一台计算机可以发起多个连接,那么可以说每个连接都是由不同的 IP:PORT 发起的,因此是不同的。
R1 上的所有私有 IP(即所谓的 IIP)都与 R2 上的 IP 不同。
但....
让我们假设情况并非如此......(我认为这就是你想要表达的意思)
假设 R1 上的某些计算机与 R2 上的某些计算机具有相同的 IP。
然后 R1 和 R2 必须执行 NAPT。(NAPT 是 NAT,但也是一对多)。因此,SSH 服务器与 R1 的 IP 地址和 R2 的 IP 地址进行通信。每个连接都在不同的端口上。
因此,从 SSH 服务器的角度来看,每个 sSH 会话都是一个很好的视角,因为它会处理与其相关的所有连接。每个 ssh 会话都可以通过 IP:PORT 来识别,其中 IP 是 R1 的 IP 或 R2 的 IP。以及任何端口。
您说的是端口转换,而不是真正的端口转发。
如果您有多台计算机位于 NAPT 路由器后面,并且它们正在访问 Internet,则不需要端口转发,但需要端口转换。网站只会看到 NAPT 路由器的 IP。NAPT 路由器会区分每个连接,因为它会打开本地客户端端口来与网站通信,并且它打开的任何本地客户端端口都将与连接到它的一个私有 IP 相关联。
您通常不会希望在本地使用 NAPT,这太疯狂了。您有足够多的私有 IP!