如何使用 tcpdump 擷取 TCP 連接的第一個數據包的內容
我的任務是在網路級別監視和調試 SOAP Web 服務。我可以使用
tcpdump
80 埠擷取來自客戶的全部流量,但我不能將每個請求的擷取限制為僅接收到的第一個應用層數據包(在這種情況下是最重要的數據包,它帶有 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
在擷取數據包後退出,而我需要它保持執行並繼續為新連接顯示相同的資訊。理想情況下,我需要類似於tail
apache 訪問日誌文件的東西,以及第一個有意義的請求和響應塊。
因此,您的請求實際上比標題所暗示的要窄 - 您正在專門尋找 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。