一、抓取回環網口的包:tcpdump -i lophp
二、防止包截斷:tcpdump -s0linux
三、以數字顯示主機及端口:tcpdump -nios
第一種是關於類型的關鍵字,主要包括host,net,port, 例如 host 210.27.48.2,指明 210.27.48.2是一臺主機,net 202.0.0.0 指明 202.0.0.0是一個網絡地址,port 23 指明端口號是23。若是沒有指定類型,缺省的類型是host.安全
第二種是肯定傳輸方向的關鍵字,主要包括src , dst ,dst or src, dst and src ,這些關鍵字指明瞭傳輸的方向。舉例說明,src 210.27.48.2 ,指明ip包中源地址是210.27.48.2 , dst net 202.0.0.0 指明目的網絡地址是202.0.0.0 。若是沒有指明方向關鍵字,則缺省是src or dst關鍵字。bash
第三種是協議的關鍵字,主要包括fddi,ip,arp,rarp,tcp,udp等類型。Fddi指明是在FDDI(分佈式光纖數據接口網絡)上的特定 的網絡協議,實際上它是"ether"的別名,fddi和ether具備相似的源地址和目的地址,因此能夠將fddi協議包看成ether的包進行處理和 分析。其餘的幾個關鍵字就是指明瞭監聽的包的協議內容。若是沒有指定任何協議,則tcpdump將會監聽全部協議的信息包。網絡
除了這三種類型的關鍵字以外,其餘重要的關鍵字以下:gateway, broadcast,less,greater,還有三種邏輯運算,取非運算是 'not ' '! ', 與運算是'and','&&;或運算 是'or' ,'||';這些關鍵字能夠組合起來構成強大的組合條件來知足人們的須要,下面舉幾個例子來講明。less
普通狀況下,直接啓動tcpdump將監視第一個網絡界面上全部流過的數據包。
# tcpdump
tcpdump: listening on fxp0
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 00dom
使用-i參數指定tcpdump監聽的網絡界面,這在計算機具備多個網絡界面時很是有用,
使用-c參數指定要監聽的數據包數量,
使用-w參數指定將監聽到的數據包寫入文件中保存
A想要截獲全部210.27.48.1 的主機收到的和發出的全部的數據包:
#tcpdump host 210.27.48.1ssh
B想要截獲主機210.27.48.1 和主機210.27.48.2 或210.27.48.3的通訊,使用命令:(在命令行中適用 括號時,必定要
#tcpdump host 210.27.48.1 and / (210.27.48.2 or 210.27.48.3 /)socket
C若是想要獲取主機210.27.48.1除了和主機210.27.48.2以外全部主機通訊的ip包,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
D若是想要獲取主機210.27.48.1接收或發出的telnet包,使用以下命令:
#tcpdump tcp port 23 host 210.27.48.1
E 對本機的udp 123 端口進行監視 123 爲ntp的服務端口
# tcpdump udp port 123
F 系統將只對名爲hostname的主機的通訊數據包進行監視。主機名能夠是本地主機,也能夠是網絡上的任何一臺計算機。下面的命令能夠讀取主機hostname發送的全部數據:
#tcpdump -i eth0 src host hostname
G 下面的命令能夠監視全部送到主機hostname的數據包:
#tcpdump -i eth0 dst host hostname
H 咱們還能夠監視經過指定網關的數據包:
#tcpdump -i eth0 gateway Gatewayname
I 若是你還想監視編址到指定端口的TCP或UDP數據包,那麼執行如下命令:
#tcpdump -i eth0 host hostname and port 80
J 若是想要獲取主機210.27.48.1除了和主機210.27.48.2以外全部主機通訊的ip包
,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
K 想要截獲主機210.27.48.1 和主機210.27.48.2 或210.27.48.3的通訊,使用命令
:(在命令行中適用 括號時,必定要
#tcpdump host 210.27.48.1 and / (210.27.48.2 or 210.27.48.3 /)
L 若是想要獲取主機210.27.48.1除了和主機210.27.48.2以外全部主機通訊的ip包,使用命令:
#tcpdump ip host 210.27.48.1 and ! 210.27.48.2
M 若是想要獲取主機210.27.48.1接收或發出的telnet包,使用以下命令:
#tcpdump tcp port 23 host 210.27.48.1
第三種是協議的關鍵字,主要包括fddi,ip ,arp,rarp,tcp,udp等類型
除了這三種類型的關鍵字以外,其餘重要的關鍵字以下:gateway, broadcast,less,
greater,還有三種邏輯運算,取非運算是 'not ' '! ', 與運算是'and','&&';或運算 是'o
r' ,'||';
第二種是肯定傳輸方向的關鍵字,主要包括src , dst ,dst or src, dst and src ,
若是咱們只須要列出送到80端口的數據包,用dst port;若是咱們只但願看到返回80端口的數據包,用src port。
#tcpdump –i eth0 host hostname and dst port 80 目的端口是80
或者
#tcpdump –i eth0 host hostname and src port 80 源端口是80 通常是提供http的服務的主機
若是條件不少的話 要在條件以前加and 或 or 或 not
#tcpdump -i eth0 host ! 211.161.223.70 and ! 211.161.223.71 and dst port 80
若是在ethernet 使用混雜模式 系統的日誌將會記錄
May 7 20:03:46 localhost kernel: eth0: Promiscuous mode enabled.
May 7 20:03:46 localhost kernel: device eth0 entered promiscuous mode
May 7 20:03:57 localhost kernel: device eth0 left promiscuous mode
tcpdump對截獲的數據並無進行完全解碼,數據包內的大部份內容是使用十六進制的形式直接打印輸出的。顯然這不利於分析網絡故障,一般的解決辦法是先使用帶-w參數的tcpdump 截獲數據並保存到文件中,而後再使用其餘程序進行解碼分析。固然也應該定義過濾規則,以免捕獲的數據包填滿整個硬盤。
# tcpdump -i eth1 src host 211.167.237.199
00:02:03.096713 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010208:2010352(144) ack 33377 win 8576
00:02:03.096951 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010352:2010496(144) ack 33377 win 8576
00:02:03.100928 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010496:2010640(144) ack 33377 win 8576
00:02:03.101165 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010640:2010784(144) ack 33377 win 8576
00:02:03.102554 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 2010784:2010928(144) ack 33425 win 8576
代表在00:02:03點的時候,211.167.237.199經過ssh源端口鏈接到221.216.165.189的1467端口
#tcpdump -i eth1 src host 211.167.237.199 and dst port 1467
00:09:27.603075 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 180400:180544(144) ack 2833 win 8576
00:09:27.605631 IP 211.167.237.199.ssh > 221.216.165.189.1467: P 180544:180688(144) ack 2881 win 8576
截獲全部由eth0進入、源地址(src)爲192.168.0.5的主機(host),而且(and)目標(dst)端口(port)爲80的數據包
觀看網卡傳送、接收數據包的狀態
$ netstat -i
Kernel Interface table
Iface MTU Met RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 0 14639 0 0 0 5705 119 0 0 BMRU
Iface: 網卡
RX-OK RX-ERR RX-DRP RX-OVR : 網卡正確接收數據包的數量以及發生錯誤、流失、碰撞的總數
TX-OK TX-ERR TX-DRP TX-OVR : 網卡正確發送數據包的數量以及發生錯誤、流失、碰撞的總數
[root@linux ~]# tcpdump [-nn] [-i 介面] [-w 儲存檔名] [-c 次數] [-Ae]
[-qX] [-r 檔案] [所欲擷取的資料內容] 參數: -nn:直接以 IP 及 port number 顯示,而非主機名與服務名稱 -i :後面接要『監聽』的網路介面,例如 eth0, lo, ppp0 等等的介面; -w :若是你要將監聽所得的封包資料儲存下來,用這個參數就對了!後面接檔名 -c :監聽的封包數,若是沒有這個參數, tcpdump 會持續不斷的監聽, 直到使用者輸入 [ctrl]-c 為止。 -A :封包的內容以 ASCII 顯示,一般用來捉取 WWW 的網頁封包資料。 -e :使用資料連接層 (OSI 第二層) 的 MAC 封包資料來顯示; -q :僅列出較為簡短的封包資訊,每一行的內容比較精簡 -X :能夠列出十六進位 (hex) 以及 ASCII 的封包內容,對於監聽封包內容頗有用 -r :從後面接的檔案將封包資料讀出來。那個『檔案』是已經存在的檔案, 並且這個『檔案』是由 -w 所製做出來的。 所欲擷取的資料內容:我們能夠專門針對某些通訊協定或者是 IP 來源進行封包擷取, 那就能夠簡化輸出的結果,並取得最有用的資訊。常見的表示方法有: 'host foo', 'host 127.0.0.1' :針對單部主機來進行封包擷取 'net 192.168' :針對某個網域來進行封包的擷取; 'src host 127.0.0.1' 'dst net 192.168':同時加上來源(src)或目標(dst)限制 'tcp port 21':還能夠針對通訊協定偵測,如 tcp, udp, arp, ether 等 還能夠利用 and 與 or 來進行封包資料的整合顯示呢! 範例一:以 IP 與 port number 捉下 eth0 這個網路卡上的封包,持續 3 秒 [root@linux ~]# tcpdump -i eth0 -nn tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes 01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 116:232(116) ack 1 win 9648 01:33:40.41 IP 192.168.1.100.22 > 192.168.1.11.1190: P 232:364(132) ack 1 win 9648 <==按下 [ctrl]-c 之後結束 6680 packets captured <==捉下來的封包數量 14250 packets received by filter <==由過濾所得的總封包數量 7512 packets dropped by kernel <==被核心所丟棄的封包 |
[root@linux ~]# tcpdump -i eth0 -nn port 21
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 96 bytes
01:54:37.96 IP 192.168.1.11.1240 > 192.168.1.100.21: . ack 1 win 65535
01:54:37.96 IP 192.168.1.100.21 > 192.168.1.11.1240: P 1:21(20) ack 1 win 5840
01:54:38.12 IP 192.168.1.11.1240 > 192.168.1.100.21: . ack 21 win 65515
01:54:42.79 IP 192.168.1.11.1240 > 192.168.1.100.21: P 1:17(16) ack 21 win 65515
01:54:42.79 IP 192.168.1.100.21 > 192.168.1.11.1240: . ack 17 win 5840
01:54:42.79 IP 192.168.1.100.21 > 192.168.1.11.1240: P 21:55(34) ack 17 win 5840
|
[root@linux ~]# tcpdump -i lo -nn
1 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode 2 listening on lo, link-type EN10MB (Ethernet), capture size 96 bytes 3 11:02:54.253777 IP 127.0.0.1.32936 > 127.0.0.1.22: S 933696132:933696132(0) win 32767 <mss 16396,sackOK,timestamp 236681316 0,nop,wscale 2> 4 11:02:54.253831 IP 127.0.0.1.22 > 127.0.0.1.32936: S 920046702:920046702(0) ack 933696133 win 32767 <mss 16396,sackOK,timestamp 236681316 236681316,nop, wscale 2> 5 11:02:54.253871 IP 127.0.0.1.32936 > 127.0.0.1.22: . ack 1 win 8192 <nop, nop,timestamp 236681316 236681316> 6 11:02:54.272124 IP 127.0.0.1.22 > 127.0.0.1.32936: P 1:23(22) ack 1 win 8192 <nop,nop,timestamp 236681334 236681316> 7 11:02:54.272375 IP 127.0.0.1.32936 > 127.0.0.1.22: . ack 23 win 8192 <nop, nop,timestamp 236681334 236681334> |
[root@linux ~]# tcpdump -i lo -nn -X 'port 21'
0x0000: 4500 0048 2a28 4000 4006 1286 7f00 0001 E..H*(@.@.......
0x0010: 7f00 0001 0015 80ab 8355 2149 835c d825 .........U!I./.%
0x0020: 8018 2000 fe3c 0000 0101 080a 0e2e 0b67 .....<.........g
0x0030: 0e2e 0b61 3232 3020 2876 7346 5450 6420 ...a220.(vsFTPd. 0x0040: 322e 302e 3129 0d0a 2.0.1).. 0x0000: 4510 0041 d34b 4000 4006 6959 7f00 0001 E..A.K@.@.iY.... 0x0010: 7f00 0001 80ab 0015 835c d825 8355 215d ........./.%.U!] 0x0020: 8018 2000 fe35 0000 0101 080a 0e2e 1b37 .....5.........7 0x0030: 0e2e 0b67 5553 4552 2064 6d74 7361 690d ...gUSER.dmtsai. 0x0040: 0a . 0x0000: 4510 004a d34f 4000 4006 694c 7f00 0001 E..J.O@.@.iL.... 0x0010: 7f00 0001 80ab 0015 835c d832 8355 217f ........./.2.U!. 0x0020: 8018 2000 fe3e 0000 0101 080a 0e2e 3227 .....>........2' 0x0030: 0e2e 1b38 5041 5353 206d 7970 6173 7377 ...8PASS.mypassw 0x0040: 6f72 6469 7379 6f75 0d0a ordisyou.. |
例題:如何使用 tcpdump 監聽 (1)來自 eth0 介面卡且 (2)通訊協定為 port 22 ,(3)目標來源為 192.168.1.100 的封包資料? 答:
|
[root@linux ~]# nc [IP|host] [port]
[root@linux ~]# nc -l -p [port] 參數: -l :做為監聽之用,亦即開啟一個 port 來監聽用戶的連線; -p :開啟的這個 port number 範例一:連接本地端的 port 25 查閱相關訊息 [root@linux ~]# nc localhost 25 localhost.localdomain [127.0.0.1] 25 (smtp) open 220 pc.dm.tsai ESMTP Postfix ehlo localhost 250-pc.dm.tsai 250-PIPELINING 250-SIZE 40000000 250-ETRN quit 221 Bye |
範例二:啟動一個 port 來監聽使用者的連線要求
[root@linux ~]# nc -l -p 20000 # 啟動一個 port 20000 在主機上,若是此時使用 netstat -tlnp # 就能夠看到系統上多出來一個 port 20000 在傾聽使用者的連線喔! |
[root@linux ~]# nc localhost 20000
<==這裡能夠開始輸入字串了! |