Tcpdump - 统计传出和传入的 UDP 数据包

Tcpdump - 统计传出和传入的 UDP 数据包

是否可以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于您的示例。

因此,一旦您找到了正确的过滤器,请使用tcpdumpwithtimeout来在您定义的时间内运行它,kill tcpdump,然后您将获得数据包的计数。

timeout 20 tcpdump udp

这将为 udp 运行 tcpdump 过滤,并在 20 秒后终止 tcpdump。

相关内容