2012-04-21 5 views
3

私は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応答を送信するとは限らないためです。基本的に、UDPソケットはICMPのために変更する必要があります。

これは試して達成するのが最も一般的なことではないと思いますし、これを行う方法についてネットで調べることに問題があります。もし誰かが何らかの洞察を与えることができれば、本当に感謝します:-)

覚えておくべき主なポイントは、TTLを設定することでtraceroutesが機能することです。ソリューションがICMPライブラリを使用する場合、設定可能なTTLが必要です。 )

#!/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') 
+0

へのアクセスのpingを送信? – Keith

+1

あなたはあまりにも広い問題を説明しています(基本的に「私の仕事はすべて私のために」と言っています)。例外を含むコードを投稿し、例外を表示し、それらを修正する方法を尋ねると、役に立つ回答を得る可能性が非常に高くなります。あなたが投稿している瞬間には、明示的な質問は含まれていません。何かを尋ねる必要があります。 –

答えて

0

あなたはscapy、独自のパケットを構築し、/彼らと一緒に受ける基本的な送信を行うための優れたツールである、ソケットを自分で管理したくない場合。 pingの例hereを見つけることができます。これにより、独自のtracerouteを簡単に構築できるはずです(いくつかのドキュメントを読んでください)。

+0

この例は、実際にはTCP ping用であり、ICMP用ではありません。私はScapysのヘルプ機能を通して見栄えが良くなっていますが、ICMPにはあまり関係ないと思われますが、TCP/UDPは何にも適しています。 – Jamesla

+0

@Jamesla:実際には複数の例がありますが、最初はICMPですが、TCPとUDPのpingもあります。 ScapyはL2から上に何かを構築することができますが、私は完全にL2ベースのプロトコル(IPはまったくありません)を実装するためにしばらく使っていました。 – KillianDS

+0

おかげさまで読んでいただきありがとうございました。素晴らしいツールです。以下の正確なコードを含むソリューションを追加します。再度、感謝します。 – Jamesla

2

ここでは、Scapyを使用したソリューションがあります.KillianDSのおかげです。

ans,unans=sr(IP(dst="www.google.com",ttl=X)/ICMP()) 

あなたは何の問題を持っている回答

ans.summary(lambda (s,r): r.sprintf("%IP.src%")) 
関連する問題