tcpdump定时定量抓包

TCPDUMP定时定量抓包

假设我们用xshell远程连接服务器,需要获取一段时间内的数据包,且由于硬盘大小有效,需要限制抓取的数据包文件的大小,应该怎么做?

nohup

xshell远程连接服务器的情况下,如果退出,那么进程就不能正常运行,所以要使用nohup命令。nohup 是一个 Unix 和 Linux 系统上的命令,它用于在退出 shell 或终端后继续运行命令。当使用 nohup 命令启动程序时,该程序的输出默认会被重定向到一个名为 nohup.out 的文件。

nohup的基本用法是:

1
nohup command &

不要忽略了最后面的’&’

比如创建一个append_i.sh文件:

1
2
3
4
5
6
7
8
9
10
#!/bin/bash

end_time=$((SECONDS+3600))

while [ $SECONDS -lt $end_time ]; do
echo "i" >> 1.txt
sleep 60
done


-lt 检查一个值是否小于另一个值,在一个小时内,每隔一分钟对1.txt进行一次写入。

nohup运行:

nohup bash append_i.sh &

此时使用bash的原因是:Ubuntu 的 /bin/sh 实际上是指向 dash,而 dash 是比 Bash 更轻量级的 shell,但它不支持所有 Bash 的特性。使用 nohup 运行脚本时,它可能会默认使用 /bin/sh(即 dash)来运行,从而导致错误。之前直接./append_i.sh发生了错误。

关闭xshell终端,重新连接一次,仍然可以在进程中搜索到:

ps aux | grep append_i.sh

抓包

要实现tcpdump定时定量抓包的功能,仅仅依靠tcpdump自带的功能是不够的。可以写一个脚本,启动tcpdump以后,开启记时同时监控生成的pcap文件,大小大于我们规定的值时停止tcpdump进程。

cap.sh:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#!/bin/bash

# 启动 tcpdump
nohup tcpdump -i eth0 -w /your/path/test.pcap &

# 获取 tcpdump 进程的 PID
TCPDUMP_PID=$!

# 设置起始时间
START_TIME=$(date +%s)

while true; do
# 获取当前时间
CURRENT_TIME=$(date +%s)
# 计算经过的时间
ELAPSED_TIME=$((CURRENT_TIME - START_TIME))
# 获取文件大小
SIZE=$(du -b /your/path/test.pcap | cut -f1)

# 如果文件大小超过 300M 或 超过12小时,则停止 tcpdump,可以根据需求修改
if [[ $SIZE -ge 314572800 ]] || [[ $ELAPSED_TIME -ge 43200 ]]; then
kill $TCPDUMP_PID
exit 0
fi
# 每隔 10 秒检查一次
sleep 10
done


$! 是一个特殊的 shell 变量,代表最后一个被放到后台执行的命令的进程 ID。

nohup启动这个脚本即可,最好加上sudo:

1
sudo nohup bash cap.sh &