2

UDPメッセージを送信し、rawソケットを介してICMP応答を受信するPythontracerouteを実装しようとしています。ICMPパケットがキャプチャを回避しているように見える問題が発生しました。ICMP応答は、私が期待するとおりにwiresharkに表示されますが、ソケットは読み取るデータを受信しません。もう1つの問題は、sendto()がWindows 7のネットワーク上でパケットを取得しないため、Ubuntuを実行しているVirtualBoxでコードを実行していることです(パケットをキャプチャするためにWindowsでwiresharkを実行しています)。奇妙なことに、仮想マシンからpythonスクリプトを実行すると、wiresharkがICMPメッセージをキャプチャします。ただし、Windowsでスクリプトを実行しようとすると、ICMPメッセージがwiresharkに表示されません。(UDPパケットは魔法のようにWindowsで動作し始めました)

オンラインの例からソケットを設定するさまざまなバージョンを試してみました。bind()を使用して使用せずに試してみましたが、読み取りを行うソケットを生成する構成はないようです。ICMPメッセージを読み取るのを待つだけでタイムアウトになります。

また、udp送信ソケットを読み取ろうとすると、udpパケットが正常に読み取られることにも注意してください。IPPROTO_ICMPを設定するとすぐに、読み取りがタイムアウトします。

receive_responseメソッド:

def receive_response(rec_socket, packetid, tsend, timeout):
remain = timeout
print packetid
while remain > 0:
    ready = select.select([rec_socket], [], [], remain)
    if ready[0] == []:
        return
    print 'got something'

ソケットの設定:

rec_socket = socket.socket(socket.AF_INET, socket.SOCK_RAW, ICMP_CODE)
rec_socket.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1)
rec_socket.bind(("",0))      #played with using this statement and skipping it

受信するための呼び出しは単純です:

reached = receive_response(rec_socket, packetid, time.time(), timeout)
4

1 に答える 1

0

問題は、VirtualBoxがデフォルトでNATを使用してネットワークに接続することです。これは、仮想マシンがICMPメッセージであるため、仮想マシンがICMPメッセージを受信しないことを意味します。これに対する解決策は、「ブリッジネットワーク」モードを使用するようにVirtualBoxネットワークを構成することのようです。残念ながら、大学のネットワーク上にブリッジモードで仮想マシンをセットアップできないため、これを確認できません。それらがWindowsで機能しなかった理由としては、Windowsがrawソケットをサポートしていないことに関係しているに違いありません。

于 2012-12-12T09:36:39.050 に答える