tcpdump简单来说就是输出网络上的数据报文。可以根据使用者的选择来对网络上的数据报文进行截获并进行分析。
可以根据网络协议、物理接口、ip地址和端口号等各种条件进行过滤,还可以对抓获报文大小进行控制,等等。
1. 抓取报文
最简单的开始捕获报文的方法是直接使用tcpdump并指定捕获的网卡名称即可。
tcpdump -i eth0
可以使用ctrl+c来结束捕获程序。tcpdump的可视化输出功能有限。通常是捕获报文并保存下来,然后使用图形用户界面软件wireshark来分析。
可以使用-w选项来指定文件名即可将报文保存下来。
tcpdump -i eth0 -s 1500 -w aaa.cap
tcpdump有很多参数来控制在哪里捕获,如何捕获,以及捕获文件如何保存处理等选项,
-i interface 指定监听的网卡
-s 指定每个报文中截取的数据长度,不是缺省的68字节。如果仅仅对报头感兴趣,可以不使用该选项,指定为0说明不限制报文长度,而是捕获整个报文。一般以太网的MTU值为1500,因此指定长度为1500即可。
-w filename 报文保存到文件
-c 当收到指定报文个数后退出
-e 打印链接头,如MAC地址(print the link-level header on each dump line. This can be used, to print MAC layer addresses for protocols)。
-n 不要将IP地址和端口号进行转换,转换需要CPU时间
-G <rotate_seconds> 每隔指定的时间,将捕获的报文循环保存为新文件。需要-w配合使用,并指定时间格式才能循环保存文件,否则覆盖原来文件。常用事件格式%d(每月中的第几天),%H(当前的小时时间),%M(当前的分钟时间),%S(当前的秒时间)。
-D 输出tcpdump可以捕获的接口列表,包含接口编号和接口名称
-v 当解析或打印时输出详细的信息。例如报文的生存时间TTL、ID等IP报文选项。
-r 读取有-w创建的报文
-t 不打印时间戳
tcpdump -i eth0 -s 1500 -G 60 -w wang%H%M%s.pcap tcpdump -i eth0 -n -v -c 500
2. 匹配规则
只有符合表达式要求的报文才会被抓取到。
表达式由一个或多个基本元素加上连接符组成,这些基本元素也称为原语,是指不可分割的最小单元。基本元素由一个ID和一个或多个修饰符组成,有3种不同类型的修饰符。
第一种是类型修饰符,共4个类型修饰符,分别为host、net、port和portrange。
host指定要捕获的主机或ip地址。
net需要捕获报文的子网。
port和portrange分别用于指定端口和端口范围。
第二种是传输方向的修饰符,包括src和dst。不仅可修饰地址,也可修饰端口。
tcpdump -i eth0 'dst port 80' -v tcpdump -i eth0 'prot 5060 and src 192.168.1.100' -v
第三种是协议修饰符,可以基于特定的协议来进行过滤,可以是IP、ARP、RARP、ICMP、TCP和UDP等协议类型,如tcp port 21、udp port 5060等。
另外这些原语可以使用and(&&)、or(||)和not(!)来进行运算组合。所有的报文集合是全集,可以进行交、并和补集运算。在多个层次的集合运算时,可以使用小括号来分割其集合运算符的结合关系。
tcpdump -i eth0 -s0 -w wang.pcap host 10.0.0.15
tcpdump -i eth0 -w aaa.pcap port 59 or port 53 or port 80 or arp or icmp
摘自:智能路由器开发指南