tcpdump是一个运行在命令行下的数据包分析器。它允许用户拦截和显示发送或收到过网络连接到该计算机的TCP/IP和其他数据包。tcpdump 是一个在BSD许可证下发布的*软件。
一、使用tcpdump网络抓包的原则
- 抓包结果尽量少,过滤掉无用的信息,从而分离出有效的信息。
- 客户端和服务器端都能完全控制的情况下,同时在两端进行抓包分析确认
- 怀疑交换机等网络设计丢包时,在能够完全控制的情况下,使用端口镜像的方式,把网路基设备的进出流量引导到服务器上进行抓包分析确认。
常用参数
- 1、-i 参数,指定需要抓包的网卡,默认取系统中状态为UP的最小数字的网卡,如:eth0,有效地减少抓取到数据包的数量,增加抓包的针对性,便于分析工作
- 2、-nnn 参数,禁用tcpdump展示时把IP、端口等转换为域名、端口对应的知名服务名称,这样看起来更简洁。
- 3、-s 参数,指定抓包的大小,
- 4、-c 参数,指定抓包的数量
二、过滤器规则
- host a.b.c.d: 指定仅抓取本机和某主机a.b.c.d的数据通信
- tcp port x:指仅抓取TCP协议的端口或者源端口为x的数据通信
- icmp : 指定仅抓取ICMP协议的数据通信
- !:反向匹配,例如:port !22,抓取非22端口的数据通信
以上四种规则,可以使用 and 或者 or 组合
三、抓包分析工具
有些场景中,一台服务器,会部署多个应用程序,这些应用程序之间使用127.0.0.1本地回环地址进行TCP/IP通信
RawCap
- 由于Wireshark无法抓取到回环端口上的数据通信,原因:这些数据包并没有使用实际的网络端口进行发送
抓取127.0.0.1的数据通信,并且保存为mydump.pcap的方法:
RawCap.exe 1 mydump.pcap
四、配置Wireshark
4.1、禁用名称解析
名称解析尝试把数字的地址转换为人可读的形式。
- 名称解析经常失败,解析条目在名称服务器上不存在
- 解析的名字未保存在抓包文件中,在每次打开该文件中,可能发现解析出来的名称有所不同,影响判断
- DNS请求会导致抓包内容增加
- Wireshark 的缓存可能导致结果不准确
禁用方法:
Wireshark主界面,Edit->Preferences…,选中Name Resolution,将涉及到名字解析相关的去掉勾选。
4.2、使用TCP绝对序列号
默认情况下,TCP采用的是相对序列号,不利于核对客户端和服务器端双方的数据通信,
方法:
Wireshark主界面,Edit->Preferences…->Protocols,选中TCP,取消选中黑色框即可(Relative sequence numbers)
4.3、自定义HTTP解析的端口
有时,我们的HTTP应用并不是开放在80端口上,而是使用了自定义端口
方法:
Wireshark主界面,Edit->Preferences…->Protocols,选中HTTP, TCP ports中添加新的自定义端口号
五、使用追踪数据流功能
Wireshark中,对于TCP数据,提供了一种追踪数据流的功能,以四维数组(通信双方的IP地址,通信双方的端口号)为依据,可以追踪
该链接上的所有通信予以过滤展示。选中任何一个数据,右键选中:Follow TCP Stream,通信查询会清晰。
libpcap 自动化分析
使用tcpdump抓取HTTP包
tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
0x4745 为"GET"前两个字母"GE",0x4854 为"HTTP"前两个字母"HT"。
tcpdump 对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。显然这不利于分析网络故障,通常的解决办法是先使用带-w参数的tcpdump 截获数据并保存到文件中,然后再使用其他程序(如Wireshark)进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。
tcpdump采用命令行方式对接口的数据包进行筛选抓取,其丰富特性表现在灵活的表达式上。
不带任何选项的tcpdump,默认会抓取第一个网络接口,且只有将tcpdump进程终止才会停止抓包。
例如:
shell> tcpdump -nn -i eth0 icmp
细节:https://segmentfault.com/a/1190000038219738
只抓eth0上每个包的前80字节,并把结果存到/tmp/tcpdump.cap文件中
tcpdump -i eth0 -s 80 -w /tmp/tcpdump.cap
抓包针对具体的ip
tcpdump -i eth0 host ip -w /tmp/tcpdump.cap
扩展阅读:https://www.runoob.com/linux/linux-comm-tcpdump.html