2012-04-16 57 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