我正在尝试使用ICMP协议(protocol),并为Linux创建了一个内核模块,用于分析ICMP数据包(仅当ICMP代码字段为幻数时才处理该数据包)。现在要测试该模块,我必须创建一个ICMP数据包并将其发送到运行此分析模块的主机。实际上,如果我可以将其本身实现为内核(作为模块),那就太好了。我正在寻找内核中的packetcrafter之类的东西,我在Google上搜索了很多文章,解释了包的生命周期,而不是创建包的教程。用户空间packetcrafters将是我的最后选择,那些高度灵活的应用程序,例如我将能够设置ICMP代码的地方,等等。而且我不担心内核 panic :-) !!!!!任何包装工艺的想法都欢迎。

最佳答案

先生,我强烈建议您不要使用内核模块来构建ICMP数据包。

您可以使用用户空间原始套接字来处理ICMP数据包,甚至可以逐字节构建IP header 本身。
因此,您可以像使用它一样灵活。

请看看这个

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一个非常好的主题,非常有用的imo

关于linux - 在Linux内核模块中制作ICMP数据包,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10900964/

10-12 05:10