×Закрыть

RAW_SOCKET

Пишу прожку на Python, связанную с темой сокетов, а именно raw socket. Программа должна генерировать пакеты и отправлять их с одной стороны. Принимать с другой.
Вот код, который генерирует и отправляет 20 пакетов:

#!/usr/bin/env python
from socket import socket, AF_PACKET, SOCK_RAW
import time
s = socket(AF_PACKET, SOCK_RAW)
s.bind(('enp0', 0)) # где enp0 - это мак адрес 

dst_addr = '\x01\x02\x03\x04\x05\х06' # адрес доставки
payload = 'PAYLOAD' # полезная нагрузка

packet = dst_addr + payload

i=20;
while(i > 0):
	i-=1
	
	s.send(packet.encode('utf-8'))
	print(packet.encode('utf-8'))
	time.sleep(1)
s.close()

Не знаю с помощью каких методов можно принимать эти пакеты. Может кто-то знает?

LinkedIn
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Допустимые теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter

Какой-то неправильный ethernet пакет Вы собираете и шлете

Он прописывает MAC Destination (это первые 6 байт в Ethernet frame), в простейшем случае этого должно быть достаточно чтоб пакет дошел до получателя.

Ну как сказать...я вот не берусь сразу казать:
А) что с этими пакетами сделает сетевое железо, особенно если оно умное
Б) что с такими пакетами сделает фаервол
В) и что получится, наконец, если МАК закодировать в UTF-8 %)
Лучше сразу привыкать делать правильные пакеты

А) что с этими пакетами сделает сетевое железо, особенно если оно умное

Поймет и простит

Б) что с такими пакетами сделает фаервол

Неизвестно что на стороне получателя, но ТС сказал, что он видит пакеты на другом конце. Получатель может читать данные с интерфейса в promiscuous mode, тогда фаервол ничего не сделает.

В) и что получится, наконец, если МАК закодировать в UTF-8 %)

Как я понимаю, первые 128 символов в таблице в UTF-8 кодируются одним байтом, т.е. код, вероятно, будет нормально работать.

Лучше сразу привыкать делать правильные пакеты

ЛУчше не заниматься ерундой и использовать scapy, который все сделает как надо.

Как я понимаю, первые 128 символов в таблице в UTF-8 кодируются одним байтом, т.е. код, вероятно, будет нормально работать.

А вторые 128? Мак использует все 256 комбинаций в каждой из 6-ти позиций (с некоторыми «но») (просто предполагаю, что 010203040506 чисто для примера и на этом месте должен быть мак реального получателя).

Поймет и простит

Если свич тупарик — простит, возможно. Более умное посчитает за bad/damaged и отфильтрует.

В общем — ерунда это всё — ТС нужно начать читать-разбираться в матчасти. Как в сетевой, так и в кодерской.
ПС: молчу уже про то, что гуглостековерфлоу содержит кучу ответов на этот конкретный вопрос %)

Если свич тупарик — простит, возможно. Более умное посчитает за bad/damaged и отфильтрует.

Что именно там damaged?

Destination MAC чувак судя по всему правильно указывает.
Дальше идут Source MAC, туда можешь писать что хочешь.

Дальше идет Ether Type — никто тебе не запрещает использовать Ether Type какой тебе нравится. Все что дальше — свичи не интересует.

Preamble в начале подставится сетевым интерфейсом автоматически. CRC checksum идет в конце и посчитается самим сетевым интерфейсом и будет правильно посчитана даже для такого «мусорного» пакета.

Как я понимаю, первые 128 символов в таблице в UTF-8 кодируются одним байтом, т.е. код,

Та блин нету, никакой utf-8 таблицы.
Это всего лишь мультибайтный формат кодирования Unicode символов.

А) эти пакеты будут передаваться лишь между двумя компьютерами, по кабелю Ethernet.
B) при отправке скорее всего не нужно кодировать МАК. Я ошибся

Возьми aiohttp все же лучше чем свой велосипед, там есть хорошие примеры асинхронного взаимодействия с сокетами

scapy не используете чисто из принципа?

просто в while принимать методом recv?

кстати если вы вдруг еще не прочитали man packet, man socket, советую прочесть

Подписаться на комментарии