tcpdump学习

2018-12-16  本文已影响0人  Devops_cheers

linux提供了tcpdump这个工具进行网络数据抓包。通过对抓包的数据进行分析,可以排查解决一些疑难问题。例如网络程序异常崩溃、网络应用程序响应慢、网络不可用等。

libpcap

tcpdump底层依赖的是libpcap库。libpcap使用了一种不同的套接字:PF_PACKET。PF_PACKET套接字作用于数据链路层。数据的传递并不是先经过libpcap处理,然后再传递给上层协议栈,而是在链路层增加了旁路处理机制,这种机制不会干涉原有的数据处理逻辑,更不会因抓包软件的出错而导致原本的处理流程异常,这与iptables的监控机制不同。在C语言中使用PF_PACKET套接字的方法如下:

# include <sys/socket.h>
# include <netpacket/packet.h>
# include <net/ethernet.h>
packet_socket = socket(PF_PACKET, int socket_type, int protocal)

socket_type可以是SOCK_RAW和SOCK_DGRAM,区别是SOCK_RAW由用户自己处理链路层协议头,而后者由系统处理。

BPF

libpcap的抓包是在内核空间工作的,如果抓到的包不加过滤全部拷贝到用户空间,让用户进程进行过滤,那么开销会很大,特别是在高流量的场景下。类似的epoll相比于poll的优势中有一点,就是优化了文件描述符在两个空间的拷贝开销。BPF支持在内核态就将抓到的数据过滤,高效处理大量的网络数据。BPF 过滤代码从逻辑上看很类似于汇编语言,显然,由用户来写过滤代码太过复杂,因此 libpcap 允许用户书写高层的、容易理解的过滤字符串,然后将其编译为BPF代码。

tcpdump与iptables

根据上面的介绍,应该知道tcpdump直接作用于数据链路层。那么iptables作为防火墙拦截的流量能被tcpdump抓取到吗?
iptables依赖的netfilter工作在linux网络协议栈站中。情况分为两种:

tcpdump部分参数

tcpdump过滤器

tcpdump提供了丰富的过滤器,以支持抓包时的精细化控制,达到减少无效信息干扰的效果

以上的过滤器规则可以使用and或者or进行组合

tcmdump表达式

表达式由一个或多个'表达元'组成(nt: primitive, 表达元, 可理解为组成表达式的基本元素). 一个表达元通常由一个或多个修饰符(qualifiers)后跟一个名字或数字表示的id组成(nt: 即, 'qualifiers id').有三种不同类型的修饰符:type, dir以及 proto.

结语

tcpdump和wireshark是网络分析的两个非常重要的工具,高效的使用这两个工具,可以起到事半功倍的作用。

上一篇下一篇

猜你喜欢

热点阅读