2016-07-11 31 views
0

Pythonでrawソケットを使用して単純なパケットスニッファを作成しました。Python TCP rawソケットがlo(localhost/127.0.0.1)でリッスンしません

import socket 

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP) 

while True: 
    print s.recvfrom(1600) 

インターネットトラフィックが表示されます。しかし、プライマリネットワークインターフェイスをオフにして、loインターフェイス(送信元と宛先127.0.0.1)を通じてscapyを使用してsynパケットを送信すると、何も印刷されません。

基本的には、ソースと宛先がwiresharkで表示される127.0.0.1のscapyを使用して10個のsynパケットを作成して送信します。しかし、このスニファではありません。私は長さの問題があるかもしれないと思った。だから、バッファサイズをsynパケットのサイズ、つまり74(s.recvfrom(74))に設定しましたが、それでも何もありません。プライマリネットワークインターフェイスを再び有効にするとすぐに、すべてのTCPトラフィックが表示されます。

自分で作成したトラフィック以外のトラフィックを受信しないように、ネットワークインターフェイスをオフにする必要があります。

ここで私はこれに間違っていますか? Linuxの

+1

レベルが '0x000'なので、ソケット' 0x003'(ETH_ALL)を作成する必要があります。しかし、「データなしでパケットを受信する方法は?」という質問があります。そしてループバックを聞く必要がありますが、すべてのパケットはあなたのものではありません。着信パケットがあなたのものでない場合、インターネットインターフェース上の他のパケットを自動的に無視します。 – dsgdfg

+0

ETH_ALLを@ dsgdfgの答えとして使用すると、イーサネットヘッダーが受信され、すべてのUDP、ICMP、TCPパケットが検出されます。私が 'loopback'で送るのはTCPだけです。だから私はそれを聞きたいのですが、私は何をすべきですか? – RatDon

答えて

1

soc = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(3)) 
soc.setsockopt(socket.SOL_SOCKET, socket.SO_RCVBUF, 2**30) 
soc.bind(("eth0",0x0003)) 

RAWないTCPを開く必要があります。コメントを

編集:

a = soc.recvform(65565)[0] 
h = binascii.hexlify(a) 
if h[24:30] == "080045" and h[46:48] == "06": 
# h[24:30] == "080045" Means IP (Type field of Ethernet Header 
#    combined with IP Version and IP header length) 
# h[46:48] == "06" Means TCP (Ip Protocol field of IP Header) 

    #do something with TCP packet 

"080045" が意味:

0800 = IP
4 = IPバージョン(IPv4)の
5 =ヘッダ長(4バイト毎の5つのワード)

+0

すべてのUDP、ICMP、TCPパケットをキャプチャします。私はパケットを解析し、TCPだけを取得するためのフィルタを追加する必要があります。すべてのインターフェイスまたは特定のインターフェイスでTCPパケットのみを聴くことは可能ですか? – RatDon

+0

@RatDon updated answer! – dsgdfg

+0

数字部分を説明できますか? '08004500'?一般に、 '24 'バイト目は' IP Protocol'フィールドであり、TCPでは '06'でなければなりません。これは1バイトなので、ネットワークバイトオーダーの影響を受けません。説明していただけますか? – RatDon

関連する問題