Linux

如何使用 tcpdump 擷取 TCP 連接的第一個數據包的內容

  • April 15, 2014

我的任務是在網路級別監視和調試 SOAP Web 服務。我可以使用tcpdump80 埠擷取來自客戶的全部流量,但我不能將每個請求的擷取限制為僅接收到的第一個應用層數據包(在這種情況下是最重要的數據包,它帶有 HTTP 請求標頭和 SOAP XML 文件的開頭)。我想知道使用哪個tcpdump開關(或其他 linux 命令的組合)來獲取每個 TCP 連接的第一個數據包,並丟棄為同一連接接收的其餘數據包。

如果可能的話,將第一個響應數據包(並且可能是唯一的,因為在這個應用程序中,響應 XML 文件很小)從伺服器發送到客戶也很好。

目前我tcpdump -i any -A 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'從手冊頁執行範例tcpdump,所以我沒有得到 TCP 握手數據包。

-c交換機的問題是tcpdump在擷取數據包後退出,而我需要它保持執行並繼續為新連接顯示相同的資訊。理想情況下,我需要類似於tailapache 訪問日誌文件的東西,以及第一個有意義的請求和響應塊。

因此,您的請求實際上比標題所暗示的要窄 - 您正在專門尋找 HTTP 請求。

我為此使用了 ngrep,它結合了 tcpdump 和 grep 類型的功能。例如:

sudo ngrep -d eth0 '^(GET|POST) ' port 80

這將為您提供文本輸出。如果需要,可以使用 -w 選項將匹配的數據包寫入 tcpdump 格式的文件。

如上所述使用 -d 指定介面,因為 -i 在 grep 中用於不區分大小寫。

以上內容還將包括您可能不想要的傳出請求等。根據需要附加 tcpdump 類型選項。

如果您正在調試對特定 URL 的請求,您可能希望使用它來使正則表達式更加具體。例如

sudo ngrep '^(GET|POST) /my/soap/interface .*Host: myhost.example.com' 'dst port 80 and dst host myhost.example.com'

在請求被拆分為多個數據包且第二個數據包中包含 Host 標頭的異常情況下,上述方法可能無法擷取某些請求。大多數情況下這並不重要,但您總是可以使用 tcpdump 擷取比您需要的更多的內容,使用 chaosreader 將其分解為文件,然後開始對文件進行 grepping。

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