![Tcpdump - 统计传出和传入的 UDP 数据包](https://linux22.com/image/97806/Tcpdump%20-%20%E7%BB%9F%E8%AE%A1%E4%BC%A0%E5%87%BA%E5%92%8C%E4%BC%A0%E5%85%A5%E7%9A%84%20UDP%20%E6%95%B0%E6%8D%AE%E5%8C%85.png)
是否可以tcpdump
计算(在某些设置时间内)传出和传入 UDP 数据包的数量?
我在这方面没有太多经验tcpdump
,因此建议如何做到这一点将非常有帮助。我读到,timeout
如果我想在给定时间后停止一个进程,那么推荐是很好的,所以我正在考虑tcpdump
在我的时间之后停止。
但是我如何计算传出和传入数据包的数量并仅过滤 UDP 数据包呢?
答案1
我不会为此使用tcpdump
(或)。tshark
相反,我会用来iptables
计算一段时间内的数据包数量
# Prepare two sets of counters and set up the rules
#
iptables -N udp_in
iptables -N udp_out
iptables -A udp_in
iptables -A udp_out
iptables -A OUTPUT --protocol udp -j udp_out
iptables -A INPUT --protocol udp -j udp_in
您可以在经期开始时重置计数器,如下所示
# Reset the counters
#
iptables -Z udp_in
iptables -Z udp_out
您可以在经期结束时读取计数器,如下所示
# Look at the counters
#
packets_in=$(iptables -nvL udp_in | awk '/all/{print $1}')
packets_out=$(iptables -nvL udp_out | awk '/all/{print $1}')
echo "in=$packets_in, out=$packets_out"
您可以读取计数器并通过Z
同时提供标志来立即重置它。例如
packets_in=$(iptables -nvLZ udp_in | awk '/all/{print $1}')
将各个部分放在一起,并假设您已经创建了必要的额外 iptables 链(见上文),您可以使用类似的东西
# Reset the counters
#
iptables -Z udp_in
iptables -Z udp_out
# Wait 10 seconds
#
period=10
sleep "$period"
# Look at the counters
#
packets_in=$(iptables -nvL udp_in | awk '/all/{print $1}')
packets_out=$(iptables -nvL udp_out | awk '/all/{print $1}')
# Report the results
#
echo "During the last $period seconds we saw $packets_in UDP packet(s) in and $packets_out UDP packet(s) out."
答案2
man tcpdump
提供您需要的信息。 tcpdump 网页还提供了联机帮助页。
在描述中,它说当tcpdump
完成捕获数据包时,它会报告捕获的数据包、过滤器接收的数据包和内核丢弃的数据包的计数。
过滤(即仅查找某种类型的数据包的方式)可能要困难得多,但示例部分应该提供足够的线索,表明您需要的唯一过滤器适用udp
于您的示例。
因此,一旦您找到了正确的过滤器,请使用tcpdump
withtimeout
来在您定义的时间内运行它,kill tcpdump
,然后您将获得数据包的计数。
timeout 20 tcpdump udp
这将为 udp 运行 tcpdump 过滤,并在 20 秒后终止 tcpdump。