使用tcpdump实现网络抓包

199 阅读3分钟

使用tcpdump实现网络抓包

作为一名开发者,使用各种工具实现网络抓包是一项基本技能,通过网络抓包可以帮助开发者分析网络的连通性,检查http请求发送的数据,从而排查问题,目前在Linux系统下,tcpdump是最广泛使用的抓包工具,而在windows环境下的可选择的抓包工具则非常多,有wireshark,fidder等,本文主要介绍tcpdump。tcpdump使用libcap库来实现抓包。

tcpdump的命令格式

tcpdump的抓包命令格式如下:

tcpdump [option] [proto] [dir] [type]

  • option: 可选参数
  • proto:协议类过滤器,支持指定协议过滤,可选的协议包括tcp, udp, icmp, ip, ip6等
  • dir:方向过滤器,根据数据包的来源过滤,包括src和dst两种
  • type:可识别的关键词有:host, net, port, portrange等,这些词后边需要再接参数
常见的tcpdump抓包参数
设置不解析域名提升速度
  • -n:不把IP转换为域名
  • -nn:不把协议和端口号转化成名字
  • -N:不打印host的域名部分
控制展示内容的详细程度
  • -v:产生详细的输出. 比如包的TTL,id标识,数据包长度,以及IP包的一些选项。
  • -vv:比-v更详细的输出
  • -vvv:比-vv更详细的输出
指定网卡
  • -i: 指定要过滤的网卡接口
显示控制
  • -A: 以 ASCII 字符串打印报文的全部数据
  • -X:以16进制和ASCII字符串打印报文的全部数据
读写文件
  • -r:从pcap文件中读取数据
  • -w:将抓到的数据包写入当中pcap文件当中
不进入网络混杂模式
  • -p:不让网络接口进入混杂模式。默认情况下使用 tcpdump 抓包时,会让网络接口进入混杂模式。一般计算机网卡都工作在非混杂模式下,此时网卡只接受来自网络端口的目的地址指向自己的数据。当网卡工作在混杂模式下时,网卡将来自接口的所有数据都捕获并交给相应的驱动程序。
指定抓取的数量
  • -c:指定抓取多少个包就退出
指定截取的数据长度
  • -s:tcpdump 默认只会截取前 96 字节的内容,要想截取所有的报文内容,可以使用 -s number, number 就是你要截取的报文字节数,如果是 0 的话,表示截取报文全部内容。

常见tcpdump的过滤条件

  • 指定IP地址抓包

tcpdump host 192.168.10.50

  • 区分源IP地址和目标IP地址

    • 源IP地址:tcpdump src host 192.168.10.50
    • 目标IP地址:tcpdump dst host 192.168.10.50
  • 指定端口抓包

tcpdump port 80

  • 指定网段抓包

tcpdump net 192.168.10.0/24

  • 指定协议版本抓包 tcpdump tcp
组合过滤器

过滤的真正强大之处在于你可以随意组合它们,而连接它们的逻辑就是常用的 与/AND/&&或/OR/||非/not/! 而在单个过滤器里,常常会判断一条件是否成立,这时候,就要使用下面两个符号 判断相等/==,判断不相等/!=。当你使用这两个符号时,tcpdump 还提供了一些关键字的接口来方便我们进行判断。

  • if:表示网卡接口名
  • proc:表示进程名
  • pid:表示进程 id
  • dir:表示方向,in 和 out

另外,当你在使用多个过滤器进行组合时,有可能需要用到括号,而括号在 shell 中是特殊符号,因为你需要使用引号将其包含。下面是一个复杂过滤条件的示例:

$ tcpdump "( if=en0 and proc =service ) || (if != en0 and dir=in)"

这条命令的含义是:抓取过滤来自进程名为 service 发出的流经 en0 网卡的数据包,或者不流经 en0 的入方向数据包。