为什么我会收到 ssh 连接超时错误?

fyz*_*x92 5 windows ssh timeout

首先,我对 SSH 还很陌生。我以前用过它,但从来不需要处理太多的设置或导航细节。从 ServerFault 迁移。

每当我尝试从 Windows 10 计算机 ssh 到公共 IP 地址时,都会收到类似 的错误ssh: connect to username@<public ip address> port 22: Connection timed out

我可以使用私有IP地址从Windows连接到我自己的Linux机器,并且我的Windows机器使用ssh公钥/私钥身份验证连接到github。我的 Linux 机器可以通过 ssh 连接到外部服务器(如 AWS),据我所知,这只是我的 Windows 机器,而且只是公共 IP 地址。

这是带有该选项的输出-vv,在不同的端口上:

ssh -vv -p 2200 example.com                                                                                  OpenSSH_for_Windows_7.7p1, LibreSSL 2.6.5                                                                                       debug2: resolving "example.com" port 2200                                                                                       debug2: ssh_connect_direct: needpriv 0                                                                                          debug1: Connecting to example.com [93.184.216.34] port 2200.                                                                    debug1: connect to address 93.184.216.34 port 2200: Connection timed out                                                        ssh: connect to host example.com port 2200: Connection timed out   
Run Code Online (Sandbox Code Playgroud)

是什么导致了这个问题,我需要做什么来解决它,以便我可以从我的 Windows 10 计算机 ssh 到外部服务器?

我可以正常 ping 外部服务器:

Pinging 1.1.1.1 with 32 bytes of data:
Reply from 1.1.1.1: bytes=32 time=23ms TTL=54 
Reply from 1.1.1.1: bytes=32 time=74ms TTL=54
Reply from 1.1.1.1: bytes=32 time=26ms TTL=54
Reply from 1.1.1.1: bytes=32 time=24ms TTL=54
      
Ping statistics for 1.1.1.1:
packets: Sent = 4, Received = 4, Lost = 0 (0% loss),                                                                Approximate round trip times in milli-seconds:                                                                              Minimum = 23ms, Maximum = 74ms, Average = 36ms
Run Code Online (Sandbox Code Playgroud)

dav*_*dgo 2

发生这种情况的原因有很多 - 这些可能是由于某处存在防火墙所致。

SSH 位于 TCP 之上。当您收到连接超时错误时,这意味着问题是 SSH 客户端没有看到服务器的任何响应(即 TCP 握手未完成),这几乎总是意味着问题不在于 SSH,而在于较低的问题。等级。这也解释了为什么您会在 SSH 未侦听的端口上收到此错误。

我做的第一件事是检查防火墙规则以检查它们是否允许 SSH 通过。由于问题似乎仅限于您的笔记本电脑/台式机,因此检查本地防火墙和 AV 软件是一个不错的起点。

如果这不能解决问题,请使用流量嗅探器 - 查看服务器是否接收和发送流量是一个有用的提示。作为它的Linux,运行类似的东西

  tcpdump -n -i any src or dst XXX.XXX.XXX.XXX 
Run Code Online (Sandbox Code Playgroud)

如果 XXX.XXX.XXX.XXX 是您的外部 IP,并且您通过与您的桌面不在同一个人上的计算机进行监控,则非常有用。(也许可以通过 SSH 连接到中间服务器,即使用蜂窝连接或 VPN?)

如果它是一个复杂的网络,您可能需要让网络管理员参与其中。如果它是一个简单的网络,您是网络管理员,您可能会怀疑路由器上的端口转发问题和/或与此相关的错误配置。

使用 VPN 可以“虚拟移动”连接的明显点,并且对于诊断/绕过防火墙问题很有用。

  • 要检查防火墙,我到底应该寻找什么?我已打开 Windows Defender,但没有看到与 ssh 相关的明确出站规则或应用程序权限条目。有很多与网络和 shell 相关的内容,但对我来说没有什么真正突出的。 (2认同)