linux过滤数据包,用Tcpdump过滤数据包
對于網絡管理人員來說,使用嗅探器可以隨時掌握網絡的實際情況,在網絡性能急劇下降的時候,可以通過嗅探器來分析原因,找出造成網絡阻塞的根源。Tcpdump就是Linux平臺下一個以命令行方式運行的網絡流量監測工具。它能截獲網卡上收到的數據包,并能夠協助網絡管理員對其中的內容進行相應的分析。
嗅探器能夠截獲指定接口或所有接口的數據包,這取決于如何對嗅探器進行配置。缺省情況下嗅探器一般會顯示所有從網絡上截獲的數據包,但通常會因為數據量過大而使網絡管理員理不清頭緒。因此,嗅探器一般都提供有相應的機制來對截獲的數據包進行過濾,從而只顯示符合特定要求的數據包。Tcpdump提供了一整套完善的規則來對截獲的數據包進行過濾,由于大多數圖形化的嗅探器都使用類似的過濾機制,因此對Linux網絡管理員來說,了解如何使用Tcpdump來捕獲感興趣的數據包是一項必須掌握的基本功。
Tcpdump的安裝
在一些Linux發行版中,Tcpdump通常作為標準的軟件包被默認安裝,執行“tcpdump”命令可以確定是否已經安裝了Tcpdump。如果系統中還沒有安裝Tcpdump,可以去“3.7.1為例,講述如何安裝Tcpdump,此處使用的操作系統是Red Hat 8.0。
首先下載最新的源碼包,并將其解壓縮,命令如下:
# cp tcpdump-3.7.1.tar.gz /usr/local/src/
# cd /usr/local/src/
# tar xzvf tcpdump-3.7.1.tar.gz
在編譯Tcpdump之前,應先確定pcap庫(libpcap)已經安裝完畢。這個庫是編譯Tcpdump時所必需的。如果該庫已經安裝,就可以執行下面的命令來編譯并安裝Tcpdump:
# cd tcpdump-3.7.1
# ./configure
# make
# make install
Tcpdump的命令行選項
Tcpdump是一個命令行方式的網絡嗅探器。它通過使用命令選項來過濾網卡截獲的數據包,如果不進行過濾,過多數量的包會使網絡管理員很難理清頭緒。Tcpdump的命令格式如下:
tcpdump [ -adeflnNOpqRStuvxX ] [ -c 數量 ] [ -C 文件尺寸 ] [ -F 文件名 ] [ -i 網絡接口 ] [ -m 文件名 ] [ -r 文件名 ] [ -s 長度 ] [ -T 類型 ] [ -w 文件名 ] [ -E algo:secret ] [ 表達式 ]
表1 Tcpdump常用命令行選項 -a 將網絡地址和廣播地址轉變成容易識別的名字
-d 將已截獲的數據包的代碼以人容易理解的格式輸出;
-dd 將已截獲的數據包的代碼以C程序的格式輸出;
-ddd 將已截獲的數據包的代碼以十進制格式輸出;
-e 輸出數據鏈路層的頭部信息;
-f 將internet地址以數字形式輸出;
-l 將標準輸出變為行緩沖方式;
-n 不將網絡地址轉換成易識別的主機名,只以數字形式列出主機地址(如IP地址),這樣可以避免DNS查詢;
-t 不輸出時間戳;
-v 輸出較詳細的信息,例如IP包中的TTL和服務類型信息;
-vv 輸出詳盡的報文信息;
-c 在捕獲指定個數的數據包后退出;
-F 從指定的文件中讀取過濾規則,忽略命令行中指定的其它過濾規則;
-i 指定監聽的網絡接口;
-r 從指定的文件中讀取數據包(該文件一般通過-w選項產生);
-w 將截獲的數據包直接寫入指定的文件中,不對其進行分析和輸出;
-T 將截獲的數據包直接解釋為指定類型的報文,目前支持的類型有cnfp、rpc、rtp、snmp、vat和wb。
表1給出了一些常用的Tcpdump命令行選項,使用這些選項可以過濾出真正感興趣的數據包。
使用Tcpdump的命令行選項可以很方便地過濾出需要的數據包。例如,要過濾掉所有除ARP請求和應答的通信數據,可以輸入“tcpdump arp”命令。該命令只對ARP的請求和應答信息進行截獲,在Tcpdump的輸出信息中,請求是“arp who-has”這樣的條目,而應答則是“arp reply”這樣的條目,如圖1所示。
圖1 ARP過濾
如果要做更多的處理,比如從指定的網絡接口截獲5個ARP數據包,并且不將網絡地址轉換成主機名,則可以用命令“tcpdump arp -i eth0 -c 5 -n”。
Tcpdump的過濾表達式
Tcpdump的過濾表達式是一個正則表達式,Tcpdump利用其作為過濾數據包的條件。如果一個數據包滿足表達式的條件,則這個數據據包將會被捕獲;如果不指定表達式,則在網絡上任何兩臺主機間的所有數據包都將被截獲。過濾表達式的作用就是使Tcpdump只輸出網絡管理員所需要的數據,如一個指定的網絡接口和特定主機間的IP數據包。
Tcpdump的過濾表達式中一般有如下幾種類型的關鍵字:
◆ 類型關鍵字
這類關鍵字用于指定主機、網絡或端口,包括host、net和port三個關鍵字。例如,可以用“host 9.185.10.57”來標明監聽的主機;用“net 9.185.0.0”來標明監聽的網絡;用“port 23”來標明監聽的端口。如果沒有在表達式中指明類型,則缺省的類型為host。
◆ 方向關鍵字
這類關鍵字用于指定截獲的方向,包括dst、src、dst or src、dst and src四個關鍵字。例如,可以用src 9.185.10.57來指明截獲的數據包中的源主機地址;用“dst net 9.185.0.0”來指明截獲的數據包中的目標網絡地址。如果沒有在表達式中指明方向,則缺省的方向為“dst or src”,即兩個方向的數據包都將被捕獲。對于數據鏈路層協議(如SLIP和PPP),使用inbound和outbound來定義方向。
◆ 協議關鍵字
這類關鍵字用于指定要截獲的數據包所屬的協議,包括ether、fddi、tr、ip、ip6、arp、rarp、decnet、tcp和udp等關鍵字。關鍵字fddi指明在FDDI(分布式光纖數據接口網絡)上的特定網絡協議。實際上它是ether的別名。fddi和ether具有類似的源地址和目標地址,所以可以將fddi協議包當作ether的包進行分析和處理。其它幾個關鍵字只是指定了所要截獲的協議數據包。如果沒有在表達式中指明協議,則Tcpdump會截獲所有協議的數據包。
除了上述三種類型的關鍵字外,Tcpdump的過濾表達式中還可以指定的一些重要關鍵字包括gateway、broadcast、multicast、less、greater。這些關鍵字對于監聽網絡中的廣播和多播很有幫助。關于這些關鍵字的更多信息和用法請參考Tcpdump的man手冊。
在Tcpdump的過濾表達式中,各類關鍵字之間還可以通過布爾運算符來構成組合表達式,以滿足實際運用時的需要。布爾運算符包括取非運算符(not或!)、與運算符(and或&&)、或運算符(or或||),使用布爾運算符可以將表達式組合起來構成強大的組合條件,從而能夠對Tcpdump的過濾器做進一步細化。
下面給出幾個使用Tcpdump過濾數據包的例子,嗅探器提供的過濾表達式對于管理員監測網絡運行狀況非常重要:
1. 如果想要截獲主機“9.185.10.57”所有收到和發出的數據包,可以使用如下命令:
# tcpdump host 9.185.10.57
2. 如果想要截獲在主機“9.185.10.57”和主機“9.185.10.58”或“9.185.10.59”之間傳遞的數據包,可以使用如下命令:
# tcpdump host 9.185.10.57 and
>(9.185.10.58 or 9.185.10.59)
需要注意的是,在使用布爾運算符構成組合表達式時,有時需要使用括號來表達復雜的邏輯關系。如果要在命令行中使用括號,一定要用轉義字符(“”)對括號進行轉義,否則命令行解釋器將給出語法錯誤的提示。
3. 如果想要截獲主機“9.185.10.57”和除主機“9.186.10.58”外所有其它主機之間通信的IP數據包,可以使用如下命令:
# tcpdump ip host 9.185.10.57 and ! 9.185.10.58
4. 如果想要截獲主機“9.185.10.57”接收或發出的FTP(端口號為21)數據包,可以使用如下命令:
# tcpdump tcp port 21 host 9.185.10.57
5. 如果懷疑系統正受到拒絕服務(DoS)攻擊,網絡管理員可以通過截獲發往本機的所有ICMP包,來確定目前是否有大量的ping指令流向服務器,此時就可以使用下面的命令:
# tcpdump icmp -n -i eth0
總結
以上是生活随笔為你收集整理的linux过滤数据包,用Tcpdump过滤数据包的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android UI界面目前做的最好的一
- 下一篇: laravel-debugbar