tcpdump原理

基本原理


1.先创建socket,内核dev_add_packet()挂上自己的钩子函数

2.然后在钩子函数packet_recvmsg中,把skb放到自己的接收队列中,

3.接着系统调用recv取出skb来,把数据包skb->data拷贝到用户空间

4.最后关闭socket,内核dev_remove_packet()删除自己的钩子函数


内核数据处理流程


内核在收到网卡发出的软中断后进行数据包的处理,在数据包的处理函数netif_receive_skb中,先检查ptype_all中是否有注册的协议,如果有,则调用相应的处理函数,然后再到ptype_base中,找到合适的协议,将skb发送到相关协议的处理函数.比如ip协议(ip_rcv)或者arp(arp_rcv)

1.png

2.png


数据包的传递过程


3.png

简单来说数据包首先到网卡,然后通过软中断的形式触发内核对其处理,放入内存,最后再被应用程序读取。tcpdump是通过调用libpcap的api函数来实现的。下图中的BPF(伯克利包过滤,BPF能够通过比较第2、3、4层协议中各个数据字段值的方法对流量进行过滤)是包过滤器,bufferQ是给应用程序读取数据包的缓冲队列,tcpdump就是从bufferQ中抓取数据包。

4.png

libpcap在内核收发包的接口处收取skb_clone拷贝的网络包。skb_clone是内核中用来拷贝skb结构的函数,它会在内存中申请一块新的块用来存放拷贝的skb。



libpcap


tcpdump.c正式使用libpcap里的函数完成两个最关键的动作:获取捕获报文的接口,和捕获报文并将报文交给callback。

相关使用逻辑如下

5.png

我们知道tcpdump里的绝大多数动作是通过调用libpcap接口来实现的,通过这些接口我们自己也可以实现一个简单的抓包工具。下面是一些主要函数的解析:

pcap_start/pcap_activate:当tcpdump开始进行抓包的时候,会通过pcap_start创建一个句柄,再通过pcap_activate激活句柄

pcap_findalldevs:tcpdump指定对一个网卡列表进行抓包时会调用这个函数

pcap_lookupdev:返回第一个不是回环的网卡

pcap_open_offline:打开一个包存的文件

pcap_next:接收一个包

pcap_open_live:打开选择的设备

寻找一个设备

dev = pcap_lookupdev (errbuf);
  if (dev == NULL)
    {
      fprintf (stderr, "Couldn't find default device: %s\n", errbuf);
      return (2);
    }


设置过滤器


过滤器将网络包中过滤出我们想要的内容,通过如下函数创建

int pcap_compile(pcap_t *p, struct bpf_program *fp, char *str, int optimize,            bpf_u_int32 netmask)

第一个参数就是pcap_open_live返回的值,fp 是过滤器的版本,optimize表示是否需要优化,最后netmask是过滤器使用的所在子网掩码。创建完成之后使用pcap_setfilter函数进行编译,需要编译后才能使用。

int pcap_setfilter(pcap_t *p, struct bpf_program *fp)


抓包动作


有两种抓包技术:

一次抓一个,第一个参数是创建会话句柄,第二个参数存放包的信息

u_char *pcap_next(pcap_t *p, struct pcap_pkthdr *h)

收到包后先攒着,然后一次抓多个(主流)。第一个参数是会话句柄,第二个参数是指定抓多少包,第三个参数是每次抓多少包(每抓完一次这个数量就会进行回调,直到抓满第二个参数指定的数量),第四个参数表示抓包的用户(一些用户会用到)

int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)


常用例子


tcpdump –iany –Xs0 tcp and host 192.168.1.1 and port 9527


参考资料


http://www.tcpdump.org/manpages/pcap.3pcap.html

https://blog.csdn.net/notbaron/article/details/79735414

https://www.kernel.org/doc/htmldocs/networking/API-skb-clone.html


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章