好吧,我有 5 台电脑,今天我设置了 ssh。我使用端口转发来指向我的 192.168.1.10 xbuntu。网络上还有另外 4 台电脑
但是,如果我仅通过 ssh 连接到 ISP 提供的公共 IP,比如说 ip 98.222.222.38,它会直接转到我的 192.168.1.10。它怎么知道直接转到那里?我不明白,因为我在 98.222.222.38 上有 5 台计算机,它怎么知道转到 192.168.1.10 而不是 192.168.1.3?
答案1
使用 SSH 直接连接到 IP 地址将尝试在端口 22 上建立连接。您的路由器位于网络地址转换 (NAT) 之后,允许您在单个公共 IP 地址之后使用多台计算机。您的路由器必须具有端口转发规则,才能将 WAN IP 上的端口 22 连接转发到 192.168.1.10 上的端口 22。
您必须有一个单独的规则将不同的 WAN 端口转发到 192.168.1.3 端口 22,才能在另一台室内计算机上访问 ssh。
这解释了当您尝试连接到公共 IP 地址时如何连接到 .10 主机。
但是,根据您在该问题下方的评论中的澄清:如果没有提供用户名,ssh 会假定远程系统上的用户名与本地主机上的用户名相同。因此,如果您使用ssh 98.222.222.38
而不是并且可以成功连接,则客户端计算机上的用户名必须是“will86”。ssh [email protected]
实际上,这是整个过程(路由器上网络堆栈的工作方式的细节可能无法准确反映):当您简单地运行时ssh 98.222.222.38
:
- 您的客户端计算机向 IP 98.222.222.38、端口 22 发送 TCP SYN 数据包
- 您的路由器收到数据包,将数据包路由到 98.222.222.38
- 您的路由器在 98.222.222.38 端口 22 的 WAN 适配器上接收数据包
- 您的路由器会检查其 NAT 端口转发规则,以确定如何路由传入的数据包。在大多数情况下,它会在此处丢弃数据包,但您的路由器必须具有从端口 22 到 IP 192.168.1.10 的转发规则
- 您的路由器将数据包发送到 192.168.1.10,端口 22
- 192.168.1.10收到数据包并响应,继续通过TCP连接握手建立连接
- 在 ssh 应用程序协议的某个地方(这将通过已建立的 TCP 连接发生),需要用户名。由于命令行中未提供用户名,因此客户端使用启动 ssh 客户端应用程序的登录用户的用户名。如果您指定了,它将尝试使用 vt_antik 作为用户名。
ssh [email protected]
答案2
一台计算机只能允许一个应用程序在任何时候监听一个特定的端口。在本例中,ssh 在端口 22 上,因此 sshd 是接收连接的那个。
您可以将路由器视为网络上其他计算机的代理计算机。在这种情况下,它将是一台计算机,而不是监听特定端口的应用程序。路由器上只有一个“端口 22”,因此只能转发到一台计算机。如果没有端口转发规则,路由器本身将接受连接(有些路由器确实有 ssh 访问权限)。
但是,您可以在路由器上选择不同的端口,然后转发到另一台计算机的端口 22,以便您可以访问它们。为了符合标准,请使用大于 1024 的端口号,因为小于 1024 的端口号都保留用于其他服务(例如 20-21 用于 FTP,23 用于 telnet)。因此,例如,98.222.222.38:22100 可以将端口转发到 192.168.1.3:22