本文原創(chuàng)地址:博客園駿馬金龍https://www.cnblogs.com/f-ck-need-u/p/7064286.html
tcpdump采用命令行方式對(duì)接口的數(shù)據(jù)包進(jìn)行篩選抓取,其豐富特性表現(xiàn)在靈活的表達(dá)式上。
不帶任何選項(xiàng)的tcpdump,默認(rèn)會(huì)抓取第一個(gè)網(wǎng)絡(luò)接口,且只有將tcpdump進(jìn)程終止才會(huì)停止抓包。
例如:
shell> tcpdump -nn -i eth0 icmp
下面是詳細(xì)的tcpdump用法。
1.1 tcpdump選項(xiàng)
它的命令格式為:
tcpdump [ -DenNqvX ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ]
[ -s snaplen ] [ -w file ] [ expression ]
抓包選項(xiàng):
-c:指定要抓取的包數(shù)量。注意,是最終要獲取這么多個(gè)包。例如,指定"-c 10"將獲取10個(gè)包,但可能已經(jīng)處理了100個(gè)包,只不過(guò)只有10個(gè)包是滿足條件的包。
-i interface:指定tcpdump需要監(jiān)聽(tīng)的接口。若未指定該選項(xiàng),將從系統(tǒng)接口列表中搜尋編號(hào)最小的已配置好的接口(不包括loopback接口,要抓取loopback接口使用tcpdump -i lo),
:一旦找到第一個(gè)符合條件的接口,搜尋馬上結(jié)束??梢允褂?any'關(guān)鍵字表示所有網(wǎng)絡(luò)接口。
-n:對(duì)地址以數(shù)字方式顯式,否則顯式為主機(jī)名,也就是說(shuō)-n選項(xiàng)不做主機(jī)名解析。
-nn:除了-n的作用外,還把端口顯示為數(shù)值,否則顯示端口服務(wù)名。
-N:不打印出host的域名部分。例如tcpdump將會(huì)打印'nic'而不是'nic.ddn.mil'。
-P:指定要抓取的包是流入還是流出的包??梢越o定的值為"in"、"out"和"inout",默認(rèn)為"inout"。
-s len:設(shè)置tcpdump的數(shù)據(jù)包抓取長(zhǎng)度為len,如果不設(shè)置默認(rèn)將會(huì)是65535字節(jié)。對(duì)于要抓取的數(shù)據(jù)包較大時(shí),長(zhǎng)度設(shè)置不夠可能會(huì)產(chǎn)生包截?cái)啵舫霈F(xiàn)包截?cái)啵?br />
:輸出行中會(huì)出現(xiàn)"[|proto]"的標(biāo)志(proto實(shí)際會(huì)顯示為協(xié)議名)。但是抓取len越長(zhǎng),包的處理時(shí)間越長(zhǎng),并且會(huì)減少tcpdump可緩存的數(shù)據(jù)包的數(shù)量,
:從而會(huì)導(dǎo)致數(shù)據(jù)包的丟失,所以在能抓取我們想要的包的前提下,抓取長(zhǎng)度越小越好。
輸出選項(xiàng):
-e:輸出的每行中都將包括數(shù)據(jù)鏈路層頭部信息,例如源MAC和目標(biāo)MAC。
-q:快速打印輸出。即打印很少的協(xié)議相關(guān)信息,從而輸出行都比較簡(jiǎn)短。
-X:輸出包的頭部數(shù)據(jù),會(huì)以16進(jìn)制和ASCII兩種方式同時(shí)輸出。
-XX:輸出包的頭部數(shù)據(jù),會(huì)以16進(jìn)制和ASCII兩種方式同時(shí)輸出,更詳細(xì)。
-v:當(dāng)分析和打印的時(shí)候,產(chǎn)生詳細(xì)的輸出。
-vv:產(chǎn)生比-v更詳細(xì)的輸出。
-vvv:產(chǎn)生比-vv更詳細(xì)的輸出。
其他功能性選項(xiàng):
-D:列出可用于抓包的接口。將會(huì)列出接口的數(shù)值編號(hào)和接口名,它們都可以用于"-i"后。
-F:從文件中讀取抓包的表達(dá)式。若使用該選項(xiàng),則命令行中給定的其他表達(dá)式都將失效。
-w:將抓包數(shù)據(jù)輸出到文件中而不是標(biāo)準(zhǔn)輸出。可以同時(shí)配合"-G time"選項(xiàng)使得輸出文件每time秒就自動(dòng)切換到另一個(gè)文件。可通過(guò)"-r"選項(xiàng)載入這些文件以進(jìn)行分析和打印。
-r:從給定的數(shù)據(jù)包文件中讀取數(shù)據(jù)。使用"-"表示從標(biāo)準(zhǔn)輸入中讀取。
所以常用的選項(xiàng)也就這幾個(gè):
tcpdump -D
tcpdump -c num -i int -nn -XX -vvv
1.2 tcpdump表達(dá)式
表達(dá)式用于篩選輸出哪些類(lèi)型的數(shù)據(jù)包,如果沒(méi)有給定表達(dá)式,所有的數(shù)據(jù)包都將輸出,否則只輸出表達(dá)式為true的包。在表達(dá)式中出現(xiàn)的shell元字符建議使用單引號(hào)包圍。
tcpdump的表達(dá)式由一個(gè)或多個(gè)"單元"組成,每個(gè)單元一般包含ID的修飾符和一個(gè)ID(數(shù)字或名稱)。有三種修飾符:
(1).type:指定ID的類(lèi)型。
可以給定的值有host/net/port/portrange。例如"host foo","net 128.3","port 20","portrange 6000-6008"。默認(rèn)的type為host。
(2).dir:指定ID的方向。
可以給定的值包括src/dst/src or dst/src and dst,默認(rèn)為src or dst。例如,"src foo"表示源主機(jī)為foo的數(shù)據(jù)包,"dst net 128.3"表示目標(biāo)網(wǎng)絡(luò)為128.3的數(shù)據(jù)包,"src or dst port 22"表示源或目的端口為22的數(shù)據(jù)包。
(3).proto:通過(guò)給定協(xié)議限定匹配的數(shù)據(jù)包類(lèi)型。
常用的協(xié)議有tcp/udp/arp/ip/ether/icmp等,若未給定協(xié)議類(lèi)型,則匹配所有可能的類(lèi)型。例如"tcp port 21","udp portrange 7000-7009"。
所以,一個(gè)基本的表達(dá)式單元格式為"proto dir type ID"
除了使用修飾符和ID組成的表達(dá)式單元,還有關(guān)鍵字表達(dá)式單元:gateway,broadcast,less,greater以及算術(shù)表達(dá)式。
表達(dá)式單元之間可以使用操作符" and / / or / || / not / ! "進(jìn)行連接,從而組成復(fù)雜的條件表達(dá)式。如"host foo and not port ftp and not port ftp-data",這表示篩選的數(shù)據(jù)包要滿足"主機(jī)為foo且端口不是ftp(端口21)和ftp-data(端口20)的包",常用端口和名字的對(duì)應(yīng)關(guān)系可在linux系統(tǒng)中的/etc/service文件中找到。
另外,同樣的修飾符可省略,如"tcp dst port ftp or ftp-data or domain"與"tcp dst port ftp or tcp dst port ftp-data or tcp dst port domain"意義相同,都表示包的協(xié)議為tcp且目的端口為ftp或ftp-data或domain(端口53)。
使用括號(hào)"()"可以改變表達(dá)式的優(yōu)先級(jí),但需要注意的是括號(hào)會(huì)被shell解釋?zhuān)詰?yīng)該使用反斜線"\&;轉(zhuǎn)義為"\(\)",在需要的時(shí)候,還需要包圍在引號(hào)中。
1.3 tcpdump示例
注意,tcpdump只能抓取流經(jīng)本機(jī)的數(shù)據(jù)包。
(1).默認(rèn)啟動(dòng)
tcpdump
默認(rèn)情況下,直接啟動(dòng)tcpdump將監(jiān)視第一個(gè)網(wǎng)絡(luò)接口(非lo口)上所有流通的數(shù)據(jù)包。這樣抓取的結(jié)果會(huì)非常多,滾動(dòng)非???。
(2).監(jiān)視指定網(wǎng)絡(luò)接口的數(shù)據(jù)包
tcpdump -i eth1
如果不指定網(wǎng)卡,默認(rèn)tcpdump只會(huì)監(jiān)視第一個(gè)網(wǎng)絡(luò)接口,如eth0。
(3).監(jiān)視指定主機(jī)的數(shù)據(jù)包,例如所有進(jìn)入或離開(kāi)longshuai的數(shù)據(jù)包
tcpdump host longshuai
(4).打印helios-->hot或helios-->ace之間通信的數(shù)據(jù)包
tcpdump host helios and \( hot or ace \)
(5).打印ace與任何其他主機(jī)之間通信的IP數(shù)據(jù)包,但不包括與helios之間的數(shù)據(jù)包
tcpdump ip host ace and not helios
(6).截獲主機(jī)hostname發(fā)送的所有數(shù)據(jù)
tcpdump src host hostname
(7).監(jiān)視所有發(fā)送到主機(jī)hostname的數(shù)據(jù)包
tcpdump dst host hostname
(8).監(jiān)視指定主機(jī)和端口的數(shù)據(jù)包
tcpdump tcp port 22 and host hostname
(9).對(duì)本機(jī)的udp 123端口進(jìn)行監(jiān)視(123為ntp的服務(wù)端口)
tcpdump udp port 123
(10).監(jiān)視指定網(wǎng)絡(luò)的數(shù)據(jù)包,如本機(jī)與192.168網(wǎng)段通信的數(shù)據(jù)包,"-c 10"表示只抓取10個(gè)包
tcpdump -c 10 net 192.168
(11).打印所有通過(guò)網(wǎng)關(guān)snup的ftp數(shù)據(jù)包(注意,表達(dá)式被單引號(hào)括起來(lái)了,這可以防止shell對(duì)其中的括號(hào)進(jìn)行錯(cuò)誤解析)
shell> tcpdump 'gateway snup and (port ftp or ftp-data)'
(12).抓取ping包
[root@server2 ~]# tcpdump -c 5 -nn -i eth0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:11:23.273638 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16422, seq 10, length 64
12:11:23.273666 IP 192.168.100.62 > 192.168.100.70: ICMP echo reply, id 16422, seq 10, length 64
12:11:24.356915 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16422, seq 11, length 64
12:11:24.356936 IP 192.168.100.62 > 192.168.100.70: ICMP echo reply, id 16422, seq 11, length 64
12:11:25.440887 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16422, seq 12, length 64
5 packets captured
6 packets received by filter
0 packets dropped by kernel
如果明確要抓取主機(jī)為192.168.100.70對(duì)本機(jī)的ping,則使用and操作符。
[root@server2 ~]# tcpdump -c 5 -nn -i eth0 icmp and src 192.168.100.62
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:09:29.957132 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16166, seq 1, length 64
12:09:31.041035 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16166, seq 2, length 64
12:09:32.124562 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16166, seq 3, length 64
12:09:33.208514 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16166, seq 4, length 64
12:09:34.292222 IP 192.168.100.70 > 192.168.100.62: ICMP echo request, id 16166, seq 5, length 64
5 packets captured
5 packets received by filter
0 packets dropped by kernel
注意不能直接寫(xiě)icmp src 192.168.100.70,因?yàn)閕cmp協(xié)議不支持直接應(yīng)用host這個(gè)type。
(13).抓取到本機(jī)22端口包
[root@server2 ~]# tcpdump -c 10 -nn -i eth0 tcp dst port 22
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:06:57.574293 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 535528834, win 2053, length 0
12:06:57.629125 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 193, win 2052, length 0
12:06:57.684688 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 385, win 2051, length 0
12:06:57.738977 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 577, win 2050, length 0
12:06:57.794305 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 769, win 2050, length 0
12:06:57.848720 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 961, win 2049, length 0
12:06:57.904057 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 1153, win 2048, length 0
12:06:57.958477 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 1345, win 2047, length 0
12:06:58.014338 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 1537, win 2053, length 0
12:06:58.069361 IP 192.168.100.1.5788 > 192.168.100.62.22: Flags [.], ack 1729, win 2052, length 0
10 packets captured
10 packets received by filter
0 packets dropped by kernel
(14).解析包數(shù)據(jù)
[root@server2 ~]# tcpdump -c 2 -q -XX -vvv -nn -i eth0 tcp dst port 22
tcpdump: listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
12:15:54.788812 IP (tos 0x0, ttl 64, id 19303, offset 0, flags [DF], proto TCP (6), length 40)
192.168.100.1.5788 > 192.168.100.62.22: tcp 0
0x0000: 000c 2908 9234 0050 56c0 0008 0800 4500 ..)..4.PV.....E.
0x0010: 0028 4b67 4000 4006 a5d8 c0a8 6401 c0a8 .(Kg@.@.....d...
0x0020: 643e 169c 0016 2426 5fd6 1fec 2b62 5010 d>....$_...+bP.
0x0030: 0803 7844 0000 0000 0000 0000 ..xD........
12:15:54.842641 IP (tos 0x0, ttl 64, id 19304, offset 0, flags [DF], proto TCP (6), length 40)
192.168.100.1.5788 > 192.168.100.62.22: tcp 0
0x0000: 000c 2908 9234 0050 56c0 0008 0800 4500 ..)..4.PV.....E.
0x0010: 0028 4b68 4000 4006 a5d7 c0a8 6401 c0a8 .(Kh@.@.....d...
0x0020: 643e 169c 0016 2426 5fd6 1fec 2d62 5010 d>....$_...-bP.
0x0030: 0801 7646 0000 0000 0000 0000 ..vF........
2 packets captured
2 packets received by filter
0 packets dropped by kernel
總的來(lái)說(shuō),tcpdump對(duì)基本的數(shù)據(jù)包抓取方法還是較簡(jiǎn)單的。只要掌握有限的幾個(gè)選項(xiàng)(-nn -XX -vvv -i -c -q),再組合表達(dá)式即可。
姊妹篇:網(wǎng)絡(luò)掃描工具nmap