Я пытаюсь поэкспериментировать с ICMP-протоколом и создал модуль ядра для Linux, который анализирует ICMP-пакет (обрабатывает пакет только в том случае, если поле кода ICMP является магическим числом). Теперь, чтобы протестировать этот модуль, я должен создать ICMP-пакет и отправить его на хост, где работает этот анализирующий модуль. На самом деле было бы неплохо, если бы я смог реализовать это ядро (как модуль). Я ищу что-то вроде пакета в ядре, я искал его, и нашел много статей, объясняющих время жизни пакета, а не учебники по его созданию. Пользовательское пространство, использующее пакетные устройства, было бы моим последним средством, это тоже те, которые очень гибки, например, когда я смогу установить ICMP-код и т. Д. И я не опасаюсь паники ядра :-) !!!!! Любые идеи обработки пакетов приветствуются.Создание ICMP-пакета внутри ядра Linux. Модуль
ответ
Сэр, я настоятельно рекомендую вам использовать модуль ядра для создания ICMP-пакетов.
Вы можете использовать raw-сокеты пользовательского пространства для создания ICMP-пакетов, даже сами по себе байт байта IP-заголовка. Таким образом, вы можете получить как можно более гибкие, как это можно получить.
Пожалуйста, обратите внимание на этот
ip = (struct iphdr*) packet;
icmp = (struct icmphdr*) (packet + sizeof(struct iphdr));
/*
* here the ip packet is set up except checksum
*/
ip->ihl = 5;
ip->version = 4;
ip->tos = 0;
ip->tot_len = sizeof(struct iphdr) + sizeof(struct icmphdr);
ip->id = htons(random());
ip->ttl = 255;
ip->protocol = IPPROTO_ICMP;
ip->saddr = inet_addr(src_addr);
ip->daddr = inet_addr(dst_addr);
if ((sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) == -1)
{
perror("socket");
exit(EXIT_FAILURE);
}
/*
* IP_HDRINCL must be set on the socket so that
* the kernel does not attempt to automatically add
* a default ip header to the packet
*/
setsockopt(sockfd, IPPROTO_IP, IP_HDRINCL, &optval, sizeof(int));
/*
* here the icmp packet is created
* also the ip checksum is generated
*/
icmp->type = ICMP_ECHO;
icmp->code = 0;
icmp->un.echo.id = 0;
icmp->un.echo.sequence = 0;
icmp->checksum = 0;
icmp-> checksum = in_cksum((unsigned short *)icmp, sizeof(struct icmphdr));
ip->check = in_cksum((unsigned short *)ip, sizeof(struct iphdr));
Если эта часть кода выглядит достаточно гибкой, то читать о сырых сокетов: D может быть, они самый простой и безопасный ответ на ваши потребности.
Пожалуйста, проверьте следующие ссылки для получения дополнительной информации
http://courses.cs.vt.edu/~cs4254/fall04/slides/raw_6.pdf
http://www.cs.binghamton.edu/~steflik/cs455/rawip.txt
http://cboard.cprogramming.com/networking-device-communication/107801-linux-raw-socket-programming.html очень хорошая тема, очень полезно имо
Перспектива сырых сокетов, кажется, что-то стоит испытания. На данный момент я выберу исходные сокеты на пробной основе, но читатели будут размещать учебники по пакетной обработке в пространстве ядра, если вы видели их где угодно. Очевидно, я вернусь и напишу космический пакет ядра Crafter И спасибо Adel- за что-то новое и захватывающее – Malice
Вы можете попробовать libcrafter для пакета зачарования на пользовательском пространстве. Очень прост в использовании! Библиотека способна обрабатывать или декодировать пакеты из наиболее распространенных сетевых протоколов, отправлять их на провод, фиксировать и сопоставлять запросы и ответы.
Например, следующий код корабль и отправить пакет ICMP:
string MyIP = GetMyIP("eth0");
/* Create an IP header */
IP ip_header;
/* Set the Source and Destination IP address */
ip_header.SetSourceIP(MyIP);
ip_header.SetDestinationIP("1.2.3.4");
/* Create an ICMP header */
ICMP icmp_header;
icmp_header.SetType(ICMP::EchoRequest);
icmp_header.SetIdentifier(RNG16());
/* Create a packet... */
Packet packet = ip_header/icmp_header;
packet.Send();
Почему вы хотите, чтобы обработать пакет ICMP на пространстве ядра? Просто для удовольствия? :-p
Ядро Linux включает в себя средство генератора пакетов pktgen для тестирования сети с предварительно сконфигурированными пакетами. Исходный код для этого модуля находится в net/core/pktgen.c
- 1. Модуль загрузки ядра Linux
- 2. Как скомпилировать модуль ядра Linux?
- 3. модуль ядра Linux Compile (lincan)
- 4. Как отлаживать модуль ядра Linux?
- 5. Linux модуль компиляции ядра предпосылками
- 6. Linux-модуль ядра, блокирующий весь Linux
- 7. Создание простого модуля ядра linux
- 8. Ячейка стека внутри ядра Linux
- 9. Понимание исключения внутри ядра linux
- 10. Предупреждающие флаги Makefile Linux-модуль ядра
- 11. Как автозагрузить модуль ядра в Gentoo Linux?
- 12. скомпилировать модуль ядра Linux с mkfile
- 13. Создайте модуль ядра Linux из исходного дерева
- 14. Как отключить модуль ядра Подпись в linux
- 15. Модуль ядра Linux - доступ к отображению памяти
- 16. Модуль ядра Linux copy_to_user не работает
- 17. модуль ядра linux умирает после 100000 прерываний
- 18. Модуль ядра Linux для мониторинга определенного процесса
- 19. Sofware pwm как модуль ядра linux
- 20. Модуль ядра Linux - возврат использования IOCTL ENOTTY
- 21. Как перекомпилировать один модуль ядра Linux?
- 22. Отладить модуль ядра linux с помощью gdb
- 23. Когда следует писать модуль ядра Linux?
- 24. Модуль ядра Linux копирует .text сегмент процесса
- 25. C - Linux - модуль ядра - заголовок TCP
- 26. Linux модуль ядра: метод ядра не определен (kthread_create_on_cpu)
- 27. Невозможно записать в память ядра через модуль ядра Linux (Ubuntu)
- 28. Создание модулей ядра для разных версий Linux
- 29. Как построить модуль ядра
- 30. beaglebone черный модуль ядра
Проверьте источник модулей netfilter, где они генерируют ответы icmp, например, для заблокированных портов. Но, как сказал Адель ниже, я бы использовал сырые сокеты из внешнего пользовательского пространства. –