traceroute -T -p如何工作?

我的目标是检查天气目标端口(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 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运行方式无关。 请重新运行testing,如果路由显示不同,请重新运行它们。 没有路由到主机,可能是防火墙阻止端口3306。

traceroute -T尝试使用增加的TTL来打开TCP连接。 如果连接到允许的端口,这在大多数情况下应该绕过防火墙。 该机制在man traceoute输出中进行了描述。

当您的防火墙处于大部分closuresconfiguration时,您的第一个输出是正常输出。 除非有规则允许,否则正常的UDP跟踪路由将失败。

您的第二个请求显示更长的path。 根据您的防火墙configuration,这可能是正常的路由。 或者可能是一个较短的path还没有被发现。 路由与traceroute无关。 每次之后的!X注释表示通信被adminstratively prohibited 。 注释也包含在traceroute的手册页中。

第三个请求使用短path。 这可能是防火墙上的发夹NATconfiguration。 或者可能是发现了一条较短的path。 TCP服务器似乎在响应。

一些注意事项:

  • telnet是您正在运行的testing的有效工具。 我经常在命令前加上echo | 以便连接立即closures。
  • 初始失败表示您没有到服务器的路由。 在这种情况下,testing不会告诉你任何关于服务器连接的有用信息。
  • 当运行这样的testing时,如果得到不一致的结果,可以重试。 在这种情况下,你有不同的路由。 通常,path应该在第一个请求中被知道或发现。
  • netstat -ant | grep 3306 服务器上的netstat -ant | grep 3306会告诉MySQL是否正在监听一个可到达的端口。 从服务器外部都不能访问127.0.0.1::1

来自traceroute dest.com输出显示从第二跳向前100%的数据包丢失。 最可能的解释是在连接结束时configuration不当的防火墙。 它可能会丢弃传出的UDP数据包。

telnet dest.com 3306traceroute -T -p 3306 dest.com是一致的。 traceroute!X表示没有到达主机的路由,就像telnet告诉你的一样。 但是,关于没有路由到主机的消息来自您尝试访问的IP地址。 这意味着无论IP是在撒谎,还是在另一端发生某种NAT,导致真实的IP地址被隐藏起来。

traceroute -T -p 80 dest.com的输出显示了更短的path。 这看起来像是在连接的一端是劫持目的地为80端口的stream量。

由于症状表明在连接的每一端都有些鱼腥味,因此可能有两个独立的问题,您应该分别debugging这些问题。 为了帮助分开debugging这些问题,通过互联网连接访问第三台主机并不会有什么好玩的事情。 这意味着第三个主机上没有NAT,也没有防火墙用于debugging。

这不是你的问题的答案,但可以解决你的实际问题。

除了localhost接口外,还需要确保MySQL监听实际的面向互联网的接口?