【原创】如何选择“定时抓包”方案

本文介绍了如何选择定时抓包方案,包括基于tcpdump的参数实现定时、定制shell脚本通过信号停止tcpdump、基于timeout的定时功能杀tcpdump以及tshark的定时参数。通过实验验证了不同方案在无网络流量、少量和大量流量情况下的表现,指出这些方法在实现精准定时上的局限性。
摘要由CSDN通过智能技术生成

需求:能抓取指定时间长度的包,比如抓取 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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值