概述
用簡單的話來定義tcpdump,就是:dump the traffic on a network,根據使用者的定義對網絡上的數據包進行截獲的包分析工具。
tcpdump可以將網絡中傳送的數據包的“頭”完全截獲下來提供分析。它支持針對網絡層、協議、主機、網絡或端口的過濾,并提供and、or、not等邏輯語句來幫助你去掉無用的信息。
tcpdump基于底層libpcap庫開發,運行需要root權限。
一、tcpdump安裝
- 環境 虛擬機:vmware 15.5.2 os: ubuntu 12.04
- 安裝tcpdump
sudo apt-get install tcpdump
3. 版本查看
tcpdump --h
tcpdump version 4.0。
libpcap version 1.1.1 表示libpcap的版本。
二、tcpdump參數
常用參數選項說明:
三、命令選項使用舉例
1. 截獲主機收到和發出的所有數據包。
命令:
tcpdump
說明:
tcpdump截取包默認顯示數據包的頭部。
普通情況下,直接啟動tcpdump將監視第一個網絡接口上所有流過的數據包。
基礎格式:時間 數據包類型 源IP 端口/協議 > 目標IP 端口/協議 協議詳細信息
按下Ctrl+C會終止tcpdump命令。且會在結尾處生成統計信息。
終止tcpdump
2. 指定抓包數量 -c
指定抓取2個數據包。
命令:
tcpdump -c 2
說明:
最后會自動生成統計信息。
【注意,已經切換到管理員了,虛擬機中要產生數據包,可以另外開一個窗口ping baidu.com后面不再提示】
ping baidu.com
3. 將抓包信息寫入文件 -w
使用-w選項指定記錄文件。
命令:
tcpdump -c 10 -w tcpdump_test.log
說明:
保存的文件不是文本格式,不能直接查看。tcpdump保存的文件的格式是幾乎所有主流的抓包工具軟件都可以讀取。所以可以使用更易讀的圖形界面工具來查看記錄文件。
4. 讀取記錄文件 -r
使用-r選項讀取文件。
命令:
tcpdump -r tcpdump_test.log
![讀取記錄文件
5. 打印出所有可工作的接口 -D
命令:
tcpdump -D
其中網卡為eth0。
6. 指定監控的網卡 -i
命令:
tcpdump -i eth0
如果不指定網卡,默認tcpdump只會監視第一個網絡接口,一般是eth0。
7. 顯示更詳細的數據包信息 -v -vv
選項-v,-vv可以顯示更詳細的抓包信息。
tcpdump -v
tcpdump -vv
8. 不使用域名反解 -n
使用-n后,tcpdump會直接顯示IP地址,不會顯示域名(與netstat命令相似)。
9. 增加抓包時間戳 -tttt選項
tcpdump的所有輸出打印行中都會默認包含時間戳信息;時間戳信息的顯示格式如下
hh:mm:ss.frac (nt: 小時:分鐘:秒.)
此時間戳的精度與內核時間精度一致, 反映的是內核第一次看到對應數據包的時間;
而數據包從物理線路傳遞到內核的時間, 以及內核花費在此包上的中斷處理時間都沒有算進來;
使用-tttt選項,抓包結果中將包含抓包日期:
命令:
tcpdump -tttt
增加抓包時間戳
四、條件過濾
1. 過濾:指定需要抓取的協議
tcpdump可以只抓某種協議的包,支持指定以下協議:「ip,ip6,arp,tcp,udp,wlan」等。
命令:
tcpdump udp
tcpdump icmp
tcpdump tcp
tcpdump arp
2. 過濾:指定協議的端口號
使用port參數,用于指定端口號。
命令:tcpdump tcp port 80
使用portrange參數,用于指定端口范圍。
命令:tcpdump tcp portrange 1-1024
3. 過濾:指定源與目標
src 表示源。
dst 表示目標。
命令:
tcpdump src port 8080
tcpdump dst port 80
4. 過濾:指定特定主機的消息包
使用host指定需要監聽的主機。
命令:
tcpdump host 192.168.1.113
注意:若使用了host參數使用了計算機名或域名。例tcpdump host shi-pc ,則無法再使用-n選項。
5. 過濾:指定數據包大小
使用greater(大于)與less(小于)可以指定數據包大小的范圍。
「例:只抓取大于1000字節的數據包。」
命令:
tcpdump greater 1000
「例:只抓取小于10字節的數據包。」
命令:
tcpdump less 10
五、 邏輯表達式
使用基本邏輯組合拼裝出更精細的過濾條件。
1. 邏輯與
邏輯與關系,使用and。
命令:
tcpdump tcp and host 192.168.1.112
tcpdump tcp and src 192.168.1.112 and port 8080
2. 邏輯或
邏輯或關系,使用or。
命令:
tcpdump host 192.168.1.112 or 192.168.1.113
3. 邏輯非
邏輯非關系,使用not,也可以使用 ! 。
若使用 ! 必須與其后面的字符隔開一個空格。
例:當通過ssh協議遠程使用tcpdump時,為了避免ssh的數據包的輸出,所以一般需要禁止ssh數據包的輸出。
命令:
tcpdump not tcp port 22
tcpdump ! tcp port 22
4. 括號
括號需要使用在引號內,或轉意使用。否則會報錯。
例:抓取非22端口,且主機為192.168.1.112 和 192.168.1.113的TCP數據包。
命令:
tcpdump not tcp port 22 and host 192.168.1.112or192.168.1.113
tcpdump "not tcp port 22 and host (192.168.1.112 or 192.168.1.113)"
tcpdump not tcp port 22 and host "(192.168.1.112 or 192.168.1.113)"
六、其他實例
1. 打印所有進入或離開sundown的數據包.
tcpdump host sundown
2. 截獲主機210.27.48.1 和主機210.27.48.2 或210.27.48.3的通信
tcpdump host 210.27.48.1 and (210.27.48.2 or 210.27.48.3 )
3. 如果想要獲取主機210.27.48.1除了和主機210.27.48.2之外所有主機通信的ip包,使用命令:
tcpdump ip host 210.27.48.1 and ! 210.27.48.2
4. 監視所有送到主機hostname的數據包
tcpdump -i eth0 dst host hostname
5. 獲取主機210.27.48.1接收或發出的telnet包
23為telnet的端口
tcpdump tcp port 23 and host 210.27.48.1
6. 監視本機的udp 123 端口
123 為ntp的服務端口
tcpdump udp port 123
7. 使用tcpdump抓取HTTP包
tcpdump -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
- 0x4745 為"GET"前兩個字母"GE",
- 0x4854 為"HTTP"前兩個字母"HT"。
tcpdump 對截獲的數據并沒有進行徹底解碼,數據包內的大部分內容是使用十六進制的形式直接打印輸出的。
顯然這不利于分析網絡故障,通常的解決辦法是先使用帶**-w參數的tcpdump 截獲數據并保存到文件中**,然后再使用其他程序(如Wireshark)進行解碼分析。當然也應該定義過濾規則,以避免捕獲的數據包填滿整個硬盤。
六、查看數據包完整內容
tcpdump默認不顯示數據包的詳細內容。
方法一:
使用-A參數能以ASCII碼顯示數據包。
例:只抓取1個數據包,并顯示其內容。
命令:
tcpdump -c 1 -A
方法二:
使用-X參數能16進制數與ASCII碼共同顯示數據包。
例:只抓取1個數據包,并顯示其內容。
命令:
tcpdump -c 1 -X
七、tcpdump 與wireshark
Wireshark(以前是ethereal)是windows下非常簡單易用的抓包工具,現在也有linux版本。
通過Tcpdump抓取的數據包分析比較麻煩,要想很方便的分析數據包, 我們可以用Tcpdump + Wireshark 的完美組合實現:在 Linux 里抓包,然后在Windows 里分析包。
保存數據包為wireshark能識別的文件:
tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap