之前写过一个用UDP协议实现的TraceRoute,发现返回的ICMP错误报告可能会被中间路由过滤掉,导致无法获取中间路由的主机信息。
比如从我的机器到www.baidu.com,一共需要八跳,在跟踪的时候就只能获得最后一跳的主机信息,之前的七跳都无法收到ICMP的错误报告,也就无法获得它们的主机信息。
有人说可以用TCP协议实现,但是我觉得就算用TCP协议,当TTL超时时,中间路由肯定也是用的ICMP的错误报告,所以应该也不能实现。
我在Ubuntu下使用tcptraceroute和traceroute -T来测试www.baidu.com,也证明TCP协议也同样失败了。请问大家有什么办法解决ICMP错误报告被过滤时导致TraceRoute中间跳数据丢失的问题吗?
谢谢大家!

解决方案 »

  1.   

    ICMP是独立于TCP和UDP的,和他们是平行的
    我记得有个tracer程序是用来检测路由的,你可以去搜搜源代码,原理大概就是设置尽量少的TTL,然后让路由返回错误,并分析路由的返回信息,获得中间路由器,那个代码是可以正常工作的
      

  2.   


    这个我知道,我也是这么写的。问题时“路由返回的错误”被中间的其他路由丢弃了,导致程序无法获取中间路由器。
    不能。Windows下的tracert和Ubuntu下的traceroute、tcptraceroute都不能显示中间跳信息。我觉得可能就是我的局域网的tp-link把ICMP错误报告过滤掉了。有什么其他办法不用ICMP错误报告的吗?
      

  3.   

    那应该是你的路由有问题,
    我这是可以的,而且记得以前测试的tracer代码也是可以显示的
      

  4.   


    不能。比如跟踪www.baidu.com,百度的前两级路由可能是他自己架设的,为了安全他屏蔽了ICMP错误报文。所以就算我在公司机房的机器上测试www.baidu.com(机器在公网,附近的路由都没问题),最靠近目标的那两级路由也是没有信息的。
      

  5.   

    那估计是你的路由器等有自己的设置造成这个了,你从client很难解决
      

  6.   


    我的表达可能让大家误解了,我并不是要突破我本地的路由器的限制。实际上网络中的路由都有可能屏蔽ICMP错误报文,比如www.baidu.com的主机的最近的那两个路由,很多其他公司的路由也是这样的。实际上我是想突破这一类路由的限制(PS:不是为了黑客目的,仅仅是为了traceroute)。