tcpdump統計http請求並匯出URL文字
tcpdump
-
tcpdump是一個用於擷取網路分組,並輸出分組內容的工具。憑藉強大的功能和靈活的擷取策略,使其成為類UNIX系統下用於網路分析和問題排查的首選工具
-
tcpdump 支援針對網路層、協議、主機、網路或埠的過濾,並提供and、or、not等邏輯語句來幫助你去掉無用的資訊
-
語法
tcpdump [ -DenNqvX ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ] [ -s snaplen ] [ -w file ] [ expression ]
strings
-
strings命令 在物件檔案或二進位制檔案中查詢可列印的字串。字串是4個或更多可列印字元的任意序列,以換行符或空字元結束。 strings命令對識別隨機物件檔案很有用。
-
語法
strings [ -a ] [ - ] [ -o ] [ -t Format ] [ -n Number ] [ -Number ] [file ... ]
-
選項
-a --all:掃描整個檔案而不是隻掃描目標檔案初始化和裝載段 -f –print-file-name:在顯示字串前先顯示檔名 -n –bytes=[number]:找到並且輸出所有NUL終止符序列 - :設定顯示的最少的字元數,預設是4個字元 -t --radix={o,d,x} :輸出字元的位置,基於八進位制,十進位制或者十六進位制 -o :類似--radix=o -T --target= :指定二進位制檔案格式 -e --encoding={s,S,b,l,B,L} :選擇字元大小和排列順序:s = 7-bit, S = 8-bit, {b,l} = 16-bit, {B,L} = 32-bit @ :讀取中選項
awk
-
awk是linux中處理文字的強大工具,或者說是一種專門處理字串的語言,它有自己的編碼格式。awk的強大之處還在於能生成強大的格式化報告。
-
語法
-
常用命令
-
-F
引數:指定分隔符,可指定一個或多個 -
print;
: 列印命令, 後面可字串的拼接 -
資料欄位變數
$0
表示整行文字$1
表示文字行中第一個資料欄位$2
表示文字行中第二個資料欄位$n
表示文字行中第n個資料欄位
-
getline;
: 常用方法是讀取下一行資料 , 也有其他用法
-
匯出方法
-
tcpdump抓取資料包
tcpdump -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x504f -w /tmp/tcp.cap -s 512 2>&1
-
按Ctrl+C即可結束抓取 , 也可直接設定定時結束 , 如下定時30s後結束抓取:
tcpdump -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x504f -w /tmp/tcp.cap -s 512 2>&1 &sleep 30
-
命令解釋
-i
即interface:指定tcpdump需要監聽的網路卡。預設會抓取第一個網路卡 .eth0
即指定的網路卡名稱 , 可通過ifconfig
命令獲取網路卡資訊tcp[20:2]=0x4745 or tcp[20:2]=0x504f
: 過濾表示式 , 意思是過濾資料包中tcp資料段的21-22位元組字元為GET或者POST的資料包 , 即過濾HTTP GET/POST請求的資料包- 該表示式與wireshark表示式一致 , 可用https://www.wireshark.org/tools/string-cf.html生成
-w /tmp/tcp.cap
: 指定tcpdump將抓包資料輸出到檔案 /tmp/tcp.cap 中而不是標準輸出-s 512
即-s len:設定tcpdump的資料包抓取長度為512,如果不設定預設將會是65535位元組。對於要抓取的資料包較大時,長度設定不夠可能會產生包截斷2>&1
: 將標準錯誤輸出重定向到標準輸出 , Linux中1
為標準輸出(stdout) ,2
為標準錯誤輸出(stderr)&sleep 30
: 命令保持30s
-
-
通過strings命令來找出GET/POST的url以及Host
strings /tmp/tcp.cap | grep -E "GET /|POST /|Host:" | grep --no-group-separator -B 1 -E "Host:" | grep --no-group-separator -A 1 -E "GET /|POST /" | awk '{url=$2;getline;host=$2;printf ("%s\n",host""url)}' > /tmp/url.txt
-
命令解釋
-
strings /tmp/tcp.cap
: 將tcpdump
生成的檔案指定為查詢字串的原始檔 -
grep -E "GET /|POST /|Host:" | grep --no-group-separator -B 1 -E "Host:" | grep --no-group-separator -A 1 -E "GET /|POST /"
:-
grep -E "GET /|POST /|Host:"
: 查詢以"GET /
、POST /
和Host:
開頭的字串 -
grep --no-group-separator -B 1 -E "Host:" | grep --no-group-separator -A 1 -E "GET /|POST /"
: 保證查詢的字串標準輸出均為一行Host:
緊接著一行GET /
或POST /
- 此處將多出的幾行
/biling
登入的url都給去除了 , 做到一一對應 --no-group-separator
: 當使用'-A', '-B' or '-C'時,不輸出任何組分隔符,而是將不同組相鄰輸出
- 此處將多出的幾行
-
輸出樣式示例如下
-
-
awk '{url=$2;getline;host=$2;printf ("%s\n",host""url)}' > /tmp/url.txt
:url=$2;
先將上述得到的標準輸出文字的第一行Host:
字串的第二段字串賦值給url(以空格分段) , 如:tgateway.changyou.com
getline;
讀取下一行GET /
或POST /
的內容 ,;host=$2;
再將該行的第二段字串賦值給host , 如:/phonesdk/login/openid
printf ("%s\n",host""url)}' > /tmp/url.txt
: 將得到的兩個變數以host""url
的格式列印至tmp/url.txt
中(""
為空字串 , 主要用於表示式中分割兩個變數)
-
-
其他可實現的需求
-
計算伺服器QPS
wc -l /tmp/url.txt | cut -d' ' -f 1
得到一個數字 , 該數字除以統計的秒數即是QPS -
排除靜態檔案統計前10訪問url:
grep -v -i -E "\.(gif|png|jpg|jpeg|ico|js|swf|css)" /tmp/url.txt | sort | uniq -c | sort -nr | head -n 10