内核数据包解析之过滤DHCH包

匿名 (未验证) 提交于 2019-12-03 00:28:02

前言
本文主要目的是从无线驱动中解析出dhcp报文,并将其滤除。

关于结构体struct sk_buf *skb
内核中sk_buff结构体在各层协议之间传输不是用拷贝sk_buff结构体,而是通过增加协议头和移动指针来操作的。如果是从L4传输到L2,则是通过往sk_buff结构体中增加该层协议头来操作;如果是从L4到L2,则是通过移动sk_buff结构体中的data指针来实现,不会删除各层协议头。这样做是为了提高CPU的工作效率。

要解决的问题
路由器是我们日常生活中不可或缺的产品,然而,在有些情况下,由于路由器的覆盖范围有限,需要用到扩展器来实现无线信号的扩展,对于扩展器,一般分为有线扩展器和无线扩展器,扩展器工作在桥模式下时,会出现多DHCP的问题,这时,我们就需要对某些接口上的DHCP包做一些特殊处理,因此,我们首先需要解决的就是如何从获取的数据包中识别DHCP报文以及在何处对这些报文做出处理。故本文需要解决的问题主要有两个:

  • 如何识别DHCP报文
    (1)、DHCP属于应用层协议
    (2)、DHCP协议采用UDP作为传输协议
    (3)、主机发送请求消息到DHCP服务器的67号端口,DHCP服务器回应应答消息给主机的68号端口
  • 在何处进行滤包
    (1)、__br_deliver
    (2)、__br_forward

    解析DHCP报文

/*   net/bridge/br_forword.c  */   /* check skb */ void phic_is_dhcp_skb(struct sk_buff *skb, int *dhcp_type) {     unsigned char *udpdata, *dhcp_pkt_type;     struct ethhdr *mh = (struct ethhdr *)(skb->mac_header);     if(mh->h_proto != htons(ETH_P_IP)) {         *dhcp_type = 0;         return ;     }      struct iphdr *iph = (struct iphdr *)ip_hdr(skb);     if(iph && iph->protocol != IPPROTO_UDP) {         *dhcp_type = 0;         return ;     }     // ip header --> iph->ihl*4;     struct udphdr *udph = (struct udphdr *) ((char *)iph + iph->ihl*4);     udpdata = (char *)udph + 8;       // point to udp data     if(udph && udph->source == htons(68) && udph->dest == htons(67))     {         dhcp_pkt_type = (char *)udpdata + 242;         *dhcp_type = udpdata[242];     } }

DHCP(v4)过程此处不再赘述,由于DHCP discovery是广播包,因此,对于路由器来说,广播包会首先被发到桥上,再从桥上分发到到桥上的各个接口,所以滤包的最佳位置是在数据包进行分发和被转发时

过滤DHCP报文

//滤包的位置, static void __br_deliver(const struct net_bridge_port *to, struct sk_buff *skb);  //分发函数 static void __br_forward(const struct net_bridge_port *to, struct sk_buff *skb); //转发函数  //在上述两个函数中,增加如下滤包代码,滤掉去往接口eth0.1的dhcp报文 int dhcp_type = 0; if (!strcmp(to->dev->name, "eth0.1"))  {     phic_is_dhcp_skb(skb, &dhcp_type);     if(dhcp_type == 0x01 || dhcp_type == 0x03)         return ; }

小结

sk_buf是一个很复杂的结构体,本人也只是略懂皮毛,在工作中碰到了相关的问题,解决后以此文来做一些记录,也留给需要的人,sk_buf贯通多层,能够精准的从该结构体中解析出自己想要的数据,可以更好的实现某些定制化功能或者是对无线驱动做一些更好的优化

最后附一篇博文:《内核扩展数据包的方法》
https://blog.csdn.net/NW_NW_NW/article/details/73251901

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!