我的目标是检查目标端口(MySQL 3306)是否能够连接。
首先,我尝试使用 telnet 但它显示No route to host
$ telnet dest.com 3306
Trying <dest_ip>...
telnet: Unable to connect to remote host: No route to host
但是,它可以与端口 80 连接。
$ telnet dest.com 80
Trying <dest_ip>...
Connected to dest.com.
Escape character is '^]'.
所以,我尝试了正常的traceroute,但目的地不可达。
$ traceroute dest.com
traceroute to dest.com (<dest_ip>), 30 hops max, 60 byte packets
1 172.16.101.1 (172.16.101.1) 0.283 ms 0.553 ms 0.345 ms
2 * * *
3 * * *
...
但是,当我尝试使用 traceroute -T -p 时,似乎可以到达目的地。
$ traceroute -T -p 3306 dest.com
traceroute to dest.com (<dest_ip>), 30 hops max, 60 byte packets
1 172.16.101.1 (172.16.101.1) 0.270 ms 0.374 ms 0.468 ms
2 <public_ip> (<public_ip>) ....
3 <public_ip2> (<pubice_ip2>) ...
4 ...
5 <dest_ip> (dest_ip) 4.144 ms !X 4.217 ms !X 3.996 !X
而且,当我尝试使用其他端口时,路线不同(仅一跳之遥)。
$ traceroute -T -p 80 dest.com
traceroute to dest.com (<dest_ip>), 30 hops max, 60 byte packets
1 172.16.101.1 (172.16.101.1) 0.327 ms 0.438 ms 0.568 ms
2 <dest_ip> (dest_ip) 0.711 ms 0.865 ms 0.974 ms
那么,我想知道如何traceroute -T -p
工作以及每个步骤中结果的原因是什么?
您的结果表明正在更改路由。
traceroute
这与如何操作无关。请重新运行您的测试,如果路由看起来不同,请再次重新运行它们。没有到主机的路由,可能是防火墙阻止了端口 3306。traceroute -T
尝试使用增加的 TTL 打开 TCP 连接。如果您连接到允许的端口,这在大多数情况下应该绕过防火墙。该机制在man traceoute
输出中进行了描述。当您的防火墙处于大部分关闭配置时,您的第一个输出是正常输出。除非有规则允许,否则正常的 UDP 跟踪路由将失败。
您的第二个请求显示了更长的路径。根据您的防火墙配置,这可能是正常路由。或者可能是尚未发现更短的路径。路由无关
traceroute
。!X
每次后面的注释表示通信是adminstratively prohibited
。AE 注释也包含在 traceroute 的手册页中。第三个请求使用短路路径。这可能是防火墙上的发夹式 NAT 配置。或者可能是发现了一条更短的路径。TCP 服务器似乎正在响应。
几点注意事项:
telnet
是您正在运行的测试的有效工具。我经常在命令前加上前缀,echo |
以便立即关闭连接。netstat -ant | grep 3306
服务器上将告诉 MySQL 是否正在侦听可访问的端口。既不能从服务器外部访问,127.0.0.1
也不::1
能从服务器外部访问。您的输出
traceroute dest.com
显示从第二个跃点转发 100% 的数据包丢失。最可能的解释是连接端的防火墙配置错误。它可能正在丢弃传出的 UDP 数据包。你的输出
telnet dest.com 3306
和traceroute -T -p 3306 dest.com
是一致的。就像告诉你的那样,!X
从意味着没有通往主机的路线。然而,关于没有路由到主机的消息来自您尝试访问的 IP 地址。这意味着要么 IP 对你撒谎,要么另一端发生某种 NAT,导致真实 IP 地址对你隐藏。traceroute
telnet
的输出
traceroute -T -p 80 dest.com
显示了一条更短的路线。看起来您的连接端的某些东西正在劫持发往端口 80 的流量。由于这些症状表明连接的每一端都发生了一些可疑的事情,因此可能存在两个单独的问题,您应该分别调试这些问题。为了帮助单独调试问题,您可以通过互联网连接访问第三台主机,而不会发生任何有趣的事情。这意味着用于调试的第三台主机上没有 NAT 和防火墙。
这不是您问题的答案,但可能会解决您的实际问题。
除了 localhost 接口之外,您还需要确保 MySQL 侦听实际面向 Internet 的接口吗?