工具作用
Tcpdump是一款用于截取網絡分組,并過濾輸出分組內容的工具
它支持針對網絡層、協議、主機、網絡或端口的過濾,并提供 and、or、not等邏輯語句來幫助我們去掉無用的信息。
快速上手
客戶端http請求
[eadp@eadp-dev-0001 ~]$ curl -v ****
* About to connect() to 127.0.0.1 port 8777 (#0)
* Trying 127.0.0.1...
* Connected to 127.0.0.1 (127.0.0.1) port 8777 (#0)
> GET / HTTP/1.1
> User-Agent: curl/7.29.0
> Host: 127.0.0.1:8777
> Accept: */*
>
< HTTP/1.1 404
< Content-Type: text/html;charset=utf-8
< Content-Language: en
< Content-Length: 431
< Date: Fri, 03 Sep 2021 02:45:44 GMT
<
* Connection #0 to host 127.0.0.1 left intact
<!doctype html><html lang="en"><head><title>HTTP Status 404 – Not Found</title><style type="text/css">body {font-family:Tahoma,Arial,sans-serif;} h1, h2, h3, b {color:white;background-color:#525D76;} h1 {font-size:22px;} h2 {font-size:16px;} h3 {font-size:14px;} p {font-size:12px;} a {color:black;} .line {height:1px;background-color:#525D76;border:none;}</style></head><body><h1>HTTP Status 404 – Not Found</h1></body></html>
服務端抓包
tcpdump -n -i lo -A port 8777 (-A參數表示打印應用層ASC碼)
-n:直接以 IP 及 Port Number 顯示,而非主機名與服務名稱;
-i:指定監聽的網絡接口;
- (注意,多網卡情況,一定要指定要抓取的網卡,不然會默認一個,可能就不是你想要的那個網卡)
- -i any 表示抓所有網卡
-A: 只輸出ASCII碼(推薦)
- 我傾向于只打印 ASCII 格式數據
- 像http協議,http協議頭就要求是ASCII碼,所以打印ASCII碼就剛剛好
表達式:
- port 8777
- 指明端口號是8777。
三次握手包
[S] – SYN (開始連接)
[S.] 標記代表這個數據包是 SYN-ACK 數據包
[.]特殊點,是個占位符,沒有其他flag被設置的時候就顯示這個占位符,一般表示ack
客戶端發http請求包
Flags [P.]
- 表示該TCP數據包攜帶了PSH(Push)和ACK(Acknowledgment)標志。具體來說:
- PSH (Push): 此標志被設置時,它告訴接收方應該立即將數據遞交給應用程序,而不是等待緩沖區填滿。這通常意味著發送方應用程序已經無法再發送更多數據,或者需要盡快處理這些數據。
- ACK (Acknowledgment): 代表確認標志。當這個標志被設置時,它指示確認號字段有效,也就是該TCP數據包是用來確認收到的數據的。一個帶有ACK標志的數據包意味著它在響應之前某個數據包的傳輸并確認其接收。
[.]特殊點,是個占位符,沒有其他flag被設置的時候就顯示這個占位符,一般表示ack
服務端發送http返回值包

客戶端發起關閉包

在tcpdump抓包輸出中,Flags [F.] 表示該TCP數據包設置了FIN標志。具體來說:
- FIN (Finish): 當這個標志被設置時,它指示發送方已經完成了數據發送,并希望終止連接。接收方收到帶有FIN標志的數據包后,通常會發送一個帶有ACK標志的響應來確認接收,并且如果它也準備好了關閉連接,會回復一個帶有FIN標志的包以關閉反向通道。
常用選項
- -l:使標準輸出變為緩沖行形式;
- -c:抓包次數;
- -nn:直接以 IP 及 Port Number 顯示,而非主機名與服務名稱;
- -s :<數據包大小> 設置每個數據包的大小;
- -i:指定監聽的網絡接口;
- (注意,多網卡情況,一定要指定要抓取的網卡,不然會默認一個,可能就不是你想要的那個網卡)
- -r:從指定的文件中讀取包;
- -w:輸出信息保存到指定文件;
- -d:將匹配信息包的代碼以人們能夠理解的匯編格式給出;
- -e:在輸出行打印出數據鏈路層的頭部信息;
- -t:在輸出的每一行不打印時間戳;
- -v :輸出稍微詳細的報文信息;--vv則輸出更詳細信息
- 詳細信息有三個等級,你可以通過在命令行增加 v 標記的個數來獲取更多的信息
- tcpdump -vvv -c 1
- -XX 標記打印出 16 進制和 ASCII 碼格式的數據包(不推薦)
- 因為16進制和ascii對應起來,變成強制換行了,排版太亂
- -A只輸出ASCII碼(推薦)
- 我傾向于只打印 ASCII 格式數據
- 像http協議,http協議頭就要求是ASCII碼,所以打印ASCII碼就剛剛好
[表達式]說明
表達式指正則表達式,tcpdump利用它作為過濾報文的條件,如果一個報文滿足表達式的條件,則會捕獲該報文。
1. 關于類型的關鍵字:
- 主要包括
- host
- host 210.27.48.2
- 指明 210.27.48.2是一臺主機
- 如果沒有指定類型,缺省的類型是host
- net
- net 202.0.0.0
- 指明202.0.0.0是一個網絡addr
- port
- port 23
- 指明端口號是23。
2. 確定傳輸方向的關鍵字:
- 主要包括
- src
- src 210.27.48.2
- 指明ip包中源addr是 210.27.48.2
- 如果沒有指明 方向關鍵字,則缺省是src or dst關鍵字
- dst
- dst net 202.0.0.0
- 指明目的網絡addr是202.0.0.0
- dst or src
- dst and src
3. 協議的關鍵字:
- 主要包括
- fddi
- Fddi指明是在FDDI (分布式光纖數據接口網絡)上的特定的網絡協議,實際上它是”ether”的別名,fddi和ether 具有類似的源addr和目的addr,所以可以將fddi協議包當作ether的包進行處理和分析。 如果沒有指定任何協議,則tcpdump 將會 監聽所有協議的信息包。
- ip
- arp
- rarp
- tcp
- udp
4. 三種邏輯運算:
- 與運算
- 'and','&&'
- 或運算
- 'or' ,'||'
- 非運算
- 'not ' '! '
5. 其他重要的關鍵字:
- gateway, broadcast, less(小于), greater(大于)
tcp狀態說明
不同類型的數據包有不同類型的標記
- [S] – SYN (開始連接)
- [S.] 標記代表這個數據包是 SYN-ACK 數據包
- [.] – 沒有標記
- [.]特殊點,是個占位符,沒有其他flag被設置的時候就顯示這個占位符,一般表示ack
- [P] – PSH (數據推送)
- Flags [P.]
- PSH Push我們上面解釋過,接收方接收到P位的flag包需要馬上將包交給應用層處理,一般我們在http request的最后一個包里都能看到P位被設置
- [F] – FIN (結束連接)
- [R] – RST (重啟連接)
常用例子
抓指定端口的包,輸出ASC碼
tcpdump -n -i lo -A port 8777 (-A參數表示打印應用層ASC碼)
-n:直接以 IP 及 Port Number 顯示,而非主機名與服務名稱;
-i:指定監聽的網絡接口;
- (注意,多網卡情況,一定要指定要抓取的網卡,不然會默認一個,可能就不是你想要的那個網卡)
- -i any 表示抓所有網卡
-A: 只輸出ASCII碼(推薦)
- 我傾向于只打印 ASCII 格式數據
- 像http協議,http協議頭就要求是ASCII碼,所以打印ASCII碼就剛剛好
表達式:
- port 8777
- 指明端口號是8777。
抓發往ip端口的http包,輸出ASC碼
tcpdump -n -i lo -A dst 192.168.0.5 and port 8777 (-A參數表示打印應用層ASC碼)
-i:指定監聽的網絡接口;
- (注意,多網卡情況,一定要指定要抓取的網卡,不然會默認一個,可能就不是你想要的那個網卡)
- -i any 表示抓所有網卡
表達式:
- dst 192.168.0.5 and port 8777
抓取兩臺主機之間的包
獲取主機172.16.252.47和主機172.16.0.1之間通信的數據包
tcpdump -n -i any host 172.16.252.47 and 172.16.0.1
-i:指定監聽的網絡接口;
- (注意,多網卡情況,一定要指定要抓取的網卡,不然會默認一個,可能就不是你想要的那個網卡)
- -i any 表示抓所有網卡
表達式:
- host 172.16.252.47 and 172.16.0.1
tcpdump抓包數據導出給wireshark使用
1、tcpdump port 80 -w aa.cap #抓卡網上的包,可以通過-i選項指定網卡,如eth0
2、然后通過wineshark的過濾語法來找到相應的數據包。這樣就可以免掉一些重復的動作,而且更直觀 http.host == "xxx"
