0

Python で ICMP ベースの Traceroute を実装しようとしています。非常に役立つガイド ( https://blogs.oracle.com/ksplice/entry/learning_by_doing_writing_your ) を見つけたので、UDP ベースの Traceroute を作成できるので、変更が必要です。しかし、私は周りを見回して、送信ソケットを変更して機能させるのに問題があります。誰でも私を助けることができますか?

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

3 に答える 3

0

古い質問ですが、最近これをしなければならなかったので、明確にするために別のポイントを追加します。

ソケットを使用して、ICMP traceroute のネイティブ Python バージョンを作成できます。解決すべき 2 つの重要な問題は次のとおりです。

  1. 正しいチェックサムを使用して ICMP ヘッダーを作成する (Eugene が上記で述べているように)
  2. sockopts を使用してソケットの TTL を設定する

最初の問題については、完璧に動作する pyping モジュールの素晴らしい例があります。これは、traceroute ユーティリティを作成したときに使用したものです。

2 つ目は、次のように簡単です。

current_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, 
                               socket.getprotobyname("icmp"))
current_socket.setsockopt(socket.IPPROTO_IP, socket.IP_TTL, ttl)

ここで、「ttl」は設定する TTL の整数値です

次に、TTLをインクリメントする制御構造で、送信/受信を実行し、戻りパケットのタイプ/コードを監視するだけです。

ヘッダーのパック/アンパックは、pyping モジュールに既に記述されているものをモデルにしました。中間ホップの場合はコード 0 のヘッダー タイプ = 11 を探し、目的地に到達した場合はヘッダー タイプ = 0 を探します。

Scapy は正常に動作しますが、速度が遅く、追加の外部依存関係です。AS-lookup (RADb 経由) と geolocation を使用して、ソケットだけを使用して、午後に堅牢な traceroute を作成することができました。

于 2017-01-06T04:52:10.143 に答える
-3

これは不可能だったので、scapy を使用して自分で作成することになりました。

于 2012-11-09T08:51:25.880 に答える