1、netfilter回调 netfilter可以自定义增加hook点,而这些钩子函数可能修改skb报文,导致数据或者程序异常。Netfilter的五个钩子点,分别为NF_INET_PRE_ROUTING、NF_INET_LOCAL_IN、NF_INET_FORWARD、NF_INET_LOCAL_OUT、NF_INET_POST_ROUTING。 比如,如果是经过NF_INET_LOCAL_IN之后数据异常了,那么查找挂载在NF_INET_L...
1、netfilter回调 netfilter可以自定义增加hook点,而这些钩子函数可能修改skb报文,导致数据或者程序异常。Netfilter的五个钩子点,分别为NF_INET_PRE_ROUTING、NF_INET_LOCAL_IN、NF_INET_FORWARD、NF_INET_LOCAL_OUT、NF_INET_POST_ROUTING。 比如,如果是经过NF_INET_LOCAL_IN之后数据异常了,那么查找挂载在NF_INET_L...
(cherry picked from commit 92964c7) When we free cb->skb after a dump, we do it after releasing the lock. This means that a new dump could have started in the time being and we'll end up freeing their skb instead of ours. This patch saves the skb and module before we unlock so ...
1.先创建socket,内核dev_add_packet()挂上自己的钩子函数 2.然后在钩子函数packet_recvmsg中,把skb放到自己的接收队列中, 3.接着系统调用recv取出skb来,把数据包skb->data拷贝到用户空间 4.最后关闭socket,内核dev_remove_packet()删除自己的钩子函数 内核数据处理流程 内核在收到网卡发出的软中断后进行数据包的...
基本原理1.先创建socket,内核dev_add_packet()挂上自己的钩子函数2.然后在钩子函数packet_recvmsg中,把skb放到自己的接收队列中,3.接着系统调用recv取出skb来,把数据包skb->data拷贝到用户空间4.最后关闭socket,内核dev_remove_packet()删除自己的钩子函数内核数据处理流程内核在收到网卡发出的软中断后进行数据包的...
在上面函数中遍历 ptype_all,并使用 deliver_skb 来调用协议中的回调函数。 //file: net/core/dev.c static inline int deliver_skb(...) { return pt_prev->func(skb, skb->dev, pt_prev, orig_dev); } 对于tcpdump 来说,就会进入packet_rcv了(后面我们再说为啥是进入这个函数)。这个函数在 net/pa...
ptcpdump 是一个基于 eBPF 的 tcpdump 实现,具有一个额外的功能:当可用时,它会为每个数据包添加进程信息作为注释。该工具受到了 jschwinger233/skbdump 的启发。 目录 功能 安装 系统要求 使用 示例命令 示例输出 使用Docker 运行 后端 标志 与tcpdump 的比较 ...
软终端处理循环的最后是通过netif_receive_skb函数将将数据交给TCP/IP协议栈的。它会从数据包包头中取出协议信息,然后遍历注册在这个协议上的回调函数列表。这里的列表值得一提,分别是ptype_all和ptype_base。他们是hash table数据结构,分别对应通用数据包(ETH_P_ALL类型)和特定协议的数据包(ETH_P_XXX类型),其中...
在上面函数中遍历 ptype_all,并使用 deliver_skb 来调用协议中的回调函数。 //file: net/core/dev.cstaticinline intdeliver_skb(...){returnpt_prev->func(skb,skb->dev,pt_prev,orig_dev);} 对于tcpdump 来说,就会进入 packet_rcv 了(后面我们再说为啥是进入这个函数)。这个函数在 net/packet/af_packe...
在上面函数中遍历 ptype_all,并使用 deliver_skb 来调用协议中的回调函数。 //file: net/core/dev.cstaticinline intdeliver_skb(...){returnpt_prev->func(skb,skb->dev,pt_prev,orig_dev);} 对于tcpdump 来说,就会进入 packet_rcv 了(后面我们再说为啥是进入这个函数)。这个函数在 net/packet/af_packe...