用户态 tcpdump 如何实现抓到内核网络包的?
扫描二维码
随时随地手机看文章
- tcpdump 是如何工作的?
- netfilter 过滤的包 tcpdump 是否可以抓的到?
- 让你自己写一个抓包程序的话该如何下手?
一、网络包接收过程
在图解Linux网络包接收过程一文中我们详细介绍了网络包是如何从网卡到达用户进程中的。这个过程我们可以简单用如下这个图来表示。找到 tcpdump 抓包点
我们在网络设备层的代码里找到了 tcpdump 的抓包入口。在 __netif_receive_skb_core 这个函数里会遍历 ptype_all 上的协议。还记得上文中我们提到 tcpdump 在 ptype_all 上注册了虚拟协议。这时就能执行的到了。来看函数://file: net/core/dev.c
static int __netif_receive_skb_core(struct sk_buff *skb, bool pfmemalloc)
{
......
//遍历 ptype_all (tcpdump 在这里挂了虚拟协议)
list_for_each_entry_rcu(ptype,