==
【系列文章】
《神探tcpdump第一招》-linux指令五分鐘系列之三十五
《神探tcpdump第二招》-linux指令五分鐘系列之三十六
《神探tcpdump第三招》-linux指令五分鐘系列之三十七
《神探tcpdump第四招》-linux指令五分鐘系列之三十八
前四招都是圍繞tcpdump的選項來介紹的,從這招起,我們會把目光轉向更加常用的“過濾表達式”内容。
通過這幾招的學習,你将具備“心無旁骛,潛心專注”的武功。
【師傅領進門】
可以給tcpdump傳送“過濾表達式”來起到網絡包過濾的作用,而且可以支援傳入單個或多個過濾表達式,從這一點來說tcpdump還是很大肚能容的。
當你傳入的過濾表達式含有shell通配符時,别忘使用單引号把表達式括起來,以防shell自作主張的把含有通配符的表達式先進行了解釋和通配。
如果你希望自己研究“過濾表達式”,沒問題,我會告訴你如何“進門”,方法就是:
你會發現,過濾表達式大體可以分成三種過濾條件,“類型”、“方向”和“協定”,這三種條件的搭配組合就構成了我們的過濾表達式。
【我隻想抓UDP的包,不想被TCP的包打擾】
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<code># tcpdump -i eth0 -c 10 'udp'</code>
<code>tcpdump: verbose output suppressed, use -</code><code>v</code> <code>or -vv</code><code>for</code> <code>full protocol decode</code>
<code>listening on eth0, link-</code><code>type</code> <code>EN10MB (Ethernet), capture size 65535 bytes</code>
<code>11:25:20.801612 IP 116.255.245.48.54808 > 229.111.112.12.csd-mgmt-port: UDP, length 4</code>
<code>11:25:20.802120 IP 116.255.245.206.54313 > ns.sc.cninfo.net.domain: 5256+ PTR? 12.112.111.229.</code><code>in</code><code>-addr.arpa. (45)</code>
<code>11:25:21.145126 IP ns.sc.cninfo.net.domain > 116.255.245.206.54313: 5256 NXDomain 0</code><code>/0/0</code> <code>(45)</code>
<code>11:25:21.145315 IP 116.255.245.206.46658 > ns.sc.cninfo.net.domain: 15551+ PTR? 48.245.255.116.</code><code>in</code><code>-addr.arpa. (45)</code>
<code>11:25:21.153966 IP 116.255.245.43.62220 > 229.111.112.12.csd-mgmt-port: UDP, length 4</code>
<code>11:25:21.180135 IP 116.255.245.61.hsrp > all-routers.mcast.net.hsrp: HSRPv0-hello 20: state=active group=21 addr=116.255.245.33</code>
<code>11:25:21.231151 IP ns.sc.cninfo.net.domain > 116.255.245.206.46658: 15551 NXDomain 0</code><code>/0/0</code> <code>(45)</code>
<code>11:25:21.231430 IP 116.255.245.206.46158 > ns.sc.cninfo.net.domain: 31924+ PTR? 69.2.139.61.</code><code>in</code><code>-addr.arpa. (42)</code>
<code>11:25:21.277087 IP ns.sc.cninfo.net.domain > 116.255.245.206.46158: 31924 1</code><code>/0/0</code> <code>PTR ns.sc.cninfo.net. (72)</code>
<code>11:25:21.277824 IP 116.255.245.206.42656 > ns.sc.cninfo.net.domain: 806+ PTR? 206.245.255.116.</code><code>in</code><code>-addr.arpa. (46)</code>
<code>10 packets captured</code>
<code>20 packets received by filter</code>
<code>0 packets dropped by kernel</code>
舉這個例子,是為了說明tcpdump具有根據網絡包的協定來進行過濾的能力,我們還可以把udp改為ether、ip、ip6、arp、tcp、rarp等。
或許你會提問“為啥這些協定裡沒有應用層協定呢?”,其實理由很簡單,應用層協定非基礎類網絡協定,經常會新增或淘汰,tcpdump不會深入到應用層部分去智能解析。是以,你現在看到的tcpdump支援的protocol都是應用層以下的。
【我想專門檢視這個源機器和那個目的機器之間的網絡包,不想被其他無關的機器打擾】
這個其實很簡單,也很直覺,隻要設定src(source)和dst(destination)就好了,而且友善的是,tcpdump還支援使用and和or來進行搭配組合呢!
如果沒有設定的話,預設是src or dst。
<code># tcpdump -i eth0 'dst 8.8.8.8'</code>
<code>13:21:23.281978 IP 116.255.245.206 > google-public-dns-a.google.com: ICMP</code><code>echo</code> <code>request,</code><code>id</code> <code>23081,</code><code>seq</code> <code>1, length 64</code>
<code>13:21:24.286663 IP 116.255.245.206 > google-public-dns-a.google.com: ICMP</code><code>echo</code> <code>request,</code><code>id</code> <code>23081,</code><code>seq</code> <code>2, length 64</code>
<code>13:21:25.288612 IP 116.255.245.206 > google-public-dns-a.google.com: ICMP</code><code>echo</code> <code>request,</code><code>id</code> <code>23081,</code><code>seq</code> <code>3, length 64</code>
<code>^C</code>
<code>3 packets captured</code>
<code>5 packets received by filter</code>
【我隻想查目标機器端口是53或80的網絡包,其他端口的我不關注】
<code># tcpdump -i eth0 -c 3 'dst port 53 or dst port 80'</code>
<code>13:29:04.530130 IP 114.255.192.96.29832 > 116.255.245.206.http: Flags [S],</code><code>seq</code> <code>3169042560, win 5840, options [mss 1460,sackOK,TS val 2949111416 ecr 0], length 0</code>
<code>13:29:04.530660 IP 116.255.245.206.43211 > ns.sc.cninfo.net.domain: 40188+ PTR? 206.245.255.116.</code><code>in</code><code>-addr.arpa. (46)</code>
<code>13:29:04.548589 IP 114.255.192.96.29832 > 116.255.245.206.http: Flags [.], ack 3709396068, win 5840, options [nop,nop,TS val 2949111475 ecr 1601243970], length 0</code>
<code>10 packets received by filter</code>
我們可以設定過濾類型,上面例子中我們使用了port這個類型,就是來指定端口。當然,tcpdump還支援如下的類型:
1 host:指定主機名或IP位址,例如’host roclinux.cn’或’host 202.112.18.34′
2 net :指定網絡段,例如’arp net 128.3’或’dst net 128.3′
3 portrange:指定端口區域,例如’src or dst portrange 6000-6008′
如果我們沒有設定過濾類型,那麼預設是host。
謝謝!