Сырые сокеты и sendto в python

Я работаю над интеграцией 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)) разъем.ошибка: [Errno 22] Неверный аргумент

Если у вас нет scapy, не хотите его использовать, это пакет в кодировке base64:

import base64
spkt1 = base64.b64decode("RQAAKAABAABABvvOAAAAAH8AAAEAFABQAAAAAAAAAABQAiAAEH4AAA==")

Очень странно, что появляется почти идентичный пакет должны быть отправлены правильно:

spkt2 = base64.b64decode("RQBAAAWwAAACBgAAAAAAAH8AAAEAyAOEAAAAAAAAAACwAgDIAHsAAAIEBbQBAwMBAQEICk3PUjMAAAAABAIAAA==")

Вот как выглядят эти два пакета:

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

Если вы не добавляете нули, он не работает.

13
задан Arturo Filastò - hellais 12 June 2012 в 21:50
поделиться