我的目标是检查天气目标端口(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。 netstat -ant | grep 3306 服务器上的netstat -ant | grep 3306会告诉MySQL是否正在监听一个可到达的端口。 从服务器外部都不能访问127.0.0.1和::1 。 来自traceroute dest.com输出显示从第二跳向前100%的数据包丢失。 最可能的解释是在连接结束时configuration不当的防火墙。 它可能会丢弃传出的UDP数据包。
从telnet dest.com 3306和traceroute -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监听实际的面向互联网的接口?