0%

网络抓包工具 tcpdump 的使用

tcpdump 是 linux 下最常用的抓包应用,这里记录下常见的用法和表达式语法。

常用命令

  1. 抓取某个网卡下的所有包:

    1
    tcpdump -i eth0
  2. 抓取来往 173.194.40.120 之间的所有包:

    1
    tcpdump host 173.194.40.120
  3. 抓取来往 173.194.40.120:80 之间的所有包,并不解析主机名和端口名

    1
    tcpdump -nn -i any host 173.194.40.120 and port 80
  4. 抓取来往 173.194.40.120:80 之间的所有包并展示 ASCII 码形式展示,且仅展示含有“User-Agent”的行

    1
    tcpdump -i any -A host 173.194.40.120 and port 80 | grep 'User-Agent'
  5. 以 16 进制方式展示抓取内容,

    1
    tcpdump -x
  6. 以 16 进制和 ASCII 码方式展示抓取内容

    1
    tcpdump -X

条件表达式

表达式决定了哪些数据包被捕获,表达式由一个或多个表达元组成,每个表达元通常由一个或多个修饰符 + id 组成。

常见的三种不同的修饰符 type、dir 和 proto。

type

修饰符指定 id 所代表的对象类型。

  • host 指定主机,如 www.baidu.com 或 127.0.0.1,如果 type 未设定,默认为 host
  • net 指定网络号 如 192.168
  • port 指定端口号
  • portrange 指定端口范围,如 8000 - 8008

dir

修饰符描述 id 所对应的传输方向。

  • src 传输源
  • dst 传输目的地
  • src or dst
  • src and dst

proto

修饰符描述 id 所属的协议。

可选协议:

  • ether
  • fddi
  • tr
  • wlan
  • ip
  • ip6
  • arp
  • rarp
  • decnet
  • tcp
  • udp

除以上所描述的表达元(‘primitive’), 还有其他形式的表达元, 并且与上述表达元格式不同. 比如: gateway, broadcast, less, greater 以及算术表达式,详情参考Linux tcpdump 命令详解

一些选项的介绍

  • -A 以ASCII码方式显示每一个数据包(不会显示数据包中链路层头部信息)。

  • -c count tcpdump 将在接受到 count 个数据包后退出。

  • -n 不对地址进行数字到名字的转换。

  • -nn 不对主机、端口号、协议等进行数字到名字的转换。

  • -x 当分析和打印时,tcpdump 会打印每个包的头部数据,同时会以 16 进制打印出每个包的数据(但不包括数据链路层的头部)。

  • -xx tcpdump 会打印每个包的头部数据,同时会以 16 进制打印出每个包的数据,其中包括数据链路层的头部。

  • -X 当分析和打印时, tcpdump 会打印每个包的头部数据,同时会以 16 进制和 ASCII 码形式打印出每个包的数据(但不包括连接层的头部).这对于分析一些新协议的数据包很方便。

  • -XX 当分析和打印时,tcpdump 会打印每个包的头部数据, 同时会以 16 进制和 ASCII 码形式打印出每个包的数据,其中包括数据链路层的头部。

  • -t 在每行输出中不打印时间戳。

  • -tt 每行打印时间戳。(nt: 这种格式一眼可能看不出其含义, 如时间戳打印成 1261798315)

  • -ttt 每两行打印之间会延迟一个段时间(以毫秒为单位)。

  • -tttt 在每行打印的时间戳之前添加日期的打印。