使用 tcpdump 監控 HTTP 流量
為了監控伺服器和 Web 伺服器之間的 HTTP 流量,我目前正在使用
tcpdump
. 這工作正常,但我想擺脫輸出中的一些多餘數據(我知道tcpflow
andwireshark
,但它們在我的環境中不容易獲得)。從
tcpdump
手冊頁:列印進出埠 80 的所有 IPv4 HTTP 數據包,即僅列印包含數據的數據包,而不是,例如,SYN 和 FIN 數據包以及 ACK-only 數據包。
tcpdump 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
這個命令
sudo tcpdump -A ‘src example.com 和 tcp 埠 80 和 (((ip
$$ 2:2 $$- ((IP$$ 0 $$&0xf)<<2)) - ((tcp$$ 12 $$&0xf0)>>2)) != 0)’
提供以下輸出:
19:44:03.529413 IP 192.0.32.10.http > 10.0.1.6.52369:標誌
$$ P. $$, seq 918827135:918827862, ack 351213824, win 4316, 選項$$ nop,nop,TS val 4093273405 ecr 869959372 $$, 長度 727 E…..@……. ….P..6.0………D…… __..e=3…__HTTP/1.1 200 OK 伺服器:Apache/2.2.3 (Red Hat) 內容類型:text/html;charset=UTF-8 日期:2009 年 11 月 14 日星期六 18:35:22 GMT 年齡:7149
內容長度:438
<HTML> <HEAD> <TITLE>範例網頁</TITLE> </HEAD> <body>
<p>您已到達此網頁…</p> </BODY> </HTML>
這幾乎是完美的,除了突出顯示的部分。這是什麼,結束——更重要的是——我該如何擺脫它?也許只是對命令末尾的表達式稍作調整?
tcpdump 列印完整的數據包。您看到的“垃圾”實際上是 TCP 標頭。
您當然可以使用 perl 腳本來處理輸出,但為什麼不使用 tshark,即wireshark 的文本版本呢?
tshark 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
它採用與 tcpdump 相同的參數(相同的庫),但由於它是一個分析器,它可以進行深度數據包檢查,因此您可以進一步優化過濾器,即
tshark 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)' -R'http.request.method == "GET" || http.request.method == "HEAD"'