tcpdump 是一个实用的网络数据包分析工具,能够截获操作系统中的各种网络数据包。
tcpdump 主要有参数选项(options),和过滤规则表达式(expression)组成
$ tcpdump [options] expression
注意 tcpdump 的过滤规则表达式使用一对单引号或双引号,例如
tcpdump -v 'tcp port 80'
tcpdump 命令拥有相当多的参数选项,同时每个参数选项可以配合使用
-A 以 ASCII 码方式打印数据包信息(不包括链路层头信息),常用于 http 等协议分析,不能与 `-X` 同时使用
-b
-B 设置操作系统用于 tcpdump 数据包捕获缓冲区的大小,单位为 KiB (1024 bytes)
-c 当接收到这个参数指定的数据包数量后 tcpdump 自动退出
-C 此选项用于配合 -w 参数使用,设置由 -w 参数指定的文件的最大大小,超过则生成新的文件
-d 将获取到的匹配数据包代码以可读的形式输出到屏幕,然后自动退出
-dd 将获取到的匹配数据包代码以 C 语言格式形式输出到屏幕,然后自动退出
-ddd 将获取到的匹配数据包代码以十进制的形式输出到屏幕,然后自动退出
-D 输出系统中所有可用的网络接口列表
-e 在每个数据包输出中打印链路层头信息,例如 MAC 层协议和以太网层信息
-E 使用 des-cbc, 3des-cbc, blowfish-cbc, rc3-cbc, cast128-cbc 等算法解密 IPsec 的 ESP 数据包
-f 以数字格式显示非本机的 ipv4 主机地址,而不是显示域名
-F 从一个文件中读取过滤表达式,并且会忽略命令行参数中的过滤表达式
-G
-h 输出 tcpdump 的帮助信息
-H 尝试检测 802.11s 协议草案中规定的头信息
-i 设置用于 tcpdump 监听捕获数据包的网络接口,'any' 表示任何网络接口
-I 让接口工作在监听模式下,仅支持 IEEE 802.11 WiFi 的接口,
-j
-J
-K 不验证 IP, TCP 或者 UDP 的数据包校验和
-l 对标准输出进行行缓冲,只有遇到换行符时才会输出到屏幕
-L 列出指定网络接口所支持的数据链路层的类型,然后退出
-m 通过 module 指定的 file 装载SMI MIB 模块
-M 如果 TCP 数据包有 TCP-MD5 选项,为其摘要的验证指定一个公共的密钥
-n 不将主机地址解析成域名
-nn 不将主机地址解析成域名,并且不会将端口解析成服务
-N 不打印主机的域名部分,如果设置了此选现, tcpdump 将会打印 'nic' 而不是 'nic.ddn.mil'.
-# 在每一个数据包行前面打印一个可选的包编号
-O 不启用进行包匹配时所用的优化代码. 当怀疑某些 bug 是由优化代码引起的, 此选项将很有用.
-p 不将网卡设置为混杂模式,但接口依然会因为其他的一些原因可能会工作在混杂模式下
-Q 设置 tcpdump 过滤数据包的方向,可以为 'in' 、'out' 或者 'inout',但并不是在所有平台上都可用
-q 快速输出,仅输出精简的相关数据协议信息
-r 从一个文件中读取包数据. 如果文件名为 '-' 符号, 则 tcpdump 会从标准输入中读取包数据
-S 打印出绝对的 TCP 序列号,tcpdump 默认输出的是相对序列号
-s 设置 tcpdump 数据包大小,当超过这个大小数据会被截断,设置为 0 表示获取所有数据
-T
-t 不在每行数据包前面打印时间戳
-tt 在每一行数据包前打印时间戳,也就是从 1970 年开始至今的秒数
-ttt 在每一行上打印出当前行数据包与上一行数据之间的时间差值
-tttt 在每一行上打印小时、分钟、秒格式的时间戳
-ttttt 在每一行上打印出当前行数据包与第一行数据之间的时间差值
-u 打印未加密的 NFS 处理数据包
-U
-v 输出每一个数据包的基本详细信息
-vv 输出每一个数据包的更多详细信息
-vvv 输出每一个数据包的更加详细的信息
-V
-w 将 tcpdump 的原始数据包写入到一个文件中,而不是输出到屏幕
-W 此选项与 -C 参数配合使用,限制可打开的最大文件数
-x 以16进制形式打印出每个数据包的头部信息,其中不包括数据链路层的头部信息
-xx 以16进制形式打印出每个数据包的头部信息和数据包,其中包括数据链路层的头部信息
-X 以16进制和ASCII码形式打印每个包的头部信息和数据包,其中不包括数据链路层的头部信息
-XX 以16进制和ASCII码形式打印每个包的头部信息和数据包,其中包括数据链路层的头部信息
-y 设置 tcpdump 只捕获数据链路层协议类型是 datalinktype 的数据包
-z
-Z 如果在 root 权限下执行 tcpdump,可以让 tcpdump 切换到其他用户身份运行
--immediate-mode
--time-stamp-precision
输出所有 tcp 80 端口的数据包
$ tcpdump 'tcp port 80'
输出网卡 eth0 上的 tcp 80 端口数据包
$ tcpdump -i eth0 'tcp port 80'
输出网卡 eth0 上的 tcp 80 端口数据包详细
$ tcpdump -i eth0 -v 'tcp port 80'
输出所有源地址为 192.168.1.100 的数据包详细信息
$ tcpdump -v 'src 192.168.1.100'
输出所有源地址为 192.168.1.100 ,并且目标地址为 112.24.56.88 的数据包详细信息
$ tcpdump -v 'src 192.168.1.100 and dst 112.24.56.88'
将 tcpdump 的原始数据包写入到一个文件中,以供 wireshark 分析
$ tcpdump -i eth0 'tcp port 80' -w /tmp/dump.pcap
从一个文件中读取原始数据包信息,然后解析输出到屏幕
$ tcpdump -vv -r /tmp/dump.pcap
输出源地址为 192.168.1.100 的 ICMP 协议数据包信息
$ tcpdump -i eth0 'src 192.168.1.100 and icmp'
只以数字形式显示 ip 地址和端口,而不解析成域名
$ tcpdump -i any -nn 'tcp port 80'
输出 http 协议的 GET 请求方法数据包
$ tcpdump -i any -vv 'tcp[20:4] = 0x47455420'
输出 http 协议的 POST 请求方法数据包
$ tcpdump -i any -vv 'tcp[20:4] = 0x504f5354'
输出所有 DNS 请求数据包
$ tcpdump -i any -vv 'udp dst port 53'
By typefo [email protected] Update: 2017-04-28 本文档使用 CC-BY 4.0 协议