需求:能抓取指定时间长度的包,比如抓取 10s 长度的包;
可选方案:
- 使用
tcpdump
命令的-G
和-W
参数; - 自己通过脚本实现在指定时间到达后通过
kill
命令杀掉tcpdump
抓包进程; - 使用
tshark
命令的-a duration:xx
参数;
基于 tcpdump
的 -G
-W
参数实现定时的方案
因为 tcpdump
太有名了,所以一般人十有八九会先想到这个工具;
查阅 tcpdump
的 man 手册可以发现与定时功能相关的参数如下:
-G rotate_seconds
如果设置了该参数,
tcpdump
将会以 rotate_seconds 为周期对通过-w
选项指定命名的 dump 文件进行轮转;保存文件命名通过-w
选项指定,并且应该包含符合strftime(3)
定义的时间戳格式;如果未指定时间格式,则每一个新产生的文件将会覆盖之前的文件;如果和
-C
选项配合使用,文件命名将会采用 'file<count>' 格式;
-W
和
-C
选项配合使用,可以将创建文件数目限制指定值,并且咋达到该数值后,从头开始进行文件覆盖;从行为上,类似于实现了一个 'rotating' buffer 的功能;另外,该选项会在为文件命名时使用足够多的前导 0 , 以便正确支持我们要求的最大数目,同时允许基于该数值进行正确排序;和
-G
选项配合使用,可以将 rotated dump 文件的数目限制在指定值,并在达到该数值的时候以状态码 0 退出;如果与-C
选项配合使用,the behavior will result in cyclical files per timeslice.
-C file_size
在将 raw packet 写入存储文件前,会先检查当前文件的大小是否超过了 file_size 值;如果是,则关闭当前存储文件,并重开一个新文件;在首个保存文件之后,文件命名的构成变成
-w
指定内容加上一个从 1 开始的数字;file_size 的单位为兆字节(是 1,000,000 字节,不是 1,048,576 字节);
看似只要使用 -G
和 -W
参数就可以实现指定抓包时间长度的功能;试验如下:
验证没有网络流量时的情况
说明:
time
用于计算tcpdump
执行的时间; 通过tcpdump
抓取 22 端口上的 ssh 通信包;-G 3 -W 1
用于设置只抓取一次 3 秒长度的通信包;
试验步骤:启动如下命令后,不进行任何操作,过了 N 久后敲击 enter 键;
root@vagrant-ubuntu-trusty:~# time tcpdump -i any tcp port 22 -G 3 -W 1 -w timer_test.pcap
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
(什么都不做,等了 N 久后敲一下 enter)
Maximum file limit reached: 1
real 0m28.999s -- 可以看到过去的时间远远超过 3 秒
user 0m0.008s
sys 0m0.000s
root@vagrant-ubuntu-trusty:~#
root@vagrant-ubuntu-trusty:~# capinfos timer_test.pcap
File name: timer_test.pcap
File type: Wireshark/tcpdump/... - pcap
File encapsulation: Linux cooked-mode capture
Packet size limit: file hdr: 262144 bytes
Number of packets: 0 -- 一个包也没抓到
File size: 24 bytes
Data size: 0 bytes
Capture duration: n/a
Start time: n/a
End time: n/a
Data byte rate: 0 bytes/s
Data bit rate: 0 bits/s
Average packet size: 0.00 bytes
Average packet rate: 0 packets/sec
SHA1: 25b620a6d7e275a5b06401559e9c06bfd2e0f975
RIPEMD160: 60b5d5287c6e8fbd298ff2dac91e5a802e4b706a
MD5: 3ad37ddb8fad5d769e0df74c7678ba15
Strict time order: True
root@vagrant-ubuntu-trusty:~#
查看包的内容发现:确实一个包也没抓到;
root@vagrant-ubuntu-trusty:~# tshark -r timer_test.pcap
Running as user "root" and group "root". This could be dangerous.
root@vagrant-ubuntu-trusty:~#
验证存在少量网络流量时的情况
试验步骤:启动如下命令后,按照大概每秒一次的速度敲击 enter 键;
root@vagrant-ubuntu-trusty:~# time tcpdump -i any tcp port 22 -G 3 -W 1 -w timer_test.pcap
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
(enter)
(enter)
(enter)
Maximum file limit reached: 1
real 0m3.000s -- 这次刚好运行了 3 秒
user 0m0.000s
sys 0m0.004s
root@vagrant-ubuntu-trusty:~#
root@vagrant-ubuntu-trusty:~# capinfos timer_test.pcap
File name: timer_test.pcap
File type: Wireshark/tcpdump/... - pcap
File encapsulation: Linux cooked-mode capture
Packet size limit: file hdr: 262144 bytes
Number of packets: 3 -- 抓到了 3 个数据包
File size: 318 bytes
Data size: 246 bytes
Capture duration: 0 seconds
Start time: Fri Dec 16 14:21:39 2016
End time: Fri Dec 16 14:21:39 2016
Data byte rate: 719 kBps
Data bit rate: 5752 kbps
Average packet size: 82.00 bytes
Average packet rate: 8768 packets/sec
SHA1: 3edbbc777b6732fdc8817f9da1ce0f0f98542936
RIPEMD160: 95bbc3c5b4bdab0cfe1d719dcff30e757fe47c79
MD5: 147792c10dbe9595cbfc63bf6fb8fe1b
Strict time order: True
root@vagrant-ubuntu-trusty:~#
查看包的内容发现:抓取到 3 个包,3 个包均在 0.001 秒内发生;
root@vagrant-ubuntu-trusty:~# tshark -r timer_test.pcap
Running as user "root" and group "root". This could be dangerous.
1 0.000000 10.0.2.2 -> 10.0.2.15 SSH 92 Client: Encrypted packet (len=36)
2 0.000136 10.0.2.15 -> 10.0.2.2 SSH 92 Server: Encrypted packet (len=36)
3 0.000342 10.0.2.2 -> 10.0.2.15 TCP 62 53815→22 [ACK] Seq=37 Ack=37 Win=65535 Len=0
root@vagrant-ubuntu-trusty:~#
验证存在大量网络流量时的情况
试验步骤:启动如下命令后,按照大概每秒 3~4 次的速度连续敲击 enter 键;
root@vagrant-ubuntu-trusty:~# time tcpdump -i any tcp port 22 -G 3 -W 1 -w timer_test.pcap
tcpdump: listening on any, link-type LINUX_SLL (Linux cooked), capture size 262144 bytes
(enter)
(enter)
(enter)
(enter)
(enter)
(enter)
...
(enter)
(enter)
(enter)
(enter)
(enter)
(enter)
Maximum file limit reached: 1
real 0m2.998s -- 这次也刚好运行了 3 秒
user 0m0.000s
sys 0m0.000s
root@vagrant-ubuntu-trusty:~#
root@vagrant-ubuntu-trusty:~# capinfos timer_test.pcap
File name: timer_test.pcap
File type: Wireshark/tcpdump/... - pcap
File encapsulation: Linux cooked-mode capture
Packet size limit: file hdr: 262144 bytes
Number of packets: 18 -- 抓到了 18 个数据包
File size: 1788 bytes
Data size: 1476 bytes
Capture duration: 1 seconds
Start time: Fri Dec 16 14:29:33 2016
End time: Fri Dec 16 14:29:34 2016
Data byte rate: 1955 bytes/s
Data bit rate: 15 kbps
Average packet size: 82.00 bytes
Average packet rate: 23 packets/sec
SHA1: 3d4c457b55ac7f496c5c15b1fbf60775aaab23e7
RIPEMD160: b4a009650d64e5aa90e405d39a735e47e3f904e5
MD5: 426dba1247972b13257eb12fea76817e
Strict time order: True
root@vagrant-ubuntu-trusty:~#
查看包的内容发现:抓取到 18 个包,18 个包在 1 秒内发生;
root@vagrant-ubuntu-trusty:~# tshark -r timer_test.pcap
Running as user "root" and group "root". This could be dangerous.
1 0.000000 10.0.2.2 -> 10.0.2.15 SSH 92 Client: Encrypted packet (len=36)
2 0.000138 10.0.2.15 -> 10.0.2.2 SSH 92 Server: Encrypted packet (len=36)
3 0.000303 10.0.2.2 -> 10.0.2.15 TCP 62 53815→22 [ACK] Seq=37 Ack=37 Win=65535 Len=0
4 0.149969 10.0.2.2 -> 10.0.2.15 SSH 92 Client: Encrypted packet (len=36)
5 0.150119 10.0.2.15 -> 10.0.2.2 SSH 92 Server: Encrypted packet (len=36)
6 0.150323 10.0.2.2 -> 10.0.2.15 TCP 62 53815→22 [ACK] Seq=73 Ack=73 Win=65535 Len=0
7 0.302591 10.0.2.2 -> 10.0.2.15 SSH 92 Client: Encrypted packet (len=36)
8 0.302728 10.0.2.15 -> 10.0.2.2 SSH 92 Server: Encrypted packet (len=36)
9 0.302907 10.0.2.2 -> 10.0.2.15 TCP 62 53815→22 [ACK] Seq=109 Ack=109 Win=65535 Len=0
10 0.449231 10.0.2.2 -> 10.0.2.15 SSH 92 Client: Encrypted packet (len=36)
11 0.449369 10.0.2.15 -> 10.0.2.2 SSH 92 Server: Encrypted packet (len=36)
12 0.449550 10.0.2.2 -> 10.0.2.15 TCP 62 53815→22 [ACK] Seq=145 Ack=145 Win=65535 Len=0
13 0.600790 10.0.2.2 -> 10.0.2.15 SSH 92 Client: Encrypted packet (len=36)
14 0.600929 10.0.2.15 -> 10.0.2.2 SSH 92 Server: Encrypted packet (len=36)
15 0.601112 10.0.2.2 -> 10.0.2.15 TCP 62 53815→22 [ACK] Seq=181 Ack=181 Win=65535 Len=0
16 0.754338 10.0.2.2 -> 10.0.2.15 SSH 92 Client: Encrypted packet (len=36)
17 0.754482 10.0.2.15 -> 10.0.2.2 SSH 92 Server: Encrypted packet (len=36)
18 0.754697 10.0.2.2 -> 10.0.2.15 TCP 62 53815→22 [ACK] Seq=217 Ack=217 Win=65535 Len=0
root@vagrant-ubuntu-trusty:~#
小结
上面费了那么多劲,其实就是想要告诉你,使用 tcpdump
的 -G
-W
参数实现抓取指定时间长度的功能不那么靠谱~~
定制 shell 脚本通过 kill
实现 tcpdump
的退出
该方案在网上能搜出很多,基本上大同小异;这里想要说明的问题是,使用哪种信号停止 tcpdump
的运行是靠谱的~
脚本是组内小伙写的,简单讲经历了三次主要变更:
初级阶段
a. 后台(&
)启动 tcpdump
进行抓包;
b. 通过 sleep
进行定时;
c. 在时间到达后通过 kill -9
杀掉 tcpdump
进程;
中级阶段
将上述步骤 c 中的 kill -9
换成 kill -2
;
或者换成先
kill