# 網絡基本功(十八):細說tcpdump的妙用(下)
**轉載請在文首保留原文出處:EMC中文支持論壇**[https://community.emc.com/go/chinese](https://community.emc.com/go/chinese) [](https://community.emc.com/servlet/JiveServlet/showImage/2-855799-104350/image001.gif)
## 更多信息
(承接上文)
**過濾:**
要有效地使用tcpdump,掌握過濾器非常必要的。過濾允許用戶指定想要抓取的數據流,從而用戶可以專注于感興趣的數據。此外,ethereal這樣的工具使用tcpdump過濾語法來抓取數據流。
如果用戶很清楚對何種數據流不感興趣,可以將這部分數據排除在外。如果用戶不確定需要什么數據,可以將源數據收集到文件之后在讀取時應用過濾器。實際應用中,需要經常在兩種方式之間轉換。
簡單的過濾器是加在命令行之后的關鍵字。但是,復雜的命令是由邏輯和關系運算符構成的。對于這樣的情況,通常最好用-F選項將過濾器存儲在文件中。例如,假設testfilter 是一個包含過濾主機205.153.63.30的文本文件,之后輸入tcpdump –Ftestfilter等效于輸入命令tcpdump host 205.153.63.30。通常,這一功能只在復雜過濾器時使用。但是,同一命令中命令行過濾器和文件過濾器不能混用。
**地址過濾:**
過濾器可以按照地址選擇數據流。例如,考慮如下命令:
```
bsd1# tcpdump host 205.153.63.30
```
該命令抓取所有來自以及發往IP地址205.153.63.30的主機。主機可以通過名稱或IP地址來選定。雖然指定的是IP地址,但抓取數據流并不限于IP數據流,實際上,過濾器也會抓到ARP數據流。限定僅抓取特定協議的數據流要求更復雜的過濾器。
有若干種方式可以指定和限制地址,下例是通過機器的以太網地址來選擇數據流:
```
bsd1# tcpdump ether host 0:10:5a:e3:37:c
```
數據流可進一步限制為單向,分別用src或dst指定數據流的來源或目的地。下例顯示了發送到主機205.153.63.30 的數據流:
bsd1# tcpdump dst 205.153.63.30
注意到本例中host被省略了。在某些例子中省略是沒問題的,但添加這些關鍵字通常更安全些。
廣播和多播數據相應可以使用broadcast和multicast。由于多播和廣播數據流在鏈路層和網絡層所指定的數據流是不同的,所以這兩種過濾器各有兩種形式。過濾器ether multicast抓取以太網多播地址的數據流,ip multicast抓取IP多播地址數據流。廣播數據流也是類似的使用方法。注意多播過濾器也會抓到廣播數據流。
除了抓取特定主機以外,還可以抓取特定網絡。例如,以下命令限制抓取來自或發往205.153.60.0的報文:
```
bsd1# tcpdump net 205.153.60
```
以下命令也可以做同樣的事情:
```
bsd1# tcpdump net 205.153.60.0 mask 255.255.255.0
```
而以下命令由于最后的.0就無法正常工作:
```
bsd1# tcpdump net 205.153.60.0
```
**協議及端口過濾:**
限制抓取指定協議如IP,Appletalk或TCP。還可以限制建立在這些協議之上的服務,如DNS或RIP。這類抓取可以通過三種方式進行:使用tcpdump關鍵字,通過協議關鍵字proto,或通過服務使用port關鍵字。
一些協議名能夠被tcpdump識別到因此可通過關鍵字來指定。以下命令限制抓取IP數據流:
```
bsd1# tcpdump ip
```
當然,IP數據流包括TCP數據流,UDP數據流,等等。
如果僅抓取TCP數據流,可以使用:
```
bsd1# tcpdump tcp
```
tcpdump可識別的關鍵字包括ip, igmp, tcp, udp, and icmp。
有很多傳輸層服務沒有可以識別的關鍵字。在這種情況下,可以使用關鍵字proto或ip proto加上/etc/protocols能夠找到的協議名或相應的協議編號。例如,以下兩種方式都會查找OSPF報文:
```
bsd1# tcpdump ip proto ospf
bsd1# tcpdump ip proto 89
```
內嵌的關鍵字可能會造成問題。下面的例子中,無法使用tcp關鍵字,或必須使用數字。例如,下面的例子是正常工作的:
```
bsd#1 tcpdump ip proto 6
```
另一方面,不能使用proto加上tcp:
```
bsd#1 tcpdump ip proto tcp
```
會產生問題。
對于更高層級的建立于底層協議之上的服務,必須使用關鍵字port。以下兩者會采集DNS數據流:
```
bsd#1 tcpdump port domain
bds#1 tcpdump port 53
```
第一條命令中,關鍵字domain能夠通過查找/etc/services來解析。在傳輸層協議有歧義的情況下,可以將端口限制為指定協議。考慮如下命令:
```
bsd#1 tcpdump udp port domain
```
這會抓取使用UDP的DNS名查找但不包括使用TCP的DNS zone傳輸數據。而之前的兩條命令會同時抓取這兩種數據。
**報文特征:**
過濾器也可以基于報文特征比如報文長度或特定字段的內容,過濾器必須包含關系運算符。要指定長度,使用關鍵字less或greater。如下例所示:
```
bsd1# tcpdump greater 200
```
該命令收集長度大于200字節的報文。
根據報文內容過濾更加復雜,因為用戶必須理解報文頭的結構。但是盡管如此,或者說正因如此,這一方式能夠使用戶最大限度的控制抓取的數據。
一般使用語法 proto [ expr : size ]。字段proto指定要查看的報文頭——ip則查看IP頭,tcp則查看TCP頭,以此類推。expr字段給出從報文頭索引0開始的位移。即:報文頭的第一個字節為0,第二字節為1,以此類推。size字段是可選的,指定需要使用的字節數,1,2或4。
```
bsd1# tcpdump "ip[9] = 6"
```
查看第十字節的IP頭,協議值為6。注意這里必須使用引號。撇號或引號都可以,但反引號將無法正常工作。
```
bsd1# tcpdump tcp
```
也是等效的,因為TCP協議編號為6。
這一方式常常作為掩碼來選擇特定比特位。值可以是十六進制。可通過語法&加上比特掩碼來指定。下例提取從以太網頭第一字節開始(即目的地址第一字節),提取低階比特位,并確保該位不為0:
```
bsd1# tcpdump 'ether[0] & 1 != 0'
```
該條件會選取廣播和多播報文。
以上兩個例子都有更好的方法來匹配報文。作為一個更實際的例子,考慮以下命令:
```
bsd1# tcpdump "tcp[13] & 0x03 != 0"
```
該過濾器跳過TCP頭的13個字節,提取flag字節。掩碼0x03選擇第一和第二比特位,即FIN和SYN位。如果其中一位不為0則報文被抓取。此命令會抓取TCP連接建立及關閉報文。
不要將邏輯運算符與關系運算符混淆。比如想tcp src port > 23這樣的表達式就無法正常工作。因為tcp src port表達式返回值為true或false,而不是一個數值,所以無法與數值進行比較。如果需要查找端口號大于23的所有TCP數據流,必須從報文頭提取端口字段,使用表達式“tcp[0:2] & 0xffff > 0x0017”。
- 介紹
- 網絡基本功(一):細說網絡傳輸
- 網絡基本功(二):細說交換機
- 網絡基本功(三):細說VLAN與Trunk
- 網絡基本功(四):細說路由(上)
- 網絡基本功(五):細說路由(下)
- 網絡基本功(六):鏈路聚合
- 網絡基本功(七):細說IP地址與子網
- 網絡基本功(八):細說TCP滑動窗口
- 網絡基本功(九):細說TCP重傳
- 網絡基本功(十):細說TCP確認機制
- 網絡基本功(十一):TCP窗口調整與流控
- 網絡基本功(十二):細說Linux網絡配置(上)
- 網絡基本功(十三):細說Linux網絡配置(下)
- 網絡基本功(十四):細說診斷工具ping
- 網絡基本功(十五):細說網絡性能監測與實例(上)
- 網絡基本功(十六):細說網絡性能監測與實例(下)
- 網絡基本功(十七):細說tcpdump的妙用(上)
- 網絡基本功(十八):細說tcpdump的妙用(下)
- 網絡基本功(十九):細說NAT原理與配置
- 網絡基本功(二十):細說ICMP和ARP
- 網絡基本功(二十一):細說HTTP(上)
- 網絡基本功(二十二):細說HTTP(下)
- 網絡基本功(二十三):Wireshark抓包實例診斷TCP連接問題
- 網絡基本功(二十四):Wireshark抓包實例分析TCP重傳
- 網絡基本功(二十五):Wireshark抓包實例分析TCP重復ACK與亂序
- 網絡基本功(二十六):Wireshark抓包實例分析TCP窗口及reset
- 網絡基本功(二十七):Wireshark抓包實例分析HTTP問題(上)
- 網絡基本功(二十八):Wireshark抓包實例分析HTTP問題(下)
- 網絡基本功(二十九):Wireshark抓包實例診斷數據庫常見問題
- 網絡基本功(三十):細說DNS(上)
- 網絡基本功(三十一):細說DHCP