首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Linux内核模块中手工创建ICMP数据包

在Linux内核模块中手工创建ICMP数据包
EN

Stack Overflow用户
提问于 2012-06-06 00:17:38
回答 3查看 4.3K关注 0票数 3

我正在尝试ICMP协议,并为linux创建了一个分析ICMP数据包的kernel-module (仅当ICMP代码字段是幻数时才处理数据包)。现在,要测试此模块,我必须创建一个ICMP数据包,并将其发送到运行此分析模块的主机。事实上,如果我能在内核本身实现它(作为一个模块),那就太好了。我正在寻找类似于内核中的packetcrafter的东西,我用谷歌搜索了一下,发现有很多文章解释了包的生命周期,而不是创建它的教程。用户空间packetcrafters将是我最后的手段,这也是那些高度灵活的,比如我将能够设置ICMP代码等。我不担心内核恐慌:-)!欢迎任何制作数据包的想法。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-06-06 04:46:53

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

您可以使用用户空间的原始套接字来定制ICMP数据包,甚至可以逐个字节地构建IP报头本身。所以你可以尽可能的灵活地使用它。

请看看这个

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2012-06-22 06:10:25

您可以尝试在用户空间中使用libcrafter来制作数据包。非常容易使用!该库能够制作或解码大多数常见网络协议的数据包,在线路上发送它们,捕获它们,并匹配请求和回复。

例如,下面的代码手工创建并发送一个ICMP数据包:

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2013-03-22 02:58:04

Linux内核包括一个包生成器工具pktgen,用于使用预先配置的包测试网络。此模块的源代码位于net/core/pktgen.c中

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10900964

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档