首先,我对 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
是什么原因导致了这个问题,我需要做什么来解决它,以便我可以从我的 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
答案1
发生这种情况的原因有很多 - 其中很可能是由于某处的防火墙造成的。
SSH 位于 TCP 之上。当您收到连接超时错误时,这意味着问题在于 SSH 客户端没有看到来自服务器的任何响应(即 TCP 握手未完成),这几乎总是意味着问题不在于 SSH,而是在较低级别。这也解释了为什么您会在 SSH 未监听的端口上收到此错误。
我做的第一件事是检查防火墙规则,检查它们是否允许 SSH 通过。由于问题似乎仅限于您的笔记本电脑/台式机,因此检查本地防火墙和 AV 软件是一个不错的起点。
如果这不能解决问题,请启动流量嗅探器 - 查看服务器是否接收和发送流量是一个有用的提示。由于它是 Linux,请运行类似
tcpdump -n -i any src or dst XXX.XXX.XXX.XXX
当 XXX.XXX.XXX.XXX 是您的外部 IP 并且您从与您的桌面不在同一台计算机上监控我们时,它会很有用。(也许通过 SSH 连接到中间服务器,即使用蜂窝连接或 vpn?)
如果网络复杂,您可能需要让网络管理员参与进来。如果网络简单,您是网络管理员,您可能怀疑路由器的端口转发存在问题和/或与此相关的配置错误。
使用 VPN 可以“虚拟移动”您的连接的明显点,并可用于诊断/绕过防火墙问题。