电脑桌面
添加小米粒文库到电脑桌面
安装后可以在桌面快捷访问

内核数据包处理VIP免费

内核数据包处理_第1页
1/10
内核数据包处理_第2页
2/10
内核数据包处理_第3页
3/10
数据包处理的一些建议前言我们大部分功能都需要解析数据,进行一系列的包匹配完成,但是目前,我们没有一个很好的框架来简化这个过程,大家处理数据包都是采用原生的linux内核接口,并且没有统一的规范要求如何使用这些接口,所以,存在大量的陷阱,一不留神就造成宕机。获取IP头部1)__netif_receive_skb()在进入三层处理前就对network_header进行了设置。2)ip_rcv()中详细的检查保证了IP头部到netfilter后是完整的。3)netfilter可以尽情使用ip头部。获取tcp头部错误1:陷阱:netfilter的钩子点是属于TCP/IP协议栈的三层流程中,而四层的TCP头部此时还没有正确获取,只是初始化为IP头部的值,无法直接使用。错误2:陷阱:structsk_buff{......sk_buff_data_ttransport_header;/*Transportlayerheader*/sk_buff_data_tnetwork_header;/*Networklayerheader*/sk_buff_data_tmac_header;/*Linklayerheader*/......}iph=ip_hdr(skb);tcph=tcp_hdr(skb);tcph=(char*)iph+(iph->ihl<<2);数据包可能是非线性的改进:接口介绍:计算三层头部相对于skb->data的偏移从skb的指定偏移取制定长度的数据,如果要取的数据位于线性区,直接返回其开始指针,否则,则拷贝到buffer中,并将buffer指针返回。tcpoff=skb_network_offset(skb)+(iph->ihl<<2);tcph=skb_header_pointer(skb,tcpoff,sizeof(_tcph),&_tcph);if(tcph==NULL)return;skb_network_offset(structskb_buff*skb)void*skb_header_pointer(structsk_buff*skb,intoffset,intlen,void*buffer)打印信息注意要点:1)IP地址输出Ipv4:%pI4%pi4IPv6:%pI6%pi62)MAC地址%pM%pm3)字节序的转换ntohs()ntohl()htons()htonl()__const_ntohl()__const_ntohs()__const_htonl()__const_htons()区别:__const_*()是编译时处理的。获取TCP负载风险:陷阱1:数据包可能是非线性的,同TCP头部。陷阱2:TCP头部数据有可能是被篡改过的,tcph->doff如果很大怎么办?改进1:printk("%pI4%d----->%pI4%dlen:%dID:%d\n",&iph->saddr,ntohs(tcph->source),&iph->daddr,ntohs(tcph->dest),ntohs(iph->tot_len),ntohs(iph->id));payload=(char*)tcph+tcph->doff*4;tcplen=skb->len-tcpoff;if(tcph->doff*4doff*4){printk("Badtcp.\n");returnNF_ACCEPT;}if(skb_is_nonlinear(skb)){printk("Nonlinearskb.\n");returnNF_ACCEPT;}payload=(char*)tcph+tcph->doff*4;payload_len=tcplen-tcph->doff*4;if(payload_len==0)returnNF_ACCEPT;接口介绍:判断skb的数据是否是非线性的改进2:改进3:tcplen=skb->len-tcpoff;if(tcph->doff*4doff*4){printk("Badtcp.\n");returnNF_ACCEPT;}if(skb_is_nonlinear(skb)){printk("Nonlinearskb.\n");returnNF_ACCEPT;}payload=(char*)tcph+tcph->doff*4;payload_len=tcplen-tcph->doff*4;if(payload_len==0)returnNF_ACCEPT;intskb_is_nonlinear(structsk_buff*skb)charpayload_buf[1500];tcplen=skb->len-tcpoff;if(tcph->doff*4doff*4){printk("Badtcp.\n");returnNF_ACCEPT;}payload_len=tcplen-tcph->doff*4;if(payload_len==0)returnNF_ACCEPT;if(payload_len>sizeof(payload_buf))returnNF_ACCEPT;payload=skb_header_pointer(skb,tcpoff+tcph->doff*4,payload_len,payload_buf);if(payload==NULL)returnNF_ACCEPT;tcplen=skb->len-tcpoff;if(tcph->doff*4doff*4){printk("Badtcp.\n");returnNF_ACCEPT;}if(skb_linearize(skb)){printk("Cannotlinearizeskb.\n");returnNF_ACCEPT;}payload=(char*)tcph+tcph->doff*4;payload_len=tcplen-tcph->doff*4;if(payload_len==0)returnNF_ACCEPT;接口介绍:将skb线性化解析数据1)判断数据包内容风险1:风险2:陷阱:如果payload的长度只有1个字节怎么办?改进:2)查找数据包中的某个字符串风险:陷阱:可能会越界,数据包不一定是以'\0'结束。改进:一定要使用这一系列的函数:strnchrstrncpyintskb_linearize(structsk_b...

1、当您付费下载文档后,您只拥有了使用权限,并不意味着购买了版权,文档只能用于自身使用,不得用于其他商业用途(如 [转卖]进行直接盈利或[编辑后售卖]进行间接盈利)。
2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。
3、如文档内容存在违规,或者侵犯商业秘密、侵犯著作权等,请点击“违规举报”。

碎片内容

内核数据包处理

确认删除?
VIP
微信客服
  • 扫码咨询
会员Q群
  • 会员专属群点击这里加入QQ群
客服邮箱
回到顶部