私は scapy と twisted の統合に取り組んでいますが、OSX でこの非常に奇妙なバグに遭遇しました。
基本的に、生のソケット経由で有効な TCP パケット (IP ヘッダーを含む) を送信できません。これは私がやっていることです:
import socket
from scapy.all import IP, TCP
pkt = IP(src='0.0.0.0', dst='127.0.0.1')/TCP()
spkt1 = str(pkt)
outs = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_RAW)
outs.setsockopt(socket.SOL_IP, socket.IP_HDRINCL, 1)
outs.sendto(spkt1, ('127.0.0.1', 0))
これを実行すると、次のエラーが表示されます。
outs.sendto(spkt1, ('127.0.0.1', 0))
socket.error: [Errno 22] Invalid argument
scapy をオンにしておらず、使用したくない場合は、base64 でエンコードされたパケットを次に示します。
import base64
spkt1 = base64.b64decode("RQAAKAABAABABvvOAAAAAH8AAAEAFABQAAAAAAAAAABQAiAAEH4AAA==")
非常に奇妙なことは、ほぼ同一のパケットが適切に送信されているように見えることです。
spkt2 = base64.b64decode("RQBAAAWwAAACBgAAAAAAAH8AAAEAyAOEAAAAAAAAAACwAgDIAHsAAAIEBbQBAwMBAQEICk3PUjMAAAAABAIAAA==")
2 つのパケットは次のようになります。
SPKT1
0000 45 00 00 28 00 01 00 00 40 06 FB CE 00 00 00 00 E..(....@.......
0010 7F 00 00 01 00 14 00 50 00 00 00 00 00 00 00 00 .......P........
0020 50 02 20 00 10 7E 00 00 P. ..~..
SPKT2
0000 45 00 40 00 05 B0 00 00 02 06 00 00 00 00 00 00 E.@.............
0010 7F 00 00 01 00 C8 03 84 00 00 00 00 00 00 00 00 ................
0020 B0 02 00 C8 00 7B 00 00 02 04 05 B4 01 03 03 01 .....{..........
0030 01 01 08 0A 4D CF 52 33 00 00 00 00 04 02 00 00 ....M.R3........
それらをwiresharkでチェックアウトすると、TCP部分のみが異なります。
私は多くの異なる実験を行い、最終的に特定の TCP オプションを設定してパケットを送信することができましたが、そのようなパケットが機能しないことは意味がありません。
なぜこれが起こっているのか誰にも分かりますか?
編集:
このパケットは動作しているように見えます:
pkt = IP(len=16384, src='0.0.0.0', dst='127.0.0.1',
id=RandShort(), ttl=2)/TCP(sport=255,
dport=900, flags="S", window=200,
options=[('MSS', 1460), ('WScale', 2)])
spkt = bytes(pkt)
spkt += '\x00'*20
ゼロを追加しないと機能しません。