是否可以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。