tcpdump的基本使用
概述
用簡單的話來定義tcpdump,就是:dump the traffic on a network,根據使用者的定義對網絡上的數據包進行截獲的包分析工具。 tcpdump可以將網絡中傳送的數據包的“頭”完全截獲下來提供分析。它支持針對網絡層、協議、主機、網絡或端口的過濾,并提供and、or、not等邏輯語句來幫助你去掉無用的信息。
命令簡介
tcpdump [ -adeflnNOpqStvx ] [ -c 數量 ] [ -F 文件名 ]
[ -i 網絡接口 ] [ -r 文件名] [ -s snaplen ]
[ -T 類《》型 ] [ -w 文件名 ] [表達式 ]
OPTIONS
-A 以ASCII格式打印所有分組 -c 收到count個包后退出 -C 在將包寫入文件前,先檢查文件大小是否超過file_size大小,如果超過則關閉該文件并重新打開新文件 -D 打印出系統中所有可用tcpdump監聽的端口 -e 打印出鏈路層包頭信息 -f 將外部的Internet地址以數字的形式打印出來 -F 從指定文件中讀取表達式,忽略命令行的表達式 -i 監聽的網絡端口,如果沒有指定,則監聽最低號碼的端口。在2.2內核以后,可以使用any參數使tcpdump監聽在所有端口 -n 不把ip地址轉化成名稱 -N 不輸出主機名中的域名部分 -P 不將接口設置成混雜模式 -q 快速輸出,輸出較少的協議信息 -r 在一個文件中讀取包信息(使用-w創建的文件) -T 將監聽到的包直接解釋為指定的類型的報文 -v 輸出一個詳細的包信息,當使用-w把報文寫入一個文件中時,每10秒報告一次 -vv 輸出更詳細 -vvv 輸出更詳細 -t 不在每一行顯示時間戳 -tt 在每一行中顯示非格式化的時間戳 -ttt 輸出本行和前面一行的時間差 -u 輸出未解碼的NFS句柄 -w 把抓取的包寫入一個文件中,稍后可以使用-r從該文件中讀取包信息,如果把輸出寫入一個文件或者管道中, 輸出會先輸入buffer中, 所以從文件中讀取會有延遲,使用-U標記可以使包信息立刻寫入文件中
表達式是一個正則表達式,tcpdump利用它作為過濾報文的條件,如果一個報文滿足表達式的條件,則這個報文將會被捕獲。如果沒有給出任何條件,則網絡上所有的信息包將會被截獲。在表達式中一般如下幾種類型的關鍵字。
第一種是關于目標類型的關鍵字,主要包括host,net,port, 例如 host 210.27.48.2,指明210.27.48.2是一臺主機,net 202.0.0.0 指明 202.0.0.0是一個網絡地址,port 23 指明端口號是23。如果沒有指定類型,缺省的類型是host.
第二種是確定傳輸方向的關鍵字,主要包括src, dst,dst or src, dst and src,這些關鍵字指明了傳輸的方向。舉例說明,src 210.27.48.2 ,指明ip包中源地址是210.27.48.2, dst net 202.0.0.0指明目的網絡地址是202.0.0.0。如果沒有指明方向關鍵字,則缺省是src or dst關鍵字。
第三種是協議的關鍵字,主要包括fddi,ip,arp,rarp,tcp,udp等類型。Fddi指明是在FDDI(分布式光纖數據接口網絡)上的特定的網絡協議,實際上它是"ether"的別名,fddi和ether具有類似的源地址和目的地址,所以可以將fddi協議包當作ether的包進行處理和分析。其他的幾個關鍵字就是指明了監聽的包的協議內容。如果沒有指定任何協議,則tcpdump將會監聽所有協議的信息包。
除了這三種類型的關鍵字之外,其他重要的關鍵字如下:gateway, broadcast,less,greater,還有三種邏輯運算,取非運算是 'not ' '! ', 與運算是'and','&&';或運算 是'or' ,'││';這些關鍵字可以組合起來構成強大的組合條件來滿足人們的需要。
實用命令實例
tcpdump只是一個抓取工具,更重要的是會對抓取的包進行分析。
默認啟動
tcpdump
普通情況下,直接啟動tcpdump將監視第一個網絡接口上所有流過的數據包。
監視指定網絡接口的數據包
tcpdump -i eth1
如果不指定網卡,默認tcpdump只會監視第一個網絡接口,一般是eth0,下面的例子都沒有指定網絡接口。
監視指定主機的數據包
打印所有進入或離開sundown的數據包.
tcpdump host sundown
也可以指定ip,例如截獲所有210.27.48.1 的主機收到的和發出的所有的數據包
tcpdump host 210.27.48.1
打印helios 與 hot 或者與 ace 之間通信的數據包
tcpdump host helios and \( hot or ace \)
截獲主機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 \)
打印ace與任何其他主機之間通信的IP 數據包, 但不包括與helios之間的數據包.
tcpdump ip host ace and not helios
如果想要獲取主機210.27.48.1除了和主機210.27.48.2之外所有主機通信的ip包,使用命令:
tcpdump ip host 210.27.48.1 and ! 210.27.48.2
截獲主機hostname發送的所有數據
tcpdump -i eth0 src host hostname
監視所有送到主機hostname的數據包
tcpdump -i eth0 dst host hostname
監視指定主機和端口的數據包
如果想要獲取主機210.27.48.1接收或發出的telnet包,使用如下命令
tcpdump tcp port 23 host 210.27.48.1
對本機的udp 123 端口進行監視 123 為ntp的服務端口
tcpdump udp port 123
監聽與制定主機 udp 53 端口的數據包
tcpdump -i eth0 udp port 53 and host 10.1.22.112
監視指定網絡的數據包
打印本地主機與Berkeley網絡上的主機之間的所有通信數據包(nt: ucb-ether, 此處可理解為'Berkeley網絡'的網絡地址,此表達式最原始的含義可表達為: 打印網絡地址為ucb-ether的所有數據包)
tcpdump net ucb-ether
打印所有通過網關snup的ftp數據包(注意, 表達式被單引號括起來了, 這可以防止shell對其中的括號進行錯誤解析)
tcpdump 'gateway snup and (port ftp or ftp-data)'
打印所有源地址或目標地址是本地主機的IP數據包
(如果本地網絡通過網關連到了另一網絡, 則另一網絡并不能算作本地網絡.(nt: 此句翻譯曲折,需補充).localnet 實際使用時要真正替換成本地網絡的名字)
tcpdump ip and not net localnet