[前語]最近要用到數據包分析軟件(tcpdump),從網上搜索發現資料重多,但讓我發現大部分的內容都比較亂,讓人不敢往下讀,今天我也將我整理的資料,拿給網上的朋友分享下,可能我整理得也比較亂,或者分析得有誤,請大家指出,謝謝!~ [內容]
SYNOPSIS( 概要)
tcpdump [ -ADeflnNqtvx ] [ -c count ]
[ -i interface ] [ -r file ] [ -s
snaplen ]
[ -T type ] [ -w file ] [ expression ]
選項 (OPTIONS)
-A
Print each packet (minus its link level header) in ASCII. Handy for capturing web pages
[應用] 在網關服務器中輸入:tcpdump
–A src host 192.168.x.y
[ 摘取 ]17:10:56.934040 IP 192.168.x.y.icp >
by2msg1231711.mixer.edge.messenger.live.com.msnp: . ack 4165501895 win 64719
[ 分析 ] 以ASCII 格式打印除鏈路層的頭部信息的包,這個選項更有益與web 頁面的抓取. 上面是我對源192.168.x.y 包的抓取,一看就知道,它現在連接到MSN 。
[ 應用 ] tcpdump -e src host
192.168.x.y
[ 摘取 ]17:19:57.718466 00:14:22:d2:9e:d0 (oui Unknown) >
00:c0:9f :40:29:6a (oui Unknown), ethertype IPv4 (0x0800),
length 60: 192.168.x.y.acp-conduit > 65.54.167.59.http: R
2561727994:2561727994(0) ack 425901151 win 0
[ 分析 ] 這是針對鏈路層包分析,看看是不是你想要的呢?
[ 應用 ] tcpdump -e -c 2 src host
192.168.x.y
listening on eth0, link-type EN10MB (Ethernet), capture
size 96 bytes
13:54:15.963937 IP 192.168.x.y.ridgeway2 >
218.93.16.107.http: F 1728282061:1728282061(0) ack 2139349129 win 65004
13:54:15.965416 IP 192.168.x.y.gwen-sonya >
218.93.16.107.http: S 3089588305:3089588305(0) win 65535 <mss
1460,nop,nop,sackOK>
7 packets received by filter
0 packets dropped by kernel
[ 分析 ] 看到沒有,我只要抓取兩個匹配包,就OK 了。
-D Print the
list of the network interfaces available on the
system and on which tcpdump can
capture
packets. For each network interface, a
number and an interface name,
possibly followed by a
text description of the interface, is printed.
The interface name or the number
can be supplied to the -i flag to specify an interface on which to capture
[ 應用 ] tcpdump -D
4.any (Pseudo-device that captures on all interfaces)
[ 分析 ] 打印可以被tcpdump 抓取的接口名稱。可以提供給-i 參數,EX:tcpdump –I eth1
-i
監聽interface 接口. 如果不指定接口, tcpdump 在系統的接口清單中, 尋找號碼最小, 已經配置好的接口(loopback 除外). 選中的時候會中斷連接.
[ 應用 ] tcpdump –i eth0 ip src
192.168.x.y
14:01:15.700262 IP 218.83.12.11.32785 >
ns-pd.online.sh.cn.domain: 29083+ PTR?
20.152.83.218.in-addr.arpa. (44)
[ 分析 ] 抓取eth0 接口的數據包
-f
用數字形式顯示 ' 外部的' 互聯網地址, 而不是字符形式 ( 如:tcpdump
-f -i eth0 -c 4 src host 192.168.x.y)
[ 摘取 ] 14:03:25.655826 IP 207.46.124.244.msnp > 218.83.12.11.kpop: P
259:847(588) ack 1 win 64158
[ 分析 ] 與前一個應用對比,你能發現在摘取中的互聯網地址都會以IP 顯示,而不在有域名啦。。。
-l
行緩衝標準輸出. 可用於捕捉數據的同時查看數據. 例如,
[ 應用 ] tcpdump -i eth1 -f -l|tee tcpdump.log
tcpdump: verbose output suppressed, use -v or -vv for
full protocol decode
listening on eth1, link-type EN10MB (Ethernet), capture
size 96 bytes
14:11:58.058394 802.1d config 81b6.00:1e:14:9f :f7:00.801a root 8000.00:04:80:78:c0:dd pathcost 19 age 1
max 20 hello 2 fdelay 15
[ 分析 ] 結合系統命令,使抓取分析數據更加靈活與強大,我愛這個功能…
-n
不把地址轉換成名字 ( 如主機地址, 端口號等)
[ 應用 ] tcpdump -i eth0 src host 192.168.x.y -n
[ 摘取 ]14:17:30.686094 IP 192.168.x.y.10778 >
121.62.99.137.14808: UDP, length 1050
[ 分析 ] 抓取的數據包不會將數字地址轉換成名字
[ 應用 ] tcpdump -i eth0 src host 192.168.x.y -n
[ 摘取 ]14:16:45.824513 IP 192.168.x.y.alias >
by1msg3145607.msnp: . ack 1894015094 win 64827
[ 分析 ] 抓取的數據包中不會將域名的部分顯示,看by1msg3145607.msnp, 典型是省略了很長一段的域名部分(msn 的)
-q
快速輸出. 顯示較少的協議信息, 輸出行將短一點點.
[ 應用 ] tcpdump -i eth0 src host 192.168.x.y -q
[ 摘取 ]14:21:48.669851 IP 192.168.x.y.tgp >
by1msg4082316.phx.gbl.msnp: tcp 0
[ 分析 ] 打印較短的協議,用與快速分析。
-w
把原始報文存進file, 不分析也不顯示. 它們可以以後用 -r 選項顯示. 如果 file 是 “-'', 就寫到標準輸出.( 如:tcpdump -e src host 192.168.x.y -w /tmp/tcpdump.log)
-r
從file 中讀入數據報 ( 文件是用 -w 選項創建的). 如果 file 是 “-'', 就讀標準輸入. ( 如:tcpdump
-e src host 192.168.x.y -r /tmp/tcpdump.log)
[ 分析 ] 以上-w,-r ,的作用是相反的,一個是將抓取的包寫入到指定文件,一個是根據上次寫入的文件來讀取分析。沒有上次的-w 操作,-r 是無法使用的,除非用”-” ,不過如果你用more,cat 是無法讀通這個文件的,不像用”|” ,藉助tee 可以爲以後方便
-t
禁止顯示時戳標誌.
[ 應用 ] tcpdump -i eth0 src host 192.168.x.y -t
[ 摘要 ]
IP 192.168.x.y.sonardata > 218.93.16.107.http: . ack
1225435221 win 65535
IP 192.168.x.y.sonardata > 218.93.16.107.http: P
0:907(907) ack 1 win 65535
IP 192.168.x.y.sonardata > 218.93.16.107.http: . ack
208 win 65328
[ 應用 ] tcpdump -i eth0 src host 192.168.x.y -tt
1247207645.823506 IP 192.168.x.y.isis >
61.172.205.8.msnp: . ack 53 win 64309
1247207645.840496 IP 192.168.x.y.isis >
61.172.205.8.msnp: P 70:74(4) ack 123 win 64239
1247207645.881594 IP 192.168.x.y.isis >
61.172.205.8.msnp: P 74:122(48) ack 123 win 64239
[ 分析 ]-t 與-tt 對比,一看就很清楚了,是時間顯示控制和時間格式控制
-v
( 稍微多一點) 繁瑣的輸出. 例如, 顯示IP 數據報中的生存週期和服務類型.
-vv
更繁瑣的輸出. 例如, 顯示NFS 應答報文的附加域.
-x
以十六進制數形式顯示每一個報文 ( 去掉鏈路層報頭後) . 可以顯示較小的完整報文
[ 分析 ]-v,-vv,-x 通過上面的敘述,我想大家試一下,一定就會很明白了,至與那個選項更適合大家,那就是看應用了,我想這些選項也夠大家用了吧!~ 反正夠我用了,呵呵!~
expression ( 表達式)
表達式是一個正則表達式,tcpdump利用它作爲過濾報文的條件,如果一個報文滿足表達式的條件,則這個報文將會被捕獲。如果沒有給出任何條件,則網絡上所有的信息包將會被截獲。
expression 由一個或多個原語
(primitive) 組成. 原語通常由一個標識(id, 名稱或數字) 和 標識 前面的一個或多個修飾字(qualifier) 組成. 修飾字有三種不同的類型:
(1)type
類型修飾字指出標識名稱或標識數字代表什麼類型的東西. 可以使用的類型有host, net 和 port. 例如,
`host foo', `net 128.3', `port 20'. 如果不指定類型修飾字, 就使用
缺省的 host
(2)Direction
方向修飾字指出相對於標識的傳輸方向 ( 數據是傳入還是傳出標識).
可以使用的方向有 src, dst, src or dst 和
src and dst. 例如, `src foo', `dst net 128.3', `src or
dst port ftp-data'. 如果不指定方向修飾字, 就使用缺省的src or dst . 對於 `null' 鏈路層 ( 就是說 象 slip 之類的 點到點 協議), 用 inbound 和outbound 修飾字指定所需的傳輸方向.
(3)proto
協議修飾字要求匹配指定的協議. 可以使用的協議有:
ether, fddi, ip, arp, rarp, decnet, lat, sca, moprc, mopdl, tcp 和 udp. 例如,ether src foo', `arp net 128.3',
`tcp port 21'. 如果不指定協議修飾字, 就使用所有符合類型的協議. 例如, `src foo' 指
`(ip or arp or rarp) src foo', `net bar' 指 `(ip or arp
or rarp) net bar', `port 53' 指 `(tcp or udp) port 53'.
[`fddi' 實際上 是 `ether' 的 別名; 分析器把它們視爲 `` 用在指定網絡接口上的數據鏈路層.'' FDDI 報頭包含類似於以太協議的源目地址, 而且通常包含 類似於以太協議的報文類型, 因此你可以分析 FDDI 域, 就象分析以太協議一樣.
FDDI 報頭也包含其他域, 但是你不能在過濾器表達式裏顯式描述.]
作爲上述的補充, 有一些特殊的 ` 原語' 關鍵字, 它們不同於上面的模式:
gateway, broadcast, less, greater 和數學表達式. 這些在後面有敘述.
更復雜的過濾器表達式 可以通過 and, or 和 not 連接原語來組建. 例如, `host foo and not port ftp and not
port ftp-data'. 爲了少敲點鍵, 可以忽略 相同的修飾子. 例如, `tcp dst port ftp or ftp-data or
domain' 實際上 就是 `tcp dst port ftp or tcp dst port
ftp-data or tcp dst port domain'.
允許的 原語 有:
dst host host
如果報文中IP 的目的地址域是 host, 則邏輯爲真. host 既可以是地址, 也可以是主機名.
src host host
如果報文中IP 的源地址域 是 host, 則 邏輯
爲 真.
host host
如果報文中 IP 的 源地址域或者目的地址域是host, 則邏輯爲真. 上面所有的 host 表達式 都可以加上 ip, arp, 或 rarp 關鍵字做前綴, 就象:
ip host host
如果host 是擁有多個IP 地址的主機名, 它的每個地址都會被查驗.
dst net net
如果報文的IP 目的地址屬於網絡號net, 則邏輯爲真.
src net net
如果 報文的 IP 源地址 屬於 網絡號 net, 則
邏輯爲真.
net net
如果報文的IP 源地址或目的地址屬於網絡號 net, 則邏輯爲真.
net net mask netmask ( 如net
192.168.1.0 mask 255.255.255.128 )
如果IP 地址匹配指定網絡掩碼(netmask) 的net, 則 邏輯爲真. 本原語可以用src
或 dst 修飾.
net net/len
如果IP 地址匹配指定網絡掩碼的net, 則邏輯爲真, 掩碼的有效位寬爲len. 本原語可以用src 或dst 修飾.
dst port port
如果報文是ip/tcp 或ip/udp, 並且目的端口是port, 則邏輯爲真. port 是一個數字, 也可以是 /etc/services 中 說明過的名字( 參看tcp(4P) 和udp(4P)).
如果使用名字, 則檢查端口號和協議. 如果使用數字, 或者有二義的名字, 則只檢查端口號
( 例如, dst port 513 將顯示 tcp/login
的數據 和 udp/who 的數據, 而 port domain 將顯示 tcp/domain 和 udp/domain 的數據).
src port port
如果 報文 的 源端口號 是 port, 則 邏輯 爲 真.
port port
如果報文的源端口或目的端口是port, 則邏輯爲真. 上述的任意一個端口表達式都可以用關鍵字tcp 或udp 做前綴, 就象:
tcp src port port
它只匹配源端口是port 的 TCP 報文.
less length
如果 報文 的 長度 小於等於 length, 則 邏輯 爲 真. 它等同於:
len <= length.
greater length
如果報文的長度大於等於 length, 則邏輯爲真. 它等同於:
len >= length.
原語可以用下述方法結合使用:
圓括弧括起來的原語和操作符( 園括弧在Shell 中有特定含義, 所以必須轉義).
取反操作 (`!' or `not').
連結操作 (`&&' or `and').
或操作 (`||' or `or').
取反操作有最高優先級. 或操作和連結操作有相同的優先級, 運算時從左到右結合. 注意連結操作需要顯式的and 算符, 而不是並列放置.
如果給出標識符, 但沒給修飾符, 那麼暗指最近使用的修飾符. 例如,
not host vs and ace 作爲 not host vs and host ace 的簡寫形式, 不應該和 not ( host vs or ace ) 混淆.
tcpdump 的輸出結果介紹 (OUTPUT
FORMAT)
下面我們介紹幾種典型的 tcpdump 命令的輸出信息
ice 是一臺裝有 linux 的主機 , 她的 MAC 地址是 00 :90 :27 :58 :AF :1A
H219 是一臺裝有 SOLARIC 的 SUN 工作站 , 它的 MAC 地址是 08 :00 :20 :79 :5B :46 ; 上一條
21:50:12.847509 eth0 > 08:00:20:79:5b:46 00:90:27:58:af:1a ip 60: h219.33357 > ice.
telnet 0:0(0) ack 22535 win 8760 (DF)
分析 :21 :50 :12 是顯示的時間 ,
847509 是 ID 號 , eth0 >表示從網絡接口設備發送數據包( eth0 < 表示從網絡接口 eth0 接受該數據包 ), 08:00:20:79:5b:46是主機H219的MAC地址,
它表明是從源地址H219發來的數據包.
00:90:27:58:af:1a 是主機ICE的MAC地址,表示該數據包的目的地址是ICE
. ip 是表明該數據包是IP數據包,60 是數據包的長度, h219.33357 > ice.
telnet 表明該數據包是從主機H219的33357端口發往主機ICE的TELNET(23)端口.
ack 22535表明對序列號是222535的包進行響應. win 8760表明發送窗口的大小是8760.
22:32:42.802509 eth0 > arp who-has h10 tell ice
(0:90:27:58:af:1a )
22:32:42.802902 eth0 < arp reply h10 is-at
0:90:27:12:10:66 (0:90:27:58:af:1a )
分析: 22:32:42是時間戳, 802509是ID號,
eth0 >表明從主機發出該數據包, arp表明是
ARP請求包, who-has h10 tell ice表明是主機ICE請求主機h10的MAC地址。
0:90:27:5
src > dst: flags data-seqno ack window urgent options
src > dst: 表明從源地址到目的地址 , flags 是 TCP 包中的標誌信息 , 如:S 是 SYN 標誌 , F (F
IN), P (PUSH) , R (RST) "." (沒有標記); data-seqno是數據包中的數據的順序號, ack是
下次期望的順序號, window是接收緩存的窗口大小,
urgent表明數據包中是否有緊急指針.
H10.port1 > ice.port2: udp lenth
UDP十分簡單,上面的輸出行表明從主機h10的port1端口發出的一個UDP數據包到主機
ICE的port2端口,類型是UDP, 包的長度是lenth
如果想要獲取主機61.151.247.124接收或發出的telnet包,使用如下命令
tcpdump tcp port 23 and host
61.151.247.124
tcpdump -n tcp port 23 and src host 218.83.152.2
tcpdump -n -w /etc/tcpdump.log tcp port 23 and src host
218.83.152.2
tcpdump -r /etc/tcpdump.log
tcpdump -i eth0 -w tcpdump.log
顯示 所有 進出 sundown 的 報文:
tcpdump host sundown
顯示helios 和hot|ace 之間的報文傳送:
tcpdump host helios and \( hot or ace \)
顯示ace 和除了helios 以外的所有主機的IP 報文:
tcpdump ip host ace and not helios