2012-04-16 59 views
0

我想在Python中实现基于ICMP的Traceroute。Python中的ICMP跟踪路由

我发现一个非常有用的指南(https://blogs.oracle.com/ksplice/entry/learning_by_doing_writing_your),它允许我创建一个基于UDP的Traceroute(下面的代码),所以只需要修改。我已经尝试将发送套接字更改为ICMP,但是我无法获得任何可以运行的例外情况。

注 - 下面的代码工作,但这是一个UDP跟踪路由(发送一个UDP包并接收一个ICMP包),我需要我的程序发送一个ICMP包并接收一个ICMP包。本质上UDP套接字需要为ICMP更改。

我想这不是最常见的尝试和实现的事情,并且在网上如何做到这一点上遇到麻烦。如果有人可以提供一些有识之士也将非常感激:-)

#!/usr/bin/python 

    import socket 

    def main(dest_name): 
     dest_addr = socket.gethostbyname(dest_name) 
     port = 33434 
     max_hops = 30 
     icmp = socket.getprotobyname('icmp') 
     udp = socket.getprotobyname('udp') 
     ttl = 1 
     while True: 
      recv_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, icmp) 
      send_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, udp) 
      send_socket.setsockopt(socket.SOL_IP, socket.IP_TTL, ttl) 
      recv_socket.bind(("", port)) 
      send_socket.sendto("", (dest_name, port)) 
      curr_addr = None 
      curr_name = None 
      try: 
       _, curr_addr = recv_socket.recvfrom(512) 
       curr_addr = curr_addr[0] 
       try: 
        curr_name = socket.gethostbyaddr(curr_addr)[0] 
       except socket.error: 
        curr_name = curr_addr 
      except socket.error: 
       pass 
      finally: 
       send_socket.close() 
       recv_socket.close() 

      if curr_addr is not None: 
       curr_host = "%s (%s)" % (curr_name, curr_addr) 
      else: 
       curr_host = "*" 
      print "%d\t%s" % (ttl, curr_host) 

      ttl += 1 
      if curr_addr == dest_addr or ttl > max_hops: 
       break 

    if __name__ == "__main__": 
     main('google.com') 

回答

4

我觉得UDP是你最好的办法

由于RFC 791,同时发送ICMP数据包,导致原作者凡路由跟踪是无效的Jacobson使用udp来重新实现。结帐此页的脚注进一步澄清http://www.inetdaemon.com/tutorials/troubleshooting/tools/traceroute/definition.shtml

如果你还是坚持发送ICMP,试试这个库

http://code.activestate.com/recipes/409689-icmplib-library-for-creating-and-reading-icmp-pack/

+0

大和有趣的阅读感谢张贴。我需要坚持使用ICMP,因为现在第4层防火墙不喜欢回复随机的UDP请求,所以事实证明ICMP现在是更可靠的traceroute。 如果有其他人需要这个,并且不会因为阅读整个文档而烦恼,那么需要替换的代码在下面的答案中。 – Jamesla 2012-04-17 00:32:24