Отправка произвольных (необработанных) пакетов

Я видел, как его спрашивали в другом месте, но никто не ответил, к моему удовлетворению: как я могу получать и отправлять необработанные пакеты?

Под «необработанными пакетами» я подразумеваю, где я должен генерировать все заголовки и данные, чтобы байты были совершенно произвольными, и я никоим образом не ограничен. Вот почему сокеты Microsoft RAW не будут работать, потому что вы не можете отправлять пакеты TCP или UDP с неправильными адресами источника.

Я знаю, что вы можете отправлять пакеты, как я хочу, с помощью WinPCAP, но вы не можете получать с его помощью необработанную информацию, что мне также нужно делать.


person Seth Carnegie    schedule 17.06.2011    source источник
comment
Тогда давай, я буду первым: почему?   -  person Lightness Races in Orbit    schedule 17.06.2011
comment
Я пишу плагин для системы, которая позволит пользователю писать плагины для управления пакетными данными, если они этого хотят. Все это для поиска ошибок в сетевом приложении, чтобы убедиться, что оно может правильно обрабатывать искаженные данные.   -  person Seth Carnegie    schedule 17.06.2011
comment
@Seth: Конечно, вы можете получать необработанную информацию с помощью winpcap, как вы думаете, как работает wireshark? Или вы имеете в виду, что хотите получать недопустимые пакеты? Вероятно, они удаляются из сети еще до того, как достигают вашего компьютера.   -  person Ben Voigt    schedule 17.06.2011
comment
@Ben Voigt Неверно сформированные пакеты не отбрасываются. Деформированные кадры.   -  person cnicutar    schedule 17.06.2011
comment
@cnicutar: Вы уверены, что не существует сетевого оборудования, которое отбрасывает пакеты с неверными контрольными суммами IP (в качестве примера)?   -  person Ben Voigt    schedule 17.06.2011
comment
Почему люди в stackoverflow не могут доверять кому-либо, чтобы знать, что им нужно? Вы, ребята, вряд ли знаете все детали того, что мне нужно сделать, и, честно говоря, вам даже не нужно отвечать на этот вопрос. Так что всем, кто читает это, пожалуйста, не отвечайте, что вам это действительно не нужно. Если бы у меня была одна жалоба на SO, это была бы она.   -  person Seth Carnegie    schedule 17.06.2011
comment
В любом случае, winpcap также может получать данные, в первую очередь это основная цель библиотеки (вам, конечно, нужно отфильтровать данные, которые вас интересуют)   -  person nos    schedule 17.06.2011
comment
@Ben Voigt: я почти уверен, что помню, что Wireshark также перечисляет пакеты, которые не прошли контрольную сумму, так что даже это должно работать (при условии, что у них есть битовая ошибка на проводе после последнего маршрутизатора/ переключатель, понятно).   -  person Damon    schedule 17.06.2011
comment
@Damon: Это очень зависит от оборудования. Если ваше конкретное сетевое оборудование пересылает пакеты с неверной контрольной суммой, то wireshark выделит их для вас. Но это действительно большое ЕСЛИ.   -  person Ben Voigt    schedule 17.06.2011
comment
@Seth: Никто в этом вопросе не сказал, что вам это действительно не нужно или что-то близкое к этому.   -  person Lightness Races in Orbit    schedule 17.06.2011


Ответы (1)


Прежде всего решите, на каком уровне протокола вы хотите протестировать искаженные данные:

Ethernet

Если вы хотите генерировать и получать недопустимые кадры Ethernet с неправильной контрольной суммой Ethernet, вам более или менее повезло, поскольку контрольная сумма часто выполняется аппаратно, а в случаях, когда это не так, драйвер для сетевой карты выполняет контрольную сумму. и нет никакого способа обойти это, по крайней мере, в Windows. Однако NetBSD предоставляет эту опцию для большинства своих драйверов, которые выполняют контрольную сумму Ethernet в драйвере ОС.

Альтернативой является покупка специализированного оборудования (например, карты от Napatech, вы можете найти более дешевые), которое предоставляет API для отправки и получения кадров Ethernet, какими бы недействительными вы ни хотели.

Имейте в виду, что отправка путем отправки недопустимых кадров Ethernet, принимающая сторона или промежуточный маршрутизатор просто отбрасывают кадры, они никогда не достигнут ни приложения, ни уровня IP ОС. Вы будете тестировать сетевой адаптер или драйвер сетевого адаптера на принимающей стороне.

IP

Если все, что вам нужно, это отправлять/принимать недопустимые IP-пакеты, winpcap позволяет вам это сделать. Сгенерируйте пакеты, настройте winpcap для захвата пакетов, используйте winpcap для отправки...

Имейте в виду, что пакеты с недопустимой контрольной суммой IP и другими недопустимыми полями, стек TCP/IP, на котором работает принимающее приложение, просто отбрасывает IP-пакеты, как это делает любой маршрутизатор IP/уровня 3 между отправителем и получателем. Они не дойдут до приложения. Если вы создаете действительные IP-пакеты, вам также необходимо создать действительный UDP и реализовать сеанс TCP с действительными TCP-пакетами самостоятельно, чтобы приложение могло их обработать, иначе они также будут отброшены протоколом TCP/IP. куча

Вы будете тестировать нижнюю часть стека TCP/IP на принимающей стороне.

TCP/UDP

Это ничем не отличается от отправки/получения недопустимых IP-пакетов. Вы можете сделать все это с помощью winpcap, хотя маршрутизаторы не будут их выбрасывать, если заголовки Ethernet/IP в порядке. Однако приложение не будет получать эти пакеты, они будут отброшены стеком TCP/IP. Вы будете тестировать верхнюю часть стека TCP/IP на принимающей стороне.

Прикладной уровень

Это (разумный) способ фактического тестирования приложения (если ваше «приложение» на самом деле не является стеком TCP/IP или ниже). Вы отправляете/получаете данные, как любое приложение, использующее сокеты, но генерируете искаженные данные приложения по своему усмотрению. Приложение будет получать эти данные, они не отбрасываются нижними уровнями протокола.

Хотя одну конкретную форму тестов с TCP может быть трудно протестировать, а именно изменение отправляемых сегментов TCP, если вы, например. хотите проверить, правильно ли приложение интерпретирует данные TCP как поток. (например, вы хотите отправить строку «привет» в 5 сегментах и ​​каким-то образом заставить принимающее приложение читать () символы один за другим). Если вам не нужна скорость, вы обычно можете получить такое поведение, вставив паузы в отправку и отключив алгоритм Нагеля (TCP_NDELAY) и/или настроив MTU сетевой карты.

Помните, что любая лажа с протоколами более низкого уровня в потоке TCP, например. привести к тому, что один из пакетов имеет недопустимый / другой IP-адрес источника, который просто отбрасывается уровнями более низкого уровня.

Вы будете тестировать приложение, работающее поверх TCP/UDP (или любого другого IP-протокола).

Альтернативы

  • переключитесь на другую ОС, где вы, по крайней мере, можете использовать необработанные сокеты без ограничений последних окон.

  • Реализуйте решение для прозрачной вставки на основе альтернативы «Ethernet» или «IP», описанной выше. то есть у вас есть обычное клиентское приложение, обычное серверное приложение. Вы разрываете кабель между ними, вставляете свою коробку с двумя сетевыми картами, где вы программно изменяете байты полученных кадров и снова отправляете их обратно на другую сетевую карту. Это также позволит вам легко вводить задержки пакетов в системе. Сетевой фильтр Linux уже имеет эту возможность, которую вы можете легко создать поверх, часто с помощью простой настройки или сценария.

  • Если вы можете изменить принимающее приложение, которое хотите протестировать, заставьте его считывать данные из чего-то еще, например из файла или канала, и передавать ему случайные байты/пакеты по вашему желанию.

  • Гибридная модель, в основном для тестирования приложений TCP, но также полезна, например, для тестирование ответов UDP ICMP. Настройте TCP-соединение с помощью сокетов. Отправьте недопустимые данные приложения с помощью сокетов. Внедрите случайные искаженные пакеты (намного проще, чем программирование с необработанными сокетами, которые устанавливают сеанс TCP и затем вводят ошибки нижнего уровня). Отправляйте неправильно сформированные пакеты IP или UDP/TCP или, возможно, пакеты ICMP, используя WinPcap, хотя связывайтесь с кодом сокета с кодом winpcap, чтобы вы правильно указали адреса/порт, чтобы принимающее приложение увидело его.

  • Ознакомьтесь с NS/2.

person Lyke    schedule 17.06.2011