tcpdump用法
tcpdump用法
- tcpdump
- 一、什么是tcpdump
- 二、命令格式与参数
- 三、参数列表
- 四、过滤规则组合
- 逻辑运算符
- 过滤器
- 关键字
- 理解 Flag 标识符
- 五、常用例子
tcpdump
一、什么是tcpdump
二、命令格式与参数
-
option 可选参数:将在后边一一解释。
-
proto 类过滤器:根据协议进行过滤,可识别的关键词有: tcp, udp, icmp, ip, ip6, arp, rarp,ether,wlan, fddi, tr, decnet
-
type 类过滤器:可识别的关键词有:host, net, port, portrange,这些词后边需要再接参数。
-
direction 类过滤器:根据数据流向进行过滤,可识别的关键字有:src, dst,同时你可以使用逻辑运算符进行组合,比如 src or dst
三、参数列表
设置不解析域名提升速度 | |
---|---|
-n | 不把ip转化成域名,直接显示 ip,避免执行 DNS lookups 的过程,速度会快很多 |
-nn | 不把协议和端口号转化成名字,速度也会快很多。 |
-N | 不打印出host 的域名部分.。比如,,如果设置了此选现,tcpdump 将会打印’nic’ 而不是 ‘nic.ddn.mil’. |
过滤指定网卡的数据包 | |
---|---|
-i | 指定要过滤的网卡接口,如果要查看所有网卡,可以 -i any |
过滤特定流向的数据包 | |
---|---|
-Q | 选择是入方向还是出方向的数据包,可选项有:in, out, inout,也可以使用 --direction=[direction] 这种写法 |
常用的一些参数 | |
---|---|
-A | 以ASCII码方式显示每一个数据包(不显示链路层头部信息). 在抓取包含网页数据的数据包时, 可方便查看数据 |
-l | 基于行的输出,便于你保存查看,或者交给其它工具分析 tcpdump -nn -A -s1500 -l 通过 egrep 可以同时提取用户代理和主机名(或其他头文件) |
-q | 简洁地打印输出。即打印很少的协议相关信息, 从而输出行都比较简短 |
-c | 捕获 count 个包 tcpdump 就退出 |
-s | tcpdump 默认只会截取前 96 字节的内容,要想截取所有的报文内容,可以使用 -s number , number 就是你要截取的报文字节数,如果是 0 的话,表示截取报文全部内容。 |
-S | 使用绝对序列号,而不是相对序列号 |
-C | file-size,tcpdump 在把原始数据包直接保存到文件中之前, 检查此文件大小是否超过file-size. 如果超过了, 将关闭此文件,另创建一个文件继续用于原始数据包的记录. 新创建的文件名与-w 选项指定的文件名一致, 但文件名后多了一个数字.该数字会从1开始随着新创建文件的增多而增加. file-size的单位是百万字节(nt: 这里指1,000,000个字节,并非1,048,576个字节, 后者是以1024字节为1k, 1024k字节为1M计算所得, 即1M=1024 * 1024 = 1,048,576) |
-F | 使用file 文件作为过滤条件表达式的输入, 此时命令行上的输入将被忽略. |
过滤结果输出到文件 | |
---|---|
-w | 使用 -w 参数后接一个以 .pcap 后缀命令的文件名,就可以将 tcpdump 抓到的数据保存到文件中。使用 wireshark 打开此文件便可进行分析tcpdump icmp -w icmp.pcap |
-r | 从文件中读取数据,读取后,我们照样可以使用上述的过滤器语法进行过滤分析 tcpdump icmp -r all.pcap |
对输出内容进行控制的参数 | |
---|---|
-D | 显示所有可用网络接口的列表 |
-e | 每行的打印输出中将包括数据包的数据链路层头部信息 |
-E | 揭秘IPSEC数据 |
-L | 列出指定网络接口所支持的数据链路层的类型后退出 |
-Z | 后接用户名,在抓包时会受到权限的限制。如果以root用户启动tcpdump,tcpdump将会有超级用户权限。 |
-d | 打印出易读的包匹配码 |
-dd | 以C语言的形式打印出包匹配码 |
-ddd | 以十进制数的形式打印出包匹配码 |
-p | 不让网络接口进入混杂模式。默认情况下使用 tcpdump 抓包时,会让网络接口进入混杂模式。一般计算机网卡都工作在非混杂模式下,此时网卡只接受来自网络端口的目的地址指向自己的数据。当网卡工作在混杂模式下时,网卡将来自接口的所有数据都捕获并交给相应的驱动程序。如果设备接入的交换机开启了混杂模式,使用 -p 选项可以有效地过滤噪声。 |
控制详细内容的输出 | |
---|---|
-v | 产生详细的输出. 比如包的TTL,id标识,数据包长度,以及IP包的一些选项。同时它还会打开一些附加的包完整性检测,比如对IP或ICMP包头部的校验和 |
-vv | 产生比-v更详细的输出. 比如NFS回应包中的附加域将会被打印, SMB数据包也会被完全解码。(摘自网络,目前我还未使用过) |
-vvv | 产生比-vv更详细的输出。比如 telent 时所使用的SB, SE 选项将会被打印, 如果telnet同时使用的是图形界面,其相应的图形选项将会以16进制的方式打印出来(摘自网络,目前我还未使用过) |
控制时间的显示 | |
---|---|
-t | 在每行的输出中不输出时间 |
-tt | 在每行的输出中会输出时间戳 |
-ttt | 输出每两行打印的时间间隔(以毫秒为单位) |
-tttt | 在每行打印的时间戳之前添加日期的打印(此种选项,输出的时间最直观) |
显示数据包的头部 | |
---|---|
-x | 以16进制的形式打印每个包的头部数据(但不包括数据链路层的头部) |
-xx | 以16进制的形式打印每个包的头部数据(包括数据链路层的头部) |
-X | 以16进制和 ASCII码形式打印出每个包的数据(但不包括连接层的头部),这在分析一些新协议的数据包很方便。 |
-XX | 以16进制和 ASCII码形式打印出每个包的数据(包括连接层的头部),这在分析一些新协议的数据包很方便 |
四、过滤规则组合
逻辑运算符
- and:所有的条件都需要满足,也可以表示为
&&
- or:只要有一个条件满足就可以,也可以表示为
||
- not:取反,也可以使用
!
过滤器
=
:判断二者相等==
:判断二者相等!=
:判断二者不相等
关键字
- if:表示网卡接口名
- proc:表示进程名
- pid:表示进程 id
- svc:表示 service class
- dir:表示方向,in 和 out
- eproc:表示 effective process name
- epid:表示 effective process ID
理解 Flag 标识符
[S]
: SYN(开始连接)[.]
: 没有 Flag[P]
: PSH(推送数据)[F]
: FIN (结束连接)[R]
: RST(重置连接)
五、常用例子
从 HTTP 请求头中提取 HTTP 用户代理:
tcpdump -nn -A -s1500 -l | grep "User-Agent:"
通过 egrep 可以同时提取用户代理和主机名(或其他头文件):
tcpdump -nn -A -s1500 -l | egrep -i 'User-Agent:|Host:'
只抓取 HTTP GET 和 POST 流量
抓取 HTTP GET 流量:
tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x47455420'
也可以抓取 HTTP POST 请求流量:
tcpdump -s 0 -A -vv 'tcp[((tcp[12:1] & 0xf0) >> 2):4] = 0x504f5354'
注意:该方法不能保证抓取到 HTTP POST 有效数据流量,因为一个 POST 请求会被分割为多个 TCP 数据包。