Создание пакета ICMP внутри модуля ядра Linux



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

620   3  

3 ответов:

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

Если эта часть кода выглядит достаточно гибкой, то прочитайте о raw sockets: 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 очень хорошая тема, довольно полезная ИМО

Вы можете попробовать libcrafter для создания пакетов в пользовательском пространстве. Очень проста в использовании! Библиотека способна создавать или декодировать пакеты наиболее распространенных сетевых протоколов, отправлять их по проводам, захватывать их и сопоставлять запросы и ответы.

Например, следующий код craft и отправить пакет 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

Comments

    Ничего не найдено.