2012-04-16 11 views
0

私はPythonでICMPベースのTracerouteを実装しようとしています。PythonでのICMP traceroute

UDPベースのTraceroute(下のコード)を作成することができ、変更が必要な非常に役立つガイド(https://blogs.oracle.com/ksplice/entry/learning_by_doing_writing_your)が見つかりました。私はICMPに送信ソケットを変更しようとしましたが、例外なく実行するための何かを得ることはできません。

注 - これはUDP traceroute(UDPパケットを送信してICMPを受信する)ですが、ICMPパケットを送信してICMPパケットを受信するプログラムが必要です。基本的に、UDPソケットはICMPのために変更する必要があります。

これは試して達成するのが最も一般的なことではないと思いますし、これを行う方法についてネットで調べることに問題があります。原作者ヴァンを引き起こして、ICMPパケットを送信しながら、誰もがいくつかの洞察を提供することができれば、本当にUDPが原因RFC 791にあなたの最善のアプローチ

あると思う

#!/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

:-)いただければ幸い、トレースルートは無効でしたJacobsonはudpを使って再実装します。それでもICMPを送信することを主張した場合、さらに明確化http://www.inetdaemon.com/tutorials/troubleshooting/tools/traceroute/definition.shtml

のために、このページの脚注をチェックアウトし、このライブラリにアップロード用の

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

+0

グレートと面白い読み取り感謝をしてみてください。最近のレイヤ4のファイアウォールはランダムなUDPリクエストに応答したくないので、ICMPに固執する必要があります。そのため、ICMPは信頼性の高いトレースルートになりました。 誰かがこれを必要としていて、その全体の書き込みを読んでいると気にすることができない場合、置き換える必要があるコードは以下の答えになります。 – Jamesla

関連する問題