2012-06-05 3 views
3

Я пытаюсь поэкспериментировать с ICMP-протоколом и создал модуль ядра для Linux, который анализирует ICMP-пакет (обрабатывает пакет только в том случае, если поле кода ICMP является магическим числом). Теперь, чтобы протестировать этот модуль, я должен создать ICMP-пакет и отправить его на хост, где работает этот анализирующий модуль. На самом деле было бы неплохо, если бы я смог реализовать это ядро ​​(как модуль). Я ищу что-то вроде пакета в ядре, я искал его, и нашел много статей, объясняющих время жизни пакета, а не учебники по его созданию. Пользовательское пространство, использующее пакетные устройства, было бы моим последним средством, это тоже те, которые очень гибки, например, когда я смогу установить ICMP-код и т. Д. И я не опасаюсь паники ядра :-) !!!!! Любые идеи обработки пакетов приветствуются.Создание ICMP-пакета внутри ядра Linux. Модуль

+0

Проверьте источник модулей netfilter, где они генерируют ответы icmp, например, для заблокированных портов. Но, как сказал Адель ниже, я бы использовал сырые сокеты из внешнего пользовательского пространства. –

ответ

0

Сэр, я настоятельно рекомендую вам использовать модуль ядра для создания 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 очень хорошая тема, очень полезно имо

+0

Перспектива сырых сокетов, кажется, что-то стоит испытания. На данный момент я выберу исходные сокеты на пробной основе, но читатели будут размещать учебники по пакетной обработке в пространстве ядра, если вы видели их где угодно. Очевидно, я вернусь и напишу космический пакет ядра Crafter И спасибо Adel- за что-то новое и захватывающее – Malice

0

Вы можете попробовать 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

0

Ядро Linux включает в себя средство генератора пакетов pktgen для тестирования сети с предварительно сконфигурированными пакетами. Исходный код для этого модуля находится в net/core/pktgen.c

Смежные вопросы