我设置了一个简单的脚本,如下所示:
sshpass -p $password ssh -T $username@$ip_address -p 30007 <<- EOF > $save_file.pcap
sh
tcpdump -i eth5.1 -s 0 -n -v -U -w -
EOF
sed -i '1d' $save_file.pcap
该脚本的目的是让我可以在远程设备上运行 tcpdump,同时将输出保存到本地计算机上的文件中(远程设备的存储容量非常有限,因此这将允许我获得大量捕获,当然,这也让我能够更快地根据需要设置捕获)。
和heredoc的目的sh
是因为默认情况下,我不会被放入该远程设备的适当shell中。在远程设备中发出命令sh
可以让我进入正确的 shell 以便能够运行我的 tcpdump,并且此heredoc 是我找到的完成此任务并且仍然将信息移植回本地文件的唯一方法。
我遇到的问题是,一旦脚本到达该脚本的 tcpdump 部分,我的终端就会给出如下输出,就像我在文件中运行 tcpdump 时期望看到的那样:
drew@drew-Ubuntu-18:~/Desktop$ ./Script.sh
tcpdump: listening on eth5.1, link-type EN10MB (Ethernet), capture size 65535 bytes
Got 665
当然,随着更多数据包被捕获并通过管道传输到我的本地文件中,“得到”计数器也会增加。不幸的是,迄今为止我发现的阻止此行为并返回终端的唯一方法是启动CTRL
+ C
。
这里的问题是,这不仅会停止远程计算机上的 tcpdump,还会结束本地计算机上运行的脚本。
这当然意味着我的脚本中不再运行任何内容,并且我需要使用这些数据执行许多任务,而不仅仅是sed
我在此处包含的数据。
我尝试将其设置为如下所示:
tcpdump -i eth5.1 -s 0 -n -v -U -w - &
read -n 1 -s; kill $!
这里的思考过程是,我的原始 tcpdump 信息仍然会发布到标准输出,因此仍然填充在我的本地捕获文件中。然而,似乎当我尝试以这种方式运行捕获时,&
它实际上并没有让我将任何其他内容发布到终端中(不确定是否总是有太多垃圾飞行或什么)。我什至在本地尝试过这个,似乎尝试运行原始 tcpdump 发布到 stdout 不会让任何其他事情发生。
根据这些信息,我此时唯一能想到的是是否有某种方式可以使用 +CTRL
来C
关闭远程计算机上的 tcpdump,但保持我的脚本仍在运行。有什么建议我可以尝试吗?或者其他更合乎逻辑的解决方法?
答案1
我建议对您的远程捕获流量脚本进行一些改进:
防止CTRC+C杀死你的脚本:
这可以通过使用陷阱来捕获来完成
SIGINT
。您通常将其放在脚本的开头。看这个例子:trap "pkill ssh" INT
显然,仅获取您想要的 ssh 的过滤器可以改进。
从中过滤掉与远程机器的通信
tcpdump
您告诉我们您的系统对捕获反应不佳,可能是递归数据捕获使系统过载。根据您正在侦听的接口,您可能会创建一个递归情况,在与远程计算机的每个连接中,控制连接数据将被添加到捕获中,这反过来又会生成更多数据包来提供
tcpdump
。因此,您
tcpdump
可能需要过滤掉本地和远程计算机之间的通信。使用类似的东西:/usr/bin/tcpdump -i eth5.1 -s 0 -n -v -U -w - "not port 22"
或者:
/usr/bin/tcpdump -i eth5.1 -s 0 -n -v -U -w - "not my_local_host"
这可能会减轻缓慢和不稳定的情况,因此脚本会表现得更好。另请参阅稍后有关使用的要点
nc
。限制传入的数据包数量
tcpdump
以避免一直使用CTRC+ C。如果您只想捕获一小部分流量,则应该限制
tcpdump
捕获的数据包数量tcpdump
。例如捕获 100 个数据包并返回:
tcpdump -c 100 -w -
限制
tcpdump
时间以避免一直使用CTRC+ 。C如果要捕获 5 分钟(300 秒)的流量,请
timeout
在远程端使用该命令。如:ssh "timeout 300 tcpdump -w -"
丢掉那个壳
您正在使用 shell,因为您需要 $PATH 来调用
tcpdump
.改为调用完整tcpdump
路径。如:
sshpass -p $password ssh -T $username@$ip_address -p 30007 "/usr/bin/tcpdump -i eth5.1 -s 0 -n -v -U -w -"
取消缓冲
tcpdump
tcpdump
输出到tcpdump
tostdout
被缓冲。要取消缓冲以更快地从远程主机获取数据,并在中断时丢失更少的数据,请使用-l
:/usr/bin/tcpdump -i eth5.1 -s 0 -n -v -U -l -w -
这对您的情况可能有用也可能没用,请进行一些测试。当您使用 CTRL-C 中断它时,它肯定会给您留下更多数据。
不使用 SSH 来获取流量转储。代替使用
netcat
。如果您没有如此严格的安全要求,例如在您自己的网络内进行捕获,并且两台主机之间没有防火墙阻止端口,请放弃该 SSH 以获取
tcpdump
输出。这是一个计算量很大的协议,如果您需要捕获更多的远程流量,它会妨碍您。而是使用nc
它来获取tcpdump
数据。与本地机器一样:
nc -l -p 20000 > capture.dump &
远程机器:
ssh remote "/usr/bin/tcpdump -w - | nc IP_local_machine 20000" > /dev/null
放弃那个
sshpass
使用 ssh 密钥代替密码进行身份验证。
最后,如果做得更专业,可以考虑使用代理+专业服务的可能性。
您可以使用
cshark
.捕获流量并直接上传到CloudShark进行分析。使用 CloudShark 服务:https://www.cloudshark.org或您自己的 CloudShark 设备。