如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
Linuxnetfilter源码分析内容基本上来自两篇文章:《Netfilter源码分析》—(独孤九贱http://www.skynet.org.cn/index.php)《LinuxNetfilter实现机制和扩展技术》——(杨沙洲国防科技大学计算机学院)一、IP报文的接收到hook函数的调用1.1ip_input.cip_rcv()函数以接收到的报文为例,类似的还有ip_forward(ip_forward.c)和ip_output(ip_output.c)intip_rcv(structsk_buff*skb,structnet_device*dev,structpacket_type*pt,structnet_device*orig_dev){structiphdr*iph;//定义一个ip报文的数据报头u32len;if(skb->pkt_type==PACKET_OTHERHOST)gotodrop;//数据包不是发给我们的IP_INC_STATS_BH(IPSTATS_MIB_INRECEIVES);//收到数据包统计量加1if((skb=skb_share_check(skb,GFP_ATOMIC))==NULL){/*如果数据报是共享的,则复制一个出来,此时复制而出的已经和socket脱离了关系*/IP_INC_STATS_BH(IPSTATS_MIB_INDISCARDS);gotoout;}if(!pskb_may_pull(skb,sizeof(structiphdr)))gotoinhdr_error;//对数据报的头长度进行检查,iph=skb->nh.iph;//取得数据报的头部位置if(iph->ihl<5||iph->version!=4)//版本号或者头长度不对,gotoinhdr_error;//头长度是以4字节为单位的,所以5表示的是20字节if(!pskb_may_pull(skb,iph->ihl*4))gotoinhdr_error;if(unlikely(ip_fast_csum((u8*)iph,iph->ihl)))gotoinhdr_error;//检查报文的检验和字段len=ntohs(iph->tot_len);if(skb->len<len||len<(iph->ihl*4))gotoinhdr_error;//整个报文长度不可能比报头长度小if(pskb_trim_rcsum(skb,len)){//对数据报进行裁减,这样可以分片发送过来的数据报不会有重复数据IP_INC_STATS_BH(IPSTATS_MIB_INDISCARDS);gotodrop;}returnNF_HOOK(PF_INET,NF_IP_PRE_ROUTING,skb,dev,NULL,ip_rcv_finish);//通过回调函数调用ip_rcv_finishinhdr_error:IP_INC_STATS_BH(IPSTATS_MIB_INHDRERRORS);drop:kfree_skb(skb);//丢掉数据报out:returnNET_RX_DROP;}1.2include/linux/netfilter.hNF_HOOK宏#ifdefCONFIG_NETFILTER_DEBUG#defineNF_HOOK(pf,hook,skb,indev,outdev,okfn)\nf_hook_slow((pf),(hook),(skb),(indev),(outdev),(okfn),INT_MIN)#defineNF_HOOK_THRESHnf_hook_slow#else#defineNF_HOOK(pf,hook,skb,indev,outdev,okfn)\(list_empty(&nf_hooks[(pf)][(hook)])\?(okfn)(skb)\:nf_hook_slow((pf),(hook),(skb),(indev),(outdev),(okfn),INT_MIN))#defineNF_HOOK_THRESH(pf,hook,skb,indev,outdev,okfn,thresh)\(list_empty(&nf_hooks[(pf)][(hook)])\?(okfn)(skb)\:nf_hook_slow((pf),(hook),(skb),(indev),(outdev),(okfn),(thresh)))#endif/*如果nf_hooks[PF_INET][NF_IP_FORWARD]所指向的链