命令格式:
tcpdump [ -DenNqvX ] [ -c count ] [ -F file ] [ -i interface ] [ -r file ]
[ -s snaplen ] [ -w file ] [ expression ]
抓包選項:
-c:指定要抓取的包數量。注意,是最終要獲取這麼多個包。例如,指定"-c 10"將獲取10個包,但可能已經處理了100個包,只不過只有10個包是滿足條件的包。
-i interface:指定tcpdump需要監聽的介面。若未指定該選項,將從系統介面列表中搜尋編號最小的已配置好的介面(不包括loopback介面,要抓取loopback介面使用tcpdump -i lo),
:一旦找到第一個符合條件的介面,搜尋馬上結束。可以使用'any'關鍵字表示所有網路介面。
-n:對地址以數字方式顯式,否則顯式為主機名,也就是說-n選項不做主機名解析。
-nn:除了-n的作用外,還把埠顯示為數值,否則顯示埠服務名。
-N:不列印出host的域名部分。例如tcpdump將會列印'nic'而不是'nic.ddn.mil'。
-P:指定要抓取的包是流入還是流出的包。可以給定的值為"in"、"out"和"inout",預設為"inout"。
-s len:設定tcpdump的資料包抓取長度為len,如果不設定預設將會是65535位元組。對於要抓取的資料包較大時,長度設定不夠可能會產生包截斷,若出現包截斷,
:輸出行中會出現"[|proto]"的標誌(proto實際會顯示為協議名)。但是抓取len越長,包的處理時間越長,並且會減少tcpdump可快取的資料包的數量,
:從而會導致資料包的丟失,所以在能抓取我們想要的包的前提下,抓取長度越小越好。
輸出選項:
-e:輸出的每行中都將包括資料鏈路層頭部資訊,例如源MAC和目標MAC。
-q:快速列印輸出。即列印很少的協議相關資訊,從而輸出行都比較簡短。
-X:輸出包的頭部資料,會以16進位制和ASCII兩種方式同時輸出。
-XX:輸出包的頭部資料,會以16進位制和ASCII兩種方式同時輸出,更詳細。
-v:當分析和列印的時候,產生詳細的輸出。
-vv:產生比-v更詳細的輸出。
-vvv:產生比-vv更詳細的輸出。
其他功能性選項:
-D:列出可用於抓包的介面。將會列出介面的數值編號和介面名,它們都可以用於"-i"後。
-F:從檔案中讀取抓包的表示式。若使用該選項,則命令列中給定的其他表示式都將失效。
-w:將抓包資料輸出到檔案中而不是標準輸出。可以同時配合"-G time"選項使得輸出檔案每time秒就自動切換到另一個檔案。可通過"-r"選項載入這些檔案以進行分析和列印。
-r:從給定的資料包檔案中讀取資料。使用"-"表示從標準輸入中讀取。
所以常用的選項也就這幾個:
tcpdump -D
tcpdump -c num -i int -nn -XX -vvv
2).監視指定網路介面的資料包
tcpdump -i eth1
如果不指定網路卡,預設tcpdump只會監視第一個網路介面,如eth0。
(3).監視指定主機的資料包,例如所有進入或離開longshuai的資料包
tcpdump host longshuai
(4).列印helios<-->hot或helios<-->ace之間通訊的資料包
tcpdump host helios and \( hot or ace \)
(5).列印ace與任何其他主機之間通訊的IP資料包,但不包括與helios之間的資料包
tcpdump ip host ace and not helios
(6).截獲主機hostname傳送的所有資料
tcpdump src host hostname
(7).監視所有傳送到主機hostname的資料包
tcpdump dst host hostname
(8).監視指定主機和埠的資料包
tcpdump tcp port 22 and host hostname
(9).對本機的udp 123埠進行監視(123為ntp的服務埠)
tcpdump udp port 123
(10).監視指定網路的資料包,如本機與192.168網段通訊的資料包,"-c 10"表示只抓取10個包
tcpdump -c 10 net 192.168
(11).列印所有通過閘道器snup的ftp資料包(注意,表示式被單引號括起來了,這可以防止shell對其中的括號進行錯誤解析)
shell> tcpdump 'gateway snup and (port ftp or ftp-data)'
//檢視本機與mysql的操作命令 注意 -i any表示監聽所有網路介面,我們也根據自身情況選擇網路介面
#tcpdump -i any -w - dst port 3306 |strings
//檢視本機58895上與mysql的命令 注意 -i any 表示監聽所有網路介面,我們需要根據自身情況選擇網路介面
#tcpdump -i any -w - dst port 3306 and src port 58895 |strings
同理,也可以使用上面的命令,檢視kafka,etcd,redis,mc等的命令情況,只要是明文協議都可以
tcpdump命令格式
#tcpdump option filter
option 舉例 -n, -i any 等
filter 是過濾包的條件,舉例: tcp, portrange 1-1000, src port 58895, host www.itshouce.com.cn,
filter可以進行組合 比如:
dst port 3306 and src port 58895
portrange 1-1000 or src port 58895
not dst port 3306
option filter
舉例: tcpdump -i any -n portrange 1-3306 or portrange 10000-58895
tcpdump option
//在en2這個網路介面監聽,如果不指定,那麼會搜尋所有的網路介面,在數字最小的網路埠上監聽
//也就是tcpdump -D 上左邊數字最小的
#tcpdump -i en2
//linux 2.2以上支援 -i any
#tcpdump -i any 可以監聽所有埠
-n 不要把ip轉換為機器名字
#tcpdump -n
// -w - // -w為把內容write到某個地方, -表示標準輸出 也就是輸出到標準輸出中
#tcpdump -w - |strings 這是一個超級有用的命令,把包的資料,用字元展示出來
// -w a.cap 把抓包結果寫入a.cap中
// -C 1 如果a.cap 超過1M 大小,則新開一個檔案, -C fileSize , 單位是MB
#tcpdump -C 1 -w a.cap
#ll
-rw-r--r-- 1 root wheel 1000092 Apr 21 21:05 a.cap //超過1MB了
-rw-r--r-- 1 root wheel 849388 Apr 21 21:05 a.cap1
//-r 從某個檔案讀取
#tcpdump -n -r a.cap
#tcpdump -X 以十六進位制以及ASCII的形式列印資料內容
#tcpdump -x 除了列印出header外,還列印packet裡面的資料(十六進位制的形式)
#tcpdump -xx 以十六進位制的形式列印header, data內容
// -A 把每一個packet都用以ASCII的形式列印出來
#tcpdump -A host www.itshouce.com.cn
// -c 3 表示收到3個packet就退出
#tcpdump -A -c 3 host www.itshouce.com.cn
...
3 packets captured
65 packets received by filter
0 packets dropped by kernel
//看目前機器上有哪些網路介面
#tcpdump -D
1.en0
2.awdl0
3.bridge0
4.utun0
5.en1
6.en2
7.p2p0
8.lo0
//-e 把連線層的頭列印出來
#tcpdump -e
21:15:27.665159 *:*:60:dc:d0:d9 (oui Unknown) > *:*:07:10:81:36 (oui Unknown), ethertype IPv4 (0x0800), length 79: zj-db0355dembp.lan.51318 > hiwifi.lan.domain: 20430+ A? www.itshouce.com.cn. (37)
#tcpdump -j timestamp type 可以修改輸出的時間格式,貌似centos6.5不支援
#tcpdump -J 顯示支援的時間格式
//-l 把stdout bufferd住,當你既想在螢幕上看結果,又想把結果輸出到檔案中時,比較有用
#tcpdump -l
//tee是一個命令,在螢幕上顯示dump內容,並把內容輸出到dump.log中
#tcpdump -l |tee dump.log
#tcpdump -l > dump.log &tail -f dump.log
//-q 就是quiect output, 儘量少的列印一些資訊
#tcpdump -q
//-S 列印真實的,絕對的tcp seq no
#tcpdump -S
21:33:06.569478 IP *dembp.lan.54864 > ***: Flags [P.], seq 3980049501:3980049596, ack 3916671858, win 4091, options [nop,nop,TS val 1201572125 ecr 1490447193], length 95
//預設抓取包長度是65535,
#tcpdump //capture sieze 65535
listening on em1, link-type EN10MB (Ethernet), capture size 65535 bytes
//我們設定為256 該引數目的:減少抓包檔案的大小
#tcpdump -s 256
listening on pktap, link-type PKTAP (Packet Tap), capture size 256 bytes
#tcpdump -t 不要打時間戳
#tcpudmp -tt 打出timstamp,從1970-1-1 以來的秒數,以及微秒數
#tcpdump -v 列印出詳細結果 如ttl
#tcpdump -vv 列印出更加詳細的結果 如window, checksum等
tcpdump過濾項
下面所有測試中都有 -i any的選項,表示抓取所有網路介面上的包,只是為了讓測試方便
//抓取arp協議的包,然後host為192.168.199.* 測試時需要在另一個session,做一個ifconfig指令
//arp可以換為tcp,udp等
#tcpudmp -i any -n arp host 192.168.199
22:39:58.991043 ARP, Request who-has 192.168.199.125 tell 192.168.199.1, length 28
22:39:58.991059 ARP, Reply 192.168.199.125 is-at a4:5e:60:dc:d0:d9, length 28
//抓取訪問destination 80埠的包,然後我們做一個curl www.baidu.com的操作
#tcpdump -i any -n dst port 80
22:53:06.041382 IP 192.168.199.125.63161 > 119.75.219.45.80: Flags [F.], seq 0, ack 1, win 65535, length 0
//抓取源上埠是80的包
#tcpdump -i any -n src port 80
22:57:48.343422 IP 112.80.248.73.80 > 192.168.199.125.63275: Flags [.], seq 38478:39918, ack 78, win 193, length 1440
//抓取源或者目標埠都是80的包
#tcpdump -i any -n port 80
22:58:51.165333 IP 112.80.248.74.80 > 192.168.199.125.63298: Flags [F.], seq 100439, ack 79, win 193, length 0
22:58:51.165349 IP 192.168.199.125.63298 > 112.80.248.74.80: Flags [R], seq 703147494, win 0, length 0
//表示抓取destination prot 在1到80之間的埠的資料
#tcpdump -i any -n dst portrange 1-80 在另外的面做curl www.baidu.com 以及 telnet 192.168.21.1
23:00:13.550006 IP 192.168.199.125.63310 > *.*.248.73.80: Flags [.], ack 71649, win 8012, length 0
23:01:27.363723 IP 192.168.199.125.63327 > 192.168.21.1.23: Flags [S], seq 621213649, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 1240986522 ecr 0,sackOK,eol], length 0
//抓取源的埠是20-80的包
#tcpdump -i any -n src portrange 20-80
//抓取埠是20-80的包,不考慮源
#tcpdump -i any -n portrange 20-80
//抓取destination為www.baidu.com的包
#tcpdump -i any dst www.baidu.com 然後ping www.baidu.com ,以及 在瀏覽器中訪問www.baidu.com
22:22:17.445872 IP *0355dembp.lan > 112.80.248.73: ICMP echo request, id 26478, seq 0, length 64
2:22:50.108236 IP *0355dembp.lan.62371 > 112.80.248.74.https: Flags [S], seq 2884215363, win 65535, options [mss 1460,nop,wscale 5,nop,nop,TS val 1238683151 ecr 0,sackOK,eol], length 0
//抓取destination為192.168.1.2的包
#tcpdump -i any dst 192.168.1.2
22:26:46.808706 IP zj-db0355dembp.lan > 192.168.1.2: ICMP echo request, id 31854, seq 0, length 64
//抓取destination為192.168.1.[0-255]的包
#tcpdump -i any dst 192.168.1 可以指定範圍
#ifconfig 可以看出我本機的ip是192.168.199.125
//抓取source為192.168.*.*的包, 使用-n 則只是為了顯示ip,而不是主機名,
#tcpdump -i any -n src 192.168
22:30:50.490355 IP 192.168.199.125.61086 > *.*.*.*.341: Flags [.], ack 56, win 8185, options [nop,nop,TS val 1239157627 ecr 1580310986], length 0
//抓取192.168的包(不管是source還是destination )
#tcpdump -i any -n host 192.168
22:38:07.580567 IP *.*.*.*.34186 > 192.168.199.125.61086: Flags [P.], seq 787907565:787907668, ack 871423065, win 126, options [nop,nop,TS val 1580748123 ecr 1239593243], length 103
22:38:08.453788 IP 192.168.199.125.61086 > *.*.*.*.34186: Flags [P.], seq 9481:10147, ack 5769, win 8179, options [nop,nop,TS val 1239594178 ecr 1580748994], length 666
//抓取包長度小於800的包
#tcpudmp -i any -n less 800
21:09:17.687673 IP 192.168.199.1.50150 > *.*.*.*.1900: UDP, length 385
//抓取包長度大於800的包
#tcpdump -i any -n greater 800
21:13:21.801351 IP 192.168.199.125.64826 > *.*.*.*.80: Flags [P.], seq 2155:3267, ack 44930, win 8192, length 1112
//只抓取tcp包
#tcpdump -i any -n tcp
1:21:18.777815 IP 192.168.199.125.50249 > *.*.*.*.443: Flags [.], ack 75, win 4093, options [nop,nop,TS val 1269008649 ecr 44997038], length 0
//只抓取udp包
#tcpdump -i any -n udp
21:22:48.434449 IP 192.168.199.1.50150 > *.*.*.*.1900: UDP, length 385
//只抓取icmp的包,internet控制包
#tcpdump -i any -n icmp
21:25:42.550374 IP 192.168.199.1 > 192.168.199.125: ICMP *.*.*.* unreachable - need to frag (mtu 1480), length 556