typefo

I am a programmer, I like emacs and archlinux

tcpdump 是一个实用的网络数据包分析工具,能够截获操作系统中的各种网络数据包。

tcpdump 基本使用格式

tcpdump 主要有参数选项(options),和过滤规则表达式(expression)组成

$ tcpdump [options] expression

注意 tcpdump 的过滤规则表达式使用一对单引号或双引号,例如 tcpdump -v 'tcp port 80'

tcpdump 参数选项列表

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

tcpdump 使用示例

输出所有 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'