tcpdump、tshark、tcpreplay用法
# tcpdump用法
# 读入文件并分割
读入一个input.pcap文件并将其分割为多个小文件,每个20M:
tcpdump --time-stamp-precision nano -r input.pcap -C 20M -w xxx.pcap
- --time-stamp-precision nano 设置时间精度为ns
- -r input.pcap 读入文件
- -w xxx.pcap 输出文件
- -C 20M 输出文件大小为20M,满20M后会打开新的,命名为
xxx.pcap1
- -c 1000 捕获1000个包后停止
- -nn 主机名和端口号都以数字显示
- -vv 显示较多的信息 verbose
- -i interface:指定tcpdump需要监听的接口。若未指定该选项,将从系统接口列表中搜寻编号最小的已配置好的接口(不包括loopback接口,要抓取loopback接口使用tcpdump -i lo), :一旦找到第一个符合条件的接口,搜寻马上结束。可以使用'any'关键字表
- -XX:输出包的头部数据,会以16进制和ASCII两种方式同时输出,更详细。
- host 192.168.1.101 目的或源地址是 192.168.1.101 的网络数据
- host aa or host bb 用or同时抓两个ip的数据,用and抓两个ip之间的数据
- port 22 目的或源端口是22的网络数据
# 过滤长度 tcp payload长度大于48
https://blog.51cto.com/u_15169172/2710590 (opens new window)
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) > 48)'
- ((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) 表示: 整个ip数据包的长度减去ip头的长度,再减去tcp头的长度,即tcp payload长度。
- 其中,ip[2:2]表示整个ip数据包的长度,
- (ip[0]&0xf)<<2)表示ip数据包包头的长度,(ip[0]&0xf代表包中的IHL域, 而此域的单位为32bit, 要换算成字节数需要乘以4, 即左移2.
- (tcp[12]&0xf0)>>4 表示tcp头的长度, 此域的单位也是32bit, 换算成比特数为 ((tcp[12]&0xf0) >> 4) <<2, 即 ((tcp[12]&0xf0)>>2).
- 对于ipv6版本只需考虑ipv6头中的 'Payload Length' 与 'tcp头的长度' 的差值, 并且其中表达方式ip[]需换成ip6[].)
# 其他选项
https://blog.csdn.net/qq_33936481/article/details/51416730 (opens new window)
- -A 以ASCII格式打印出所有分组,并将链路层的头最小化。
- -c 在收到指定的数量的分组后,tcpdump就会停止。
- -C 在将一个原始分组写入文件之前,检查文件当前的大小是否超过了参数file_size 中指定的大小。如果超过了指定大小,则关闭当前文件,然后在打开一个新的文件。参数 file_size 的单位是兆字节(是1,000,000字节,而不是1,048,576字节)。
- -d 将匹配信息包的代码以人们能够理解的汇编格式给出。
- -dd 将匹配信息包的代码以c语言程序段的格式给出。
- -ddd 将匹配信息包的代码以十进制的形式给出。
- -D 打印出系统中所有可以用tcpdump截包的网络接口。
- -e 在输出行打印出数据链路层的头部信息。
- -E 用spi@ipaddr algo:secret解密那些以addr作为地址,并且包含了安全参数索引值spi的IPsec ESP分组。
- -f 将外部的Internet地址以数字的形式打印出来。
- -F 从指定的文件中读取表达式,忽略命令行中给出的表达式。
- -i 指定监听的网络接口。
- -l 使标准输出变为缓冲行形式,可以把数据导出到文件。
- -L 列出网络接口的已知数据链路。
- -m 从文件module中导入SMI MIB模块定义。该参数可以被使用多次,以导入多个MIB模块。
- -M 如果tcp报文中存在TCP-MD5选项,则需要用secret作为共享的验证码用于验证TCP-MD5选选项摘要(详情可参考RFC 2385)。
- -b 在数据-链路层上选择协议,包括ip、arp、rarp、ipx都是这一层的。
- -n 不把网络地址转换成名字。
- -nn 不进行端口名称的转换。
- -N 不输出主机名中的域名部分。例如,‘nic.ddn.mil‘只输出’nic‘。
- -t 在输出的每一行不打印时间戳。
- -O 不运行分组分组匹配(packet-matching)代码优化程序。
- -P 不将网络接口设置成混杂模式。
- -q 快速输出。只输出较少的协议信息。
- -r 从指定的文件中读取包(这些包一般通过-w选项产生)。
- -S 将tcp的序列号以绝对值形式输出,而不是相对值。
- -s 从每个分组中读取最开始的snaplen个字节,而不是默认的68个字节。
- -T 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc远程过程调用)和snmp(简单网络管理协议;)。
- -t 不在每一行中输出时间戳。
- -tt 在每一行中输出非格式化的时间戳。
- -ttt 输出本行和前面一行之间的时间差。
- -tttt 在每一行中输出由date处理的默认格式的时间戳。
- -u 输出未解码的NFS句柄。
- -v 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息。
- -vv 输出详细的报文信息。
- -w 直接将分组写入文件中,而不是不分析并打印出来。
# wireshark、tshark用法
# wireshark editcp 分割pcap包
linux下安装wireshark yum install wireshark editcap是wireshark中的一个工具
每200个包分一个文件
editcap -F pcap -c 200 input.pcap output.pcap
如果不指定-F pcap
, 则默认使用pcapng格式,在linux下无法被libtrace识别。
如果这样是不被识别的包,可以通过tcpdump -r output.pcap -w output2.pcap
再转换一次。
另外editcap切出来的包时间精度也只有us,如果原来是ns则会丢失精度
按时间切包
editcap -F pcap -A "2022-06-17 10:40:00" -B "2022-06-17 10:50:00" input.pcap output.pcap
# tshark导出csv 提取时间戳 过滤tcp长度
tshark是wireshark的linux版本, 可以用它来 -r -w做一些提取数据、fieter、转存等工作
# 提取csv
$ tshark -t e -r test.pcap -T fields -e frame.time -e tcp.len -e frame.len
"May 8, 2022 22:19:52.596857863 CST" 172 228
"May 8, 2022 22:19:52.603060220 CST" 0 56
"May 8, 2022 22:19:52.641119297 CST" 0 76
2
3
4
5
# 过滤filter
https://wiki.wireshark.org/DisplayFilters (opens new window)
过滤tcp长度
$ tshark -t e -r test.pcap "tcp.len>=64"
1 1652019592 172.17.0.13 -> 101.228.226.13 TCP 228 39862 > 43500 [PSH, ACK] Seq=1 Ack=1 Win=319 Len=172
7 1652019593 172.17.0.13 -> 169.254.0.55 TCP 893 52998 > lsi-bobcat [PSH, ACK] Seq=1 Ack=1 Win=52883 Len=837
2
3
# tcpreplay用法
https://blog.csdn.net/zhaomax/article/details/82773381 (opens new window)
./tcpreplay-edit -i interface -l 0 --efcs xx.pcap
--efcs是去掉以太网帧(数据链路层)末尾的4字节fcs(Ethernet checksums) 网卡发送的时候会在末尾加上4字节fcs,接收方校验是否正确,不正确则丢弃。如果replay的包本身带有末尾4字节fcs,则应该去掉它,防止网卡发送时再在末尾加上4字节fcs。