也许这是一个愚蠢的问题,所以请耐心等待,因为我是网络新手。今天,在尝试调试与服务器的连接问题时,我观察到以下两件事 -
我可以成功地在目标服务器上 ssh(端口 22)但是,当我运行 tracert 时,我得到了“请求超时”的结果。这有意义吗?我的意思是,如果我能够使用 FQDN 进行 ssh,那么我也应该能够进行 tracert(Windows 的跟踪路由版本),对吗?我在这里遗漏了什么?
如果我需要提供更多详细信息,请告诉我。
答案1
我可以成功地在目标服务器上 ssh(端口 22)但是,当我运行 tracert 时,我得到了“请求超时”的结果。这有意义吗?我的意思是,如果我能够使用 FQDN 进行 ssh,那么我也应该能够进行 tracert(Windows 的跟踪路由版本),对吗?我在这里遗漏了什么?
这完全说得通。如果服务器(以及服务器前面的任何防火墙)允许 SSH 流量进入服务器,但禁止 ICMP 流量进入服务器,那么您的结果正是我所期望的。我并不是说这里的情况绝对如此,但听起来确实如此。
答案2
traceroute
或者tracert
在 Windows 中,使用 几乎总是错误的工具来调试任何类型的应用程序,特别是最知名的应用程序,例如所有基于 TCP 的应用程序,都使用其默认设置。
这是因为它们默认使用 UDP 和/或 ICMP 数据包来跟踪路径,通过逐步增加数据包的 TTL 并期望每个被达到 TTL 的数据包击中的中间节点都使用以其自己的 IP 地址作为源的 ICMP 数据包进行回复,这样它就会被检测到,并最终发现整个路径。
如今,这种方法失败的次数比起作用的次数多,而且即使能起作用,其结果(特别是应答时间和丢弃百分比)也几乎毫无意义,并且总是与您想要调试的实际协议无关,例如在您的情况下,对于 ssh,TCP 端口 22 就是如此。
因为大多数网络都会过滤 ICMP 数据包(并且通常会错误地基于一些现在已成为神话的旧攻击)并且通常以不同于 TCP 的方式路由 UDP,并且应用不同的优先级。
因此,默认看到的路径可能与应用程序实际流量完全不同,包括根本不可用。
因此,我建议永远不要这样使用此工具(出于同样的原因,也不要ping
)。相反,任何现代工具都可以传递参数,例如-T --port=22
(有时只是tcptraceroute $host 22
),以强制它在您需要的特定端口上使用 TCP 数据包,ssh 为 22。通过这样做,您将准确观察到打开 ssh 连接时发生的情况(某些网络甚至可能针对这种情况应用一些过滤,通过“检测”与正常情况略有不同的跟踪路由流量,特别是如果您还进行 DPI,但这种情况比 ICMP 过滤或 UDP 和 TCP 的不同路径/优先级更少见)。
答案3
只是为了补充关于现代工具的评论,您可以查看使用 TCP 而不是 ICMP 的特定工具:
tcping。通过 tcp 连接进行 ping(即端口号)https://www.elifulkerson.com/projects/tcping.php
或 tcproute。通过 TCP 进行 traceroute(需要安装 WinPCAP,如果可用)https://www.elifulkerson.com/projects/tcproute.php