tcpdump 是 linux 下最常用的抓包应用,这里记录下常见的用法和表达式语法。
常用命令
抓取某个网卡下的所有包:
1
tcpdump -i eth0
抓取来往 173.194.40.120 之间的所有包:
1
tcpdump host 173.194.40.120
抓取来往 173.194.40.120:80 之间的所有包,并不解析主机名和端口名
1
tcpdump -nn -i any host 173.194.40.120 and port 80
抓取来往 173.194.40.120:80 之间的所有包并展示 ASCII 码形式展示,且仅展示含有“User-Agent”的行
1
tcpdump -i any -A host 173.194.40.120 and port 80 | grep 'User-Agent'
以 16 进制方式展示抓取内容,
1
tcpdump -x
以 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
在每行打印的时间戳之前添加日期的打印。