Linux

如何使用 tcpdump 僅過濾保持活動的數據包

  • November 10, 2021

我需要分析網路上的流量轉儲,以檢查是否所有 PC 都啟用了 tcp keep-live 功能。我為此目的使用 tcpdump。

我需要知道的是是否有可能只過濾保持活動的數據包。

在windows上我看到wireshark可以做到這一點,但在我只有控制台模式的linux系統上,我不知道如何過濾那種數據包。

keepalive 探測是其中沒有數據且 ACK 標誌打開的數據包

port="port_number_being_used"
intf="name_of_the_network_interface"
tcpdump -pni ${intf} -v "tcp port ${port} and ( tcp[tcpflags] & tcp-ack != 0 and ( (ip[2:2] - ((ip[0]&0xf)<<2) ) - ((tcp[12]&0xf0)>>2) ) == 0 ) "

這是做什麼的:

  • 按位並在 tcp flags 欄位和 tcp-ack 之間確保它是一個 ACK
  • IP 數據包長度(以字節為單位) - IP 標頭長度 - TCP 標頭長度以確保它沒有數據

免責聲明:未經實際測試,但應該為您指明一個好的方向

注意:分解 tcpdump 過濾器以使其更具可讀性。大概可以取出第一組括號。

tcp port ${port}
and
(
tcp[tcpflags] & tcp-ack != 0
and
(
 (ip[2:2] - ((ip[0] & 0xf) << 2))
 -
 ((tcp[12] & 0xf0) >> 2)
) == 0
)

引用自:https://serverfault.com/questions/447855