[每周一更]-(第15期):网络抓包神器-tcpdump

时间:2022-10-09 11:30:50

[每周一更]-(第15期):网络抓包神器-tcpdump

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