Вопрос по python, sockets, ethernet – Как отправить необработанный кадр Ethernet в Python?

4

Мне нужно сделать проект за несколько дней, это базовый интерфейс клиента и сервера. Подвох в том, что это должны быть все сырые сокеты. У меня нет проблем с созданием этого, я просто застрял при отправке пакетов.

Сначала я попытался привязать его к интерфейсу «en1»; но это продолжает давать мне ошибкуnodename not known, Когда я привязываю его к своему локальному IP-адресу, он работает нормально. После этого я создал класс необработанных пакетов, все в шестнадцатеричном формате. Затем я сделал sendto call, чтобы отправить его по проводам.

Проблема в том, что когда я перехватываю пакет с помощью wireshark, он обнаруживается как полезная нагрузка пакета ipv4. Я не хочу, чтобы он делал заголовки автоматически, для этого и был мой класс пакетов в любом случае. Вы знаете, как я могу убрать эти заголовки?

Вот мой код - только необработанная функция:

def raw():
    HOST = gethostbyname('192.168.1.10')

    s = socket(AF_INET, SOCK_RAW, IPPROTO_IP)
    s.bind((HOST, 0))

    s.setsockopt(IPPROTO_IP, IP_HDRINCL, 0) #no headers - it wont work!!

    pckt = packet("\x68\x65\x6c\x6c\x6f")
    netpacket = pckt.getpacket()

    print "Sending.. "
    print ""

    s.sendto(netpacket, ('192.168.1.1', 80))
    data = s.recv(4096)
    print data

o и вот захваченный пакет с приветом в конце:

007f 2809 6da2 28cf daee 2156 0800 4500 004d 1bfc 0000 4000 db59 c0a8 010a c0a8 0101* 007f     

2809 6da2 28cf daee 2156 0800 4500 0036 2352 4000 4006 0000 c0a8 010a c0a8 0101 15c0 0050 

0000 0000 0000 0000 8010 813b 0000 68656c6c6f -hello

* это начало полезной нагрузки, хотя оно и должно было быть началом пакета также я не собираюсь использовать какие-либо другие модули, я должен использовать сокет.

@NoahKoster: Если вы действительно пытаетесь отправить необработанный кадр Ethernet, как вы говорите в заголовке, почему вы используете сокет AF_INET, привязанный к IP-адресу? Разве вы не используете AF_PACKET, привязанный к интерфейсу? talonmies
Интересный вопрос, я не могу помочь, но, возможно, этот вопрос актуален:stackoverflow.com/questions/6329583/… Daniel Figueroa
Терпение это добродетель. Также имейте в виду, что чем проще вы сделаете свой вопрос для чтения, тем больше вероятность того, что кто-то сможет быстро понять природу вашей проблемы и предложить полезное решение (подсказка: правильная капитализация и разрывы абзацев очень помогают) talonmies
спасибо, ребята, я еще не пробовал на Linux, но я думаю, что мог. я вернусь к вам, если он работает на Linux. У меня есть Mac OSX кстати с Windows 7, XP и Debian. я добавлю Linux прямо сейчас ... и я извиняюсь за то, что не терпел. Noah Koster
Другие примеры используют AF_PACKET вместо AF_INET, вы можете попробовать его, если вы работаете в Linux, так как он, похоже, специфичен для Linux. Roland Smith

Ваш Ответ

2   ответа
0

В ответ на ваш вопрос, Эндрю, вот пример:

Этот ответ помог мне заставить работать WoL. В этом случае данные:

preamble = bytearray((0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF))
MAC = bytearray((0x00, 0x14, 0x85, 0xa4, 0x73, 0xce))
data = PREAMBLE + 16*MAC
6

Благодаря комментариям на этот вопрос мне удалось установить соединение с сервером. все, что нужно, это изменить семейство адресов на af_packet в Linux. Затем я связал его с моим никелем и отправил. это сработало. спасибо за помощь людям! Вот пример кода:

s = socket(AF_PACKET, SOCK_RAW)
s.bind(("en1", 0))
pckt = packet() #my class that initializes the raw hex
data = pckt.getpacket()
s.send(data)
message = s.recv(4096)
print s
print s.decode('hex')

Это должно быть в Linux или Debian. Насколько мне известно, это не работает в Mac OSX. ИДК про окна. Если у вас есть Mac, используйте Pycap или Scapy, они работают нормально.

Я не могу опубликовать здесь код, поэтому смотрите ниже для получения данных, которые работали для меня.
Спасибо, что поделился! Можете ли вы опубликовать пример, который отправляет строку или что-то? Не ясно, насколько «волшебно». абстрагируется вашим "пакетом" учебный класс.

Похожие вопросы