Какой тип пакета принимает сырой сокет
Всем привет, я пытаюсь разобраться с тем, какой пакет видит сокет в программе. Я знаю, что единицей информации, передаваемой по сети, является интернет фрейм, которой содержит в себе заголовок и полезную нагрузку. Внутри этой полезной нагрузки находится заголовок «адресного» протокола. Потом идут сами данные, среди которых находится заголовок TCP/UDP. Правильно ли я понял структура интернет пакетов? И какой пакет получает сырой сокет, принимающий TCP и UDP пакеты?
Отслеживать
задан 7 окт 2021 в 12:02
WelcomeToMyTutorial WelcomeToMyTutorial
33 3 3 бронзовых знака
7 окт 2021 в 20:27
@avp, спасибо большое.
8 окт 2021 в 13:46
0
Сортировка: Сброс на вариант по умолчанию
Знаете кого-то, кто может ответить? Поделитесь ссылкой на этот вопрос по почте, через Твиттер или Facebook.
- c
- сеть
- сокеты
Сырой сокет
Сырой сокет — интерфейс программирования приложений (API), разновидность сокетов Беркли, позволяющий собирать TCP/IP-пакеты, контролируя каждый бит заголовка и отправляя в сеть нестандартные пакеты.
Пример
Создание сокета. Код на языке Си
. int i32SocketFD = socket( PF_INET, SOCK_RAW, IPPROTO_RAW ); .
Код на языке Си в ОС Windows
. wSocket = WSASocket(AF_INET, SOCK_RAW, IPPROTO_RAW, NULL, 0,0); .
Поддержка
В каждом конкретном случае необходимо проверять, поддерживает ли ОС сырые сокеты. Приблизительно поддержка отражена в таблице:
полностью поддерживает сырые сокеты после остановки брандмауэра («net stop alg»);
Ссылки
- TCP/IP Raw Sockets
- Крис Касперски «Сырость не радость»
- API
- Межпроцессное взаимодействие
Wikimedia Foundation . 2010 .
Как получить сырой tcp-пакет?
Собственно. Нужно получить пакет в сыром виде, выдрать оттуда мак и айпи источника. Проблема в том, что я не знаю, как этот самый сырой пакет получить.
Через C# пробовал raw сокет создавать, но вылазит ошибка, что ОС не поддерживает этот тип сокета. (windows 2003)
Помогите, пожалуйста, любой информацией.
PS: SendARP, arp -a, программы вроде Wireshark и CommView не подходят, так-как обязательно нужно незамедлительно отправлять ип и мак клиенту. Это нужно для дебага сети. В частности, для проверки «зеркалирования» маков роутером.
3 ответа
17 марта 2009 года
5.6K / / 13.08.2003
воспользуйтесь библиотекой winpcap
c RAW сокетами windows работает через одно место
17 марта 2009 года
4.8K / / 20.01.2000
18 марта 2009 года
78 / / 10.11.2007
Green, мне нужно узнать маки не от клиентов в своей подсети, а от роутеров (нужно, чтобы показывало, роутера ли это мак передается в сыром пакете, либо находящегося ЗА роутером клиента, так-как наш роутер поддерживает функцию проброса маков через себя, она нужна сейчас для биллинга))
Можно ли с помощью этого самого SNMP получить такую инфу у роутера? (я посмотрел сорс, но не совсем понял его назначения, завтра могу потестить и разобрать сорс на свежую голову, это какой-то отдельный протокол?)
squirL:
Спасибо, завтра покачаю доки на winpcap, я тоже рыл в эту сторону, но не мог найти функцию для получения пакетов, и уже было забил. 🙂
Особенности получения пакетов через raw socket в Linux
Linux (в отличии, к примеру, от FreeBSD) позволяет использовать сырые сокеты не только для отправки, но и для получения данных. В этом месте существуют интересные грабли, на которые я наступил. Теперь спешу показать их тем, кто еще на знает, чтобы каждый, используя свой любимый язык программирования, будь то C++ или Python, мог опробовать их в деле.
Суть граблей изображена на рисунке, чтобы те, кто уже в курсе, не тратили свое время.
Я буду писать примеры на С, но вы можете перенести их и на другие языки, предоставляющие возможность низкоуровневой работы со стеком TCP\IP в Linux.
Некоторые понятия
Напомню, что для инициализации сырого сокета мы передаем параметр, обозначающий тип протокола. Например UDP:
socket(AF_INET, SOCK_RAW, IPPROTO_UDP)
Этот протокол я буду называть уровнем на котором работает сырой сокет. В примере мы создали сырой сокет на уровне UDP.
Уровень сырого сокета не ограничивает вас в формировании пакета на отправку, вы можете самостоятельно сформировать как UDP, так и IP заголовок. А вот при получении данных начинается самое интересное…
Грабли
Допустим мы создали 2 сырых сокета на уровне UDP и воспользовались одним из них для отправки UDP пакета на UDP эхо сервер. Эхо вернет нам UDP payload обратно. Так вот, Стек TCP\IP скопирует полученный пакет на все сырые сокеты того уровня, который указан в поле Protocol IP заголовка пришедшего пакета. Еще раз повторюсь — на ВСЕ, даже те, которые открыты в других приложениях (по этой причине приложение, оперирующее сырыми сокетами может быть запущено только с правами суперпользователя). Так как UDP эхо сервер отвечает UDP пакетом, то все сырые сокеты UDP уровня его получат.
Отметим еще одну важную особенность. Не зависимо от уровня сырого сокета, ему доставляется полный пакет, включающий IP заголовки.
Таким образом, каждый сырой сокет в Linux является сниффером на том уровне, на котором он был создан. Следует помнить об этом при разработке приложений.
Пример
Не стал нагружать заметку кодом. Для тех, кому интересно попробовать, я
выложил свой пример на github. Там cmake проект, который собирает простенький UDP эхо-сервер и приложение, создающее 2 сырых сокета уровня UDP, один из которых посылает данные, но оба отправляются в epoll в ожидании ответа. Для чистоты эксперимента эхо-сервер и пример желательно пустить на разных машинах (не забудьте поправить код в соответствии вашим IP-шникам). Для интереса можно запустить несколько экземпляров примера.
Для внешкольного чтения есть хорошая статья.
Спасибо за внимание и поменьше граблей!