工做中一直在用tcpdump,感受很是方便,今天心血來潮百度了一下tcpdump的用法,才發現原來還有這麼多強大的功能本身都不知道,那叫一個汗啊。 html
以此文做爲備份,記錄一些新知道的用法,各位網友誰有新的用法,也能夠及時告知我進行補充,一塊兒豐富,哈哈! linux
本人郵箱:rick1026zhang@gmail.com ios
廢話很少說,切入正題。命令及解釋用紅色字體,命令所需參數的參數值用斜體標示。 程序員
先來看一個比較基本的用法: 正則表達式
tcpdump -i eth0 express
其中,eth0爲參數值,表示須要抓包的網口,這是個必需參數哦。 vim
tcpdump支持不少的關鍵字,下面先看幾個例子: windows
(例1)tcpdump -i eth0 host 192.168.0.250 -----在網口eth0上抓取主機地址爲192.168.0.250的全部數據包。 數組
(例2)tcpdump -i eth0 net 192.168.0.0/24 ------ 在網口eth0上抓取網絡地址爲192.168.0.0/24的全部數據包 安全
(例3)tcpdump -i eth0 port 80 ------ 在網口eth0上抓取端口爲80的全部數據包(注意,這裏不區分是源端口仍是目的端口)
固然,咱們也能夠指定源端口或目的端口
(例4)tcpdump -i eth0 src port 80 and dst port6100 --- 在網口eth0上抓取源端口爲80且目的端口爲6100的數據包,這裏用到了and邏輯運算符,後面再介紹
(例5)tcpdump -i eth0 icmp --- 在網口eth0上抓取全部icmp協議的數據包
以上幾個例子,能夠大體體現出tcpdump的基本用法。
實際上,tcpdump主要包括三種類型的關鍵字,第一種是關於類型的關鍵字,主要包括host,net,port,如上面的例(1)(2)(3),第二種
是肯定傳輸方向的關鍵字,主要包括src,dst,src or dst,src and dst,這些關鍵字指明瞭傳輸的方向,如上面的例(4)。第三種是協議關鍵字,包括fddi,ip,arp,
rarp,tcp,udp,imcp等,如上面的例(5)。
除了這三種類型的關鍵字外,還有其餘重要的關鍵字,如:gateway,broadcast,less,greater,還有三種邏輯運算,取非運算是'not'、'!',與運算符是'and'、'&&'、
或運算符是'or'、'||',這些關鍵字能夠組合起來構成強大的組合條件來知足咱們的需求。
先看看tcpdump的具體參數及意義:
-i:指定tcpdump監聽的網絡接口
-s:指定要監聽數據包的長度
-c:指定要監聽的數據包數量,達到指定數量後自動中止抓包
-w:指定將監聽到的數據包寫入文件中保存
-A:指定將每一個監聽到的數據包以ACSII可見字符打印
-n:指定將每一個監聽到數據包中的域名轉換成IP地址後顯示
-nn:指定將每一個監聽到的數據包中的域名轉換成IP、端口從應用名稱轉換成端口號後顯示
-e:指定將監聽到的數據包鏈路層的信息打印出來,包括源mac和目的mac,以及網絡層的協議
-p:將網卡設置爲非混雜模式,不能與host或broadcast一塊兒使用
-r:指定從某個文件中讀取數據包
-S:指定打印每一個監聽到的數據包的TCP絕對序列號而非相對序列號
OK,參數介紹先到這裏,下面看幾個具體例子
tcpdump -i eth0 -s 1400 -nn host 192.168.0.250 and ! 192.168.0.74 and icmp -e
抓取網口eth0上192.168.0.250與除192.168.0.74外的其餘主機之間的icmp報文
tcpdump -i eth0 -s 1400 -nn tcp and \(host 192.168.0.250 and ! 192.168.0.74\)
抓取網口eth0上192.168.0.250與除192.168.0.74外的全部tcp數據包,這裏用到了括號,注意,在tcpdump中使用括號時必須用轉義。
tcpdump -i eth0 ether src or dst 00:21:85:6C:D9:A3
抓取網口eth0上源mac地址或目的mac地址爲00:21:85:6C:D9:A3的全部數據包,注意,這裏的mac地址格式必須以':'分隔。
=============================================================================================================
下面是參考的一篇文章的原文http://linux.chinaitlab.com/administer/840012.html:
TCPDUMP簡介
在傳統的網絡分析和測試技術中,嗅探器(sniffer)是最多見,也是最重要的技術之一。sniffer工具首先是爲網絡管理員和網絡程序員進行網絡分析而設計的。對於網絡管理人員來講,使用嗅探器能夠隨時掌握網絡的實際狀況,在網絡性能急劇降低的時候,能夠經過sniffer工具來分析緣由,找出形成網絡阻塞的來源。對於網絡程序員來講,經過sniffer工具來調試程序。
用過windows平臺上的sniffer工具(例如,netxray和sniffer pro軟件)的朋友可能都知道,在共享式的局域網中,採用sniffer工具簡直能夠對網絡中的全部流量盡收眼底!Sniffer工具實際上就是一個網絡上的抓包工具,同時還能夠對抓到的包進行分析。因爲在共享式的網絡中,信息包是會廣播到網絡中全部主機的網絡接口,只不過在沒有使用sniffer工具以前,主機的網絡設備會判斷該信息包是否應該接收,這樣它就會拋棄不該該接收的信息包,sniffer工具卻使主機的網絡設備接收全部到達的信息包,這樣就達到了網絡監聽的效果。
Linux做爲網絡服務器,特別是做爲路由器和網關時,數據的採集和分析是必不可少的。因此,今天咱們就來看看Linux中強大的網絡數據採集分析工具——TcpDump。
用簡單的話來定義tcpdump,就是:dump the traffice on a network,根據使用者的定義對網絡上的數據包進行截獲的包分析工具。
做爲互聯網上經典的的系統管理員必備工具,tcpdump以其強大的功能,靈活的截取策略,成爲每一個高級的系統管理員分析網絡,排查問題等所必備的東東之一。
顧名思義,TcpDump能夠將網絡中傳送的數據包的「頭」徹底截獲下來提供分析。它支持針對網絡層、協議、主機、網絡或端口的過濾,並提供and、or、not等邏輯語句來幫助你去掉無用的信息。
tcpdump提供了源代碼,公開了接口,所以具有很強的可擴展性,對於網絡維護和入侵者都是很是有用的工具。tcpdump存在於基本的FreeBSD系統中,因爲它須要將網絡界面設置爲混雜模式,普通用戶不能正常執行,但具有root權限的用戶能夠直接執行它來獲取網絡上的信息。所以系統中存在網絡分析工具主要不是對本機安全的威脅,而是對網絡上的其餘計算機的安全存在威脅。
普通狀況下,直接啓動tcpdump將監視第一個網絡界面上全部流過的數據包。
-----------------------
bash-2.02# tcpdump
tcpdump: listening on eth0
11:58:47.873028 202.102.245.40.netbios-ns > 202.102.245.127.netbios-ns: udp 50
11:58:47.974331 0:10:7b:8:3a:56 > 1:80:c2:0:0:0 802.1d ui/C len=43
0000 0000 0080 0000 1007 cf08 0900 0000
0e80 0000 902b 4695 0980 8701 0014 0002
000f 0000 902b 4695 0008 00
11:58:48.373134 0:0:e8:5b:6d:85 > Broadcast sap e0 ui/C len=97
ffff 0060 0004 ffff ffff ffff ffff ffff
0452 ffff ffff 0000 e85b 6d85 4008 0002
0640 4d41 5354 4552 5f57 4542 0000 0000
0000 00
^C
------------------------
首先咱們注意一下,從上面的輸出結果上能夠看出來,基本上tcpdump總的的輸出格式爲:系統時間 來源主機.端口 > 目標主機.端口 數據包參數
TcpDump的參數化支持
tcpdump支持至關多的不一樣參數,如使用-i參數指定tcpdump監聽的網絡界面,這在計算機具備多個網絡界面時很是有用,使用-c參數指定要監聽的數據包數量,使用-w參數指定將監聽到的數據包寫入文件中保存,等等。
然而更復雜的tcpdump參數是用於過濾目的,這是由於網絡中流量很大,若是不加分辨將全部的數據包都截留下來,數據量太大,反而不容易發現須要的數據包。使用這些參數定義的過濾規則能夠截留特定的數據包,以縮小目標,才能更好的分析網絡中存在的問題。tcpdump使用參數指定要監視數據包的類型、地址、端口等,根據具體的網絡問題,充分利用這些過濾規則就能達到迅速定位故障的目的。請使用man tcpdump查看這些過濾規則的具體用法。
顯然爲了安全起見,不用做網絡管理用途的計算機上不該該運行這一類的網絡分析軟件,爲了屏蔽它們,能夠屏蔽內核中的bpfilter僞設備。通常狀況下網絡硬件和TCP/IP堆棧不支持接收或發送與本計算機無關的數據包,爲了接收這些數據包,就必須使用網卡的混雜模式,並繞過標準的TCP/IP堆棧才行。在FreeBSD下,這就須要內核支持僞設備bpfilter。所以,在內核中取消bpfilter支持,就能屏蔽tcpdump之類的網絡分析工具。
而且當網卡被設置爲混雜模式時,系統會在控制檯和日誌文件中留下記錄,提醒管理員留意這臺系統是否被用做攻擊同網絡的其餘計算機的跳板。
May 15 16:27:20 host1 /kernel: fxp0: promiscuous mode enabled
雖然網絡分析工具能將網絡中傳送的數據記錄下來,可是網絡中的數據流量至關大,如何對這些數據進行分析、分類統計、發現並報告錯誤倒是更關鍵的問題。網絡中的數據包屬於不一樣的協議,而不一樣協議數據包的格式也不一樣。所以對捕獲的數據進行解碼,將包中的信息儘量的展現出來,對於協議分析工具來說更爲重要。昂貴的商業分析工具的優點就在於它們能支持不少種類的應用層協議,而不只僅只支持tcp、udp等低層協議。
從上面tcpdump的輸出能夠看出,tcpdump對截獲的數據並無進行完全解碼,數據包內的大部份內容是使用十六進制的形式直接打印輸出的。顯然這不利於分析網絡故障,一般的解決辦法是先使用帶-w參數的tcpdump 截獲數據並保存到文件中,而後再使用其餘程序進行解碼分析。固然也應該定義過濾規則,以免捕獲的數據包填滿整個硬盤。
TCP功能
數據過濾
不帶任何參數的TcpDump將搜索系統中全部的網絡接口,並顯示它截獲的全部數據,這些數據對咱們不必定全都須要,並且數據太多不利於分析。因此,咱們應當先想好須要哪些數據,TcpDump提供如下參數供咱們選擇數據:
-b 在數據-鏈路層上選擇協議,包括ip、arp、rarp、ipx都是這一層的。
例如:tcpdump -b arp 將只顯示網絡中的arp即地址轉換協議信息。
-i 選擇過濾的網絡接口,若是是做爲路由器至少有兩個網絡接口,經過這個選項,就能夠只過濾指定的接口上經過的數據。例如:
tcpdump -i eth0 只顯示經過eth0接口上的全部報頭。
src、dst、port、host、net、ether、gateway這幾個選項又分別包含src、dst 、port、host、net、ehost等附加選項。他們用來分辨數據包的來源和去向,src host 192.168.0.1指定源主機IP地址是192.168.0.1,dst net 192.168.0.0/24指定目標是網絡192.168.0.0。以此類推,host是與其指定主機相關不管它是源仍是目的,net是與其指定網絡相關的,ether後面跟的不是IP地址而是物理地址,而gateway則用於網關主機。可能有點複雜,看下面例子就知道了:
tcpdump src host 192.168.0.1 and dst net 192.168.0.0/24
過濾的是源主機爲192.168.0.1與目的網絡爲192.168.0.0的報頭。
tcpdump ether src 00:50:04:BA:9B and dst……
過濾源主機物理地址爲XXX的報頭(爲何ether src後面沒有host或者net?物理地址固然不可能有網絡嘍)。
Tcpdump src host 192.168.0.1 and dst port not telnet
過濾源主機192.168.0.1和目的端口不是telnet的報頭。
ip icmp arp rarp 和 tcp、udp、icmp這些選項等都要放到第一個參數的位置,用來過濾數據報的類型。
例如:
tcpdump ip src……
只過濾數據-鏈路層上的IP報頭。
tcpdump udp and src host 192.168.0.1
只過濾源主機192.168.0.1的全部udp報頭。
數據顯示/輸入輸出
TcpDump提供了足夠的參數來讓咱們選擇如何處理獲得的數據,以下所示:
-l 能夠將數據重定向。
如tcpdump -l >tcpcap.txt將獲得的數據存入tcpcap.txt文件中。
-n 不進行IP地址到主機名的轉換。
若是不使用這一項,當系統中存在某一主機的主機名時,TcpDump會把IP地址轉換爲主機名顯示,就像這樣:eth0 < ntc9.1165> router.domain.net.telnet,使用-n後變成了:eth0 < 192.168.0.9.1165 > 192.168.0.1.telnet。
-nn 不進行端口名稱的轉換。
上面這條信息使用-nn後就變成了:eth0 < ntc9.1165 > router.domain.net.23。
-N 不打印出默認的域名。
仍是這條信息-N 後就是:eth0 < ntc9.1165 > router.telnet。
-O 不進行匹配代碼的優化。
-t 不打印UNIX時間戳,也就是不顯示時間。
-tt 打印原始的、未格式化過的時間。
-v 詳細的輸出,也就比普通的多了個TTL和服務類型。
[expression]的用法:
expression是tcpdump最爲有用的高級用法,能夠利用它來匹配一些特殊的包。下面介紹一下expression的用法,主要是如何寫出符合要求最爲嚴格expression。若是tcpdump中沒有expression,那麼tcpdump會把網卡上的全部數據包輸出,不然會將被expression匹配的包輸出。
expression 由一個或多個[primitives]組成,而[primitives]由一個或多個[qualitifer]加一個id(name)或數字組成,它們的結構如用正則表達式則可表示爲:
expression = ([qualitifer]+(id|number))+
依次看來,expression是一個複雜的條件表達式,其中[qualitifer]+(id|number)就是一個比較基本條件,qualitifer就表達一些的名稱(項,變量),id或number則表示一個值(或常量)。
qualitifer共有三種,分別是:
type 表示id name或number涉及到的類型,這些詞有host, nest, port ,portrange等等。
例子:
host foo 此爲一個簡單的primitive,host爲qualitifer, foo爲id name
net 128.3 net爲qualitifer, 128.3爲number
port 20
等等
每一個privimtive必須有一個type詞,若是表達式中沒有,則默認是host.
dir 指定數據傳輸的方向,這些詞有src, dst, src or dst, src and dst
例子:
dst net 128.3 ;此爲一個相對複雜的primitive,結構爲dir type number,表示目標網絡爲128.3的條件。
src or dst port ftp-data 此爲比上一個相對簡的結構,src or dst表示源或目標,ftp-data爲id,表示ftp協議中數據傳輸端口,故總體表示源或目標端口ftp-data的數據包即匹配。
若是在一個primitive中沒有dir詞,此默認爲src or dst. 如 host foo則表示源或目標主機爲foo的數據包都匹配。
proto 此種詞是用來匹配某種特定協議的,這些詞包括:ether, fddi, tr, wlan, ip, ip6, arp, rarp, decnet,tcp和udp。其實這些詞常常用來匹配某種協議,是使用率最高的一組詞了。
上面三種qualitifer和id name或number組成一個primitive一般是下面這種方式的:
proto dir type id(number) ,即primitive=proto dir type (id | number)
如:
tcp src port 80
ip dst host 192.168.1.1
若是出現type的話,必定會出現id或num
若是出現dir,那麼也會出現type,若是不出現,默認爲host
而proto可單獨出現,如 tcpdump 'tcp'
經過上面介紹的三種qualitifer,咱們很快就能夠寫出一個primitive,下面我就只用一個primitive做爲expression匹配數據包。
(1)匹配ether包
匹配特定mac地址的數據包。
tcpdump 'ether src 00:19:21:1D:75:E6'
匹配源mac爲00:19:21:1D:75:E6的數據包其中src可改成dst, src or dst來匹改變條件
匹配ether廣播包。ether廣播包的特徵是mac全1.故以下便可匹配:
tcpdump 'ether dst ff:ff:ff:ff:ff:ff'
ylin@ylin :~$ sudo tcpdump -c 1 'ether dst ff:ff:ff:ff:ff:ff'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
10:47:57.784099 arp who-has 192.168.240.77 tell 192.168.240.189
在此,只匹配1個包就退出了。第一個是arp請求包,arp請求包的是採用廣播的方式發送的,被匹配那是當之無愧的。
匹配ether組播包,ether的組播包的特徵是mac的最高位爲1,其它位用來表示組播組編號,若是你想匹配其的多播組,知道它的組MAC地址便可。如
tcpdump 'ether dst <Mac_Adrress>' Mac_Address表示地址,填上適當的便可。若是想匹配全部的ether多播數據包,那麼暫時請放下,下面會繼續爲你講解更高級的應用。
(2)匹配arp包
arp包用於IP到Mac址轉換的一種協議,包括arp請求和arp答應兩種報文,arp請求報文是ether廣播方式發送出去的,也即 arp請求報文的mac地址是全1,所以用ether dst FF;FF;FF;FF;FF;FF能夠匹配arp請求報文,但不能匹配答應報文。所以要匹配arp的通訊過程,則只有使用arp來指定協議。
tcpdump 'arp' 便可匹配網絡上arp報文。
ylin@ylin :~$ arping -c 4 192.168.240.1>/dev/null& sudo tcpdump -p 'arp'
[1] 9293
WARNING: interface is ignored: Operation not permitted
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
11:09:25.042479 arp who-has 192.168.240.1 (00:03:d2:20:04:28 (oui Unknown)) tell ylin.local
11:09:25.042702 arp reply 192.168.240.1 is-at 00:03:d2:20:04:28 (oui Unknown)
11:09:26.050452 arp who-has 192.168.240.1 (00:03:d2:20:04:28 (oui Unknown)) tell ylin.local
11:09:26.050765 arp reply 192.168.240.1 is-at 00:03:d2:20:04:28 (oui Unknown)
11:09:27.058459 arp who-has 192.168.240.1 (00:03:d2:20:04:28 (oui Unknown)) tell ylin.local
11:09:27.058701 arp reply 192.168.240.1 is-at 00:03:d2:20:04:28 (oui Unknown)
11:09:33.646514 arp who-has ylin.local tell 192.168.240.1
11:09:33.646532 arp reply ylin.local is-at 00:19:21:1d:75:e6 (oui Unknown)
本例中使用arping -c 4 192.168.240.1產生arp請求和接收答應報文,而tcpdump -p 'arp'匹配出來了。此處-p選項是使網絡工做於正常模式(非混雜模式),這樣是方便查看匹配結果。
(3)匹配IP包
衆所周知,IP協議是TCP/IP協議中最重要的協議之一,正是由於它才能把Internet互聯起來,它可謂功不可沒,下面分析匹配IP包的表達式。
對IP進行匹配
tcpdump 'ip src 192.168.240.69'
ylin@ylin :~$ sudo tcpdump -c 3 'ip src 192.168.240.69'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
11:20:00.973605 IP ylin.local.51486 > walnut.crossbeamsys.com.ssh: S 2706301341:2706301341(0) win 5840 <mss 1460,sackOK,timestamp 1687608 0,nop,wscale 5>
11:20:00.974328 IP ylin.local.32849 > 192.168.200.150.domain: 5858+ PTR? 20.200.168.192.in-addr.arpa. (45)
11:20:01.243490 IP ylin.local.51486 > walnut.crossbeamsys.com.ssh: . ack 2762262674 win 183 <nop,nop,timestamp 1687676 4155416897>
IP廣播組播數據包匹配:只需指明廣播或組播地址便可
tcpdump 'ip dst 240.168.240.255'
ylin@ylin :~$ sudo tcpdump 'ip dst 192.168.240.255'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
11:25:29.690658 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 1, length 64
11:25:30.694989 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 2, length 64
11:25:31.697954 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 3, length 64
11:25:32.697970 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 4, length 64
11:25:33.697970 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 5, length 64
11:25:34.697982 IP dd.local > 192.168.240.255: ICMP echo request, id 10022, seq 6, length 64
此處匹配的是ICMP的廣播包,要產生此包,只須要同一個局域網的另外一臺主機運行ping -b 192.168.240.255便可,固然還可產生組播包,因爲沒有適合的軟件進行模擬產生,在此不舉例子。
(4)匹配TCP數據包
TCP一樣是TCP/IP協議棧裏面最爲重要的協議之一,它提供了端到端的可靠數據流,同時不少應用層協議都是把TCP做爲底層的通訊協議,由於TCP的匹配是很是重要的。
若是想匹配HTTP的通訊數據,那隻需指定匹配端口爲80的條件便可
tcpdump 'tcp dst port 80'
ylin@ylin :~$ wget http://www.baidu.com 2>1 1 >/dev/null & sudo tcpdump -c 5 'tcp port 80'
[1] 10762
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
12:02:47.549056 IP xd-22-43-a8.bta.net.cn.www > ylin.local.47945: S 1202130469:1202130469(0) ack 1132882351 win 2896 <mss 1460,sackOK,timestamp 3497190920 2329221,nop,wscale 2>
12:02:47.549085 IP ylin.local.47945 > xd-22-43-a8.bta.net.cn.www: . ack 1 win 183 <nop,nop,timestamp 2329258 3497190920>
12:02:47.549226 IP ylin.local.47945 > xd-22-43-a8.bta.net.cn.www: P 1:102(101) ack 1 win 183 <nop,nop,timestamp 2329258 3497190920>
12:02:47.688978 IP xd-22-43-a8.bta.net.cn.www > ylin.local.47945: . ack 102 win 698 <nop,nop,timestamp 3497190956 2329258>
12:02:47.693897 IP xd-22-43-a8.bta.net.cn.www > ylin.local.47945: . 1:1409(1408) ack 102 win 724 <nop,nop,timestamp 3497190957 2329258>
(5)匹配udp數據包
udp是一種無鏈接的非可靠的用戶數據報,所以udp的主要特徵一樣是端口,用以下方法能夠匹配某一端口
tcpdump 'upd port 53' 查看DNS的數據包
ylin@ylin :~$ ping -c 1 www.baidu.com > /dev/null& sudo tcpdump -p udp port 53
[1] 11424
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
12:28:09.221950 IP ylin.local.32853 > 192.168.200.150.domain: 63228+ PTR? 43.22.108.202.in-addr.arpa. (44)
12:28:09.222607 IP ylin.local.32854 > 192.168.200.150.domain: 5114+ PTR? 150.200.168.192.in-addr.arpa. (46)
12:28:09.487017 IP 192.168.200.150.domain > ylin.local.32853: 63228 1/0/0 (80)
12:28:09.487232 IP 192.168.200.150.domain > ylin.local.32854: 5114 NXDomain* 0/1/0 (140)
12:28:14.488054 IP ylin.local.32854 > 192.168.200.150.domain: 60693+ PTR? 69.240.168.192.in-addr.arpa. (45)
12:28:14.755072 IP 192.168.200.150.domain > ylin.local.32854: 60693 NXDomain 0/1/0 (122)
使用ping www.baidu.com目標是產生DNS請求和答應,53是DNS的端口號。
此外還有不少qualitifer是尚未說起的,下面是其它合法的primitive,在tcpdump中是能夠直接使用的。
gateway host
匹配使用host做爲網關的數據包,即數據報中mac地址(源或目的)爲host,但IP報的源和目的地址不是host的數據包。
dst net net
src net net
net net
net net mask netmask
net net/len
匹配IPv4/v6地址爲net網絡的數據報。
其中net能夠爲192.168.0.0或192.168這兩種形式。如net 192.168 或net 192.168.0.0
net net mask netmask僅對IPv4數據包有效,如net 192.168.0.0 mask 255.255.0.0
net net/len一樣只對IPv4數據包有效,如net 192.168.0.0/16
dst portrange port1-port2
src portrange port1-port2
portrange port1-port2
匹配端口在port1-port2範圍內的ip/tcp,ip/upd,ip6/tcp和ip6/udp數據包。dst, src分別指明源或目的。沒有則表示src or dst
less length 匹配長度少於等於length的報文。
greater length 匹配長度大於等於length的報文。
ip protochain protocol 匹配ip報文中protocol字段值爲protocol的報文
ip6 protochain protocol 匹配ipv6報文中protocol字段值爲protocol的報文
如tcpdump 'ip protochain 6 匹配ipv4網絡中的TCP報文,與tcpdump 'ip && tcp'用法同樣,這裏的&&鏈接兩個primitive。6是TCP協議在IP報文中的編號。
ether broadcast
匹配以太網廣播報文
ether multicast
匹配以太網多播報文
ip broadcast
匹配IPv4的廣播報文。也即IP地址中主機號爲全0或全1的IPv4報文。
ip multicast
匹配IPv4多播報文,也就是IP地址爲多播地址的報文。
ip6 multicast
匹配IPv6多播報文,即IP地址爲多播地址的報文。
vlan vlan_id
匹配爲vlan報文 ,且vlan號爲vlan_id的報文
到些爲此,咱們一直在介紹primitive是如何使用的,也即expression只有一個primitive。經過學會寫好每一個primtive,咱們就很容易把多個primitive組成一個expression,方法很簡單,經過邏輯運算符鏈接起來就能夠了,邏輯運算符有如下三個:
「&&」 或」and」
「||」 或「or」
「!」 或「not」
而且可經過()進行復雜的鏈接運算。
如tcpdump ‘ip && tcp’
tcpdump ‘ host 192.168.240.3 &&( tcp port 80 || tcp port 443)’
經過上面的各類primitive,咱們能夠寫出很豐富的條件,如ip, tcp, udp,vlan等等。如IP,能夠按址址進行匹,tcp/udp能夠按端口匹配。可是,若是我想匹配更細的條件呢?如tcp中只含syn標誌,fin標誌的報文呢?上面的primitive恐怕無能爲力了。不用怕,tcpdump爲你提供最後一個功能最強大的primitive,記住是primitive,而不是expression。你能夠用多個這個的primitive組成更復雜的 expression.
最後一個primitive形式爲 expr relop expr
若把這個形式記爲A,那麼你可這樣寫tcpdump 'A1 && A2 && ip src 192.168.200.1',等等。
下面咱們就來分析A這個形式,看看這是如何強大,若是你以爲很亂的話,建議你先用用上面的知識來實際操做幾回,要否則就會很亂的,由於expression太複雜了。
形式:expr relop expr
relop表示關係操做符,能夠爲>, < ,>=,<=, =, !=之一,
expr是一個算術表達式,由整數組成和二元運算符(+,-,*,/,&,|, <<, >>),長度操做,報文數據訪問子。同時全部的整數都是無符號的,即0x80000000 和 0xffffffff > 0。爲了訪問報文中的數據,可以使用以下方式:
proto [ expr : size ]
proto表示該問的報文,expr的結果表示該報文的偏移,size爲可選的,表示從expr偏移量起的szie個字節,整個表達式爲proto報文 中,expr起的szie字節的內容(無符號整數)
下面是expr relop expr這種形式primitive的例子:
'ether[0] & 1 !=0' ether報文中第0個bit爲1,即以太網廣播或組播的primtive。
經過這種方式,咱們能夠對報文的任何一個字節進行匹配了,所以它的功能是十分強大的。
‘ip[0] = 4’ ip報文中的第一個字節爲version,即匹配IPv4的報文,
若是咱們想匹配一個syn報文,可使用:'tcp[13] = 2',由於tcp的標誌位爲TCP報文的第13個字節,而syn在這個字節的低1位,故匹配只有syn標誌的報文,上述條件是可滿要求的,而且比較嚴格。
若是想匹配ping命令的請求報文,可使用'icmp[0]=8',由於icmp報文的第0字符表示類型,當類型值爲8時表示爲回顯示請求。
對於TCP和ICMP中經常使用的字節,如TCP中的標誌位,ICMP中的類型,這個些偏移量有時會忘記。不過tcpdump爲你提供更方便的用法,你不用記位這些數字,用字符就能夠代替了.
對於ICMP報文,類型字節能夠icmptype來表示它的偏稱量,上面的primitive可改成'icmp[icmptype] =8',若是8也記不住怎麼辦?tcpdump還爲該字節的值也提供了字符表示,如'icmp[icmptype] = icmp-echo'。
下面是tcpdump提供的字符偏移量:
icmptype:表示icmp報文中類弄字節的偏移量
icmpcode:表示icmp報文中編碼字節的偏移量
tcpflags:表示TCP報文中標誌位字節的偏移量
此外,還提供了不少值來對應上面的偏移字節:
ICMP中類型字節的值能夠是:
icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redi‐rect, icmp-echo, icmp-routeradvert, icmp-routersolicit,
icmp-timxceed, icmp-paramprob, icmp-tstamp, icmp-tstam‐preply, icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply.
TCP中標誌位字節的值能夠是:
tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-ack, tcp-urg.
經過上面的字符表示,咱們能夠寫出下面的primitive
'tcp[tcpflags] = tcp-syn' 匹配只有syn標誌設置爲1的 tcp報文
'tcp[tcpflags] & (tcp-syn |tcp-ack |tcp-fin) !=0' 匹配含有syn,或ack或fin標誌位的TCP報文
對於IP報文,沒有提供字符支持,若是想匹配更細的條件,直接使用數字指字偏移量就能夠了,不過要對IP報文有更深刻的瞭解才能夠。
學會寫primitive後,expression就是小菜一碟了,由一個或多個primitive組成,而且邏輯鏈接符組成便可:
tcpdump ‘host 192.168.240.91 && icmp[icmptype] = icmp-echo’
tcpdump ‘host 192.168.1.100 && vrrp’
tcpdump 'ether src 00:00:00:00:00:02 && ether[0] & 1 !=0'
讓你爲所欲爲地使用tcpdump,將不用再從複雜的輸出中去挑報文了!
如此,咱們能夠寫出更復雜的表達式來匹配報文,如IP或TCP中的報文id,IP是中的分段標誌,ICMP中類型和代碼等。