tcpdump 介紹
tcpdump采用命令行方式對接口的數據包進行篩選抓取,其豐富特性表現在靈活的表達式上。
不帶任何選項的tcpdump,默認會抓取第一個網絡接口,且只有將tcpdump進程終止才會停止抓包。
例如:
tcpdump - dump traffic on a network
tcpdump是一個用於截取網絡分組,並輸出分組內容的工具。憑借強大的功能和靈活的截取策略,使其成為類UNIX系統下用於網絡分析和問題排查的首選工具
tcpdump 支持針對網絡層、協議、主機、網絡或端口的過濾,並提供and、or、not等邏輯語句來幫助你去掉無用的信息
tcpdump安裝
通常情況下,該工具默認是已經安裝好,可以使用 tcpdump --version命令查看是否安裝
- 已經安裝的話,可以查看版本信息
[root@localhost ~]# tcpdump --version
tcpdump version 4.9.2
libpcap version 1.5.3
OpenSSL 1.0.2k-fips 26 Jan 2017
- 沒有安裝,則會提示命令沒找到
[root@localhost ~]# tcpdump --version
-bash: tcpdump: command not found
yum安裝
yum install tcpdump
源碼安裝
# flex
yum -y install flex
# bison
yum -y install bison
wget http://www.tcpdump.org/release/libpcap-1.5.3.tar.gz
wget http://www.tcpdump.org/release/tcpdump-4.5.1.tar.gz
tar -zxvf libpcap-1.5.3.tar.gz
cd libpcap-1.5.3
./configure
sudo make install
cd .. /
tar -zxvf tcpdump-4.5.1.tar.gz
cd tcpdump-4.5.1
./configure
sudo make install
tcpdump選項
使用tcpdump --help則可以查看它的命令格式
[root@localhost ~]# tcpdump --help
tcpdump version 4.9.2
libpcap version 1.5.3
OpenSSL 1.0.2k-fips 26 Jan 2017
Usage: tcpdump [-aAbdDefhHIJKlLnNOpqStuUvxX#] [ -B size ] [ -c count ]
[ -C file_size ] [ -E algo:secret ] [ -F file ] [ -G seconds ]
[ -i interface ] [ -j tstamptype ] [ -M secret ] [ --number ]
[ -Q|-P in|out|inout ]
[ -r file ] [ -s snaplen ] [ --time-stamp-precision precision ]
[ --immediate-mode ] [ -T type ] [ --version ] [ -V file ]
[ -w file ] [ -W filecount ] [ -y datalinktype ] [ -z postrotate-command ]
[ -Z user ] [ expression ]
- 抓包選項:
-c:指定要抓取的包數量。
-i interface:指定tcpdump需要監聽的接口。默認會抓取第一個網絡接口
-n:對地址以數字方式顯式,否則顯式為主機名,也就是說-n選項不做主機名解析。
-nn:除了-n的作用外,還把端口顯示為數值,否則顯示端口服務名。
-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更詳細的輸出。
[root@localhost ~]# tcpdump -i ens192 tcp -nn -X -c 10
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens192, link-type EN10MB (Ethernet), capture size 262144 bytes
08:54:56.494187 IP 10.15.247.72.22 > 10.10162.243.51546: Flags [P.], seq 1398502444:1398502620, ack 3022776686, win 908, length 176
0x0000: 4510 00d8 22ed 4000 4006 68d5 0a0a f747 E...".@.@.h....G
0x0010: 0a09 a2f3 0016 c95a 535b 742c b42b e96e .......ZS[t,.+.n
0x0020: 5018 038c af18 0000 c9d9 0e04 1e69 3c46 P............i<F
0x0030: 288a bb0a 30fc de9f 2f9b 4dfc bab3 b36f (...0.../.M....o
0x0040: 21dc e594 7e26 7f65 4f1e e566 b323 252e !...~&.eO..f.#%.
0x0050: b940 6703 19d6 7434 e641 2e44 31a2 f74d .@g...t4.A.D1..M
0x0060: 70a8 219b d701 b578 7e85 7e05 481f d22a p.!....x~.~.H..*
0x0070: 8b8f 1b43 9165 c728 3b36 462f f9c3 e889 ...C.e.(;6F/....
0x0080: 0223 d841 05b2 447f 8438 d0b8 bbea 1195 .#.A..D..8......
0x0090: ff1c 85b5 93c1 8e10 9f21 a45c f52f ca95 .........!.\./..
0x00a0: 46c1 730a 9635 5df1 9018 c1f5 46d9 57cd F.s..5].....F.W.
0x00b0: 3074 16a6 bde6 1661 c86f 61ff 72c7 15a0 0t.....a.oa.r...
0x00c0: 62cc c8fc 6a30 353f e359 ce7c bbdb fecd b...j05?.Y.|....
0x00d0: 352a 2766 6740 ef78 5*'fg@.x
08:54:56.494693 IP 10.10.247.71.22 > 10.9.162.243.51546: Flags [P.], seq 176:784, ack 1, win 908, length 608
0x0000: 4510 0288 22ee 4000 4006 6724 0a0a f747 E...".@.@.g$...G
0x0010: 0a09 a2f3 0016 c95a 535b 74dc b42b e96e .......ZS[t..+.n
0x0020: 5018 038c b0c8 0000 89da aa2d 3d3b 491e P..........-=;I.
0x0030: 2c5e e4a1 d07f b6bb 79e1 e8f2 83f5 6e08 ,^......y.....n.
0x0040: cec3 8434 182d d17a 5c8d 121f e758 c982 ...4.-.z\....X..
0x0050: b6a9 4de1 a79a 18c0 c6ce 86ad 67a6 562c ..M.........g.V,
0x0060: c982 b6bb e61a 9c1f 3c24 5866 b579 f710 ........<$Xf.y..
0x0070: 4757 296b e2b3 51e1 6ecc 8a1f 6974 134e GW)k..Q.n...it.N
0x0080: 2c3c 26f7 d081 2588 6f4c a523 a9c9 ce3f ,<&...%.oL.#...?
0x0090: 4716 fa42 99d8 b91b c7b6 1bd2 fc08 7516 G..B..........u.
0x00a0: 87a8 8114 fd73 6243 4526 6b6c c825 2d44 .....sbCE&kl.%-D
0x00b0: c36e ee0f 7e0f a84d 62d4 03dc 5f1d 8a80 .n..~..Mb..._...
0x00c0: c094 8c18 cd29 a7d9 7674 beaa 3397 f0f0 .....)..vt..3...
0x00d0: dc6d e0b0 a56e a135 54a3 0d13 6cfb 8eb2 .m...n.5T...l...
0x00e0: 4669 70ab 16e7 cbab 5d43 e9ab dac6 780d Fip.....]C....x.
0x00f0: f68e 3b1b c7ed 1fb9 b043 e687 2f8e e09e ..;......C../...
0x0100: 6c8e 9cab 8680 cebc 56bd 760a 9c35 0cf7 l.......V.v..5..
0x0110: 20e1 47b1 8569 323f 6b4c 0220 6a0f de9e ..G..i2?kL..j...
...
- 其他功能性選項:
-D:列出可用於抓包的接口。將會列出接口的數值編號和接口名,它們都可以用於"-i"后。
-F:從文件中讀取抓包的表達式。若使用該選項,則命令行中給定的其他表達式都將失效。
-w:將抓包數據輸出到文件中而不是標准輸出。可以同時配合"-G
time"選項使得輸出文件每time秒就自動切換到另一個文件。可通過"-r"選項載入這些文件以進行分析和打印。
-r:從給定的數據包文件中讀取數據。使用"-"表示從標准輸入中讀取。
- 所以常用的選項也就這幾個:
tcpdump -D
tcpdump -c num -i int -nn -XX -vvv
tcpdump表達式
表達式用於篩選輸出哪些類型的數據包,如果沒有給定表達式,所有的數據包都將輸出,否則只輸出表達式為true的包。在表達式中出現的shell元字符建議使用單引號包圍。
tcpdump的表達式由一個或多個"單元"組成,每個單元一般包含ID的修飾符和一個ID(數字或名稱)。有三種修飾符:
- .type:指定ID的類型
可以給定的值有host, net, port, portrange,默認的type為host
例如:host 192.168.73.128 , net 128.3, port 20, portrange 6000-6008'
- dir:指定ID的方向
可以給定的值包括src/dst/src or dst/src and dst,默認為src or dst。
例如,"src foo"表示源主機為foo的數據包,"dst net 128.3"表示目標網絡為128.3的數據包,"src or dst port 22"表示源或目的端口為22的數據包。
- proto:通過給定協議限定匹配的數據包類型
常用的協議有tcp/udp/arp/ip/ether/icmp等,若未給定協議類型,則匹配所有可能的類型。
例如"tcp port 21","udp portrange 7000-7009"。
所以,一個基本的表達式單元格式為"proto dir type ID"
表達式單元之間可以使用操作符" and / && / or / || / not / ! "進行連接,從而組成復雜的條件表達式
如"host foo and not port ftp and not port ftp-data",這表示篩選的數據包要滿足"主機為foo且端口不是ftp(端口21)和ftp-data(端口20)的包",常用端口和名字的對應關系可在linux系統中的/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"意義相同,都表示包的協議為tcp且目的端口為ftp或ftp-data或domain(端口53)。
使用括號"()"可以改變表達式的優先級,但需要注意的是括號會被shell解釋,所以應該使用反斜線""轉義為"()",在需要的時候,還需要包圍在引號中。
tcpdump常用命令示例
注:tcpdump只能抓取流經本機的數據包
1. 默認啟動,不加任何參數
tcpdump
默認情況下,直接啟動tcpdump將監視第一個網絡接口(非lo口)上所有流通的數據包。這樣抓取的結果會非常多,滾動非常快。ctrl +c 退出
2 . 監視指定網絡接口的數據包
tcpdump -i ens33
3. 監視指定主機的數據包,例如所有進入或離開node1的數據包(可以寫主機名,也可以寫ip)
tcpdump -i ens33 host node1
4. 通過網卡ens33來監聽端口80發出去的host包到192.168.73.133的報文
tcpdump -i ens33 port 80 and dst host "192.168.73.133"
5. 打印node1與任何其他主機之間通信的IP數據包,但不包括與node4之間的數據包
tcpdump -i ens33 host node1 and not node4
6. 截獲主機node1 發送的所有數據
tcpdump -i ens33 src host node1
7. 監視任意網卡目標是192.168.73.*的80端口的數據包
tcpdump any port 80 and dst host "192.168.73.*"
8. 監視指定主機和端口的數據包
tcpdump -i ens33 port 8080 and host node1
9. 監視指定網絡的數據包,如本機與192.168網段通信的數據包,"-c 10"表示只抓取10個包
tcpdump -i ens33 -c 10 net 192.168
10. 打印所有通過網關snup的ftp數據包
tcpdump 'gateway snup and (port ftp or ftp-data)'
注意,表達式被單引號括起來了,這可以防止shell對其中的括號進行錯誤解析
11. 抓取ping包
tcpdump -c 5 -nn -i ens33
==指定主機抓ping包==
tcpdump -c 5 -nn -i ens33 icmp and src 192.168.73.133
12. 抓取到本機22端口包
tcpdump -c 10 -nn -i ens33 tcp dst port 22
13. 解析包數據
[root@elk-master ~]# tcpdump -c 2 -q -XX -vvv -nn -i ens33 tcp dst port 22
tcpdump: listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes
10:29:05.724783 IP (tos 0x0, ttl 64, id 2031, offset 0, flags [DF], proto TCP (6), length 40)
192.168.73.1.61453 > 192.168.73.133.22: tcp 0
0x0000: 000c 290b 9534 0050 56c0 0008 0800 4500 ..)..4.PV.....E.
0x0010: 0028 07ef 4000 4006 1f0a c0a8 4901 c0a8 .(..@.@.....I...
0x0020: 4985 f00d 0016 f675 9adb 7cab 7aa8 5010 I......u..|.z.P.
0x0030: 1007 132d 0000 0000 0000 0000 ...-........
10:29:05.766565 IP (tos 0x0, ttl 64, id 2032, offset 0, flags [DF], proto TCP (6), length 40)
192.168.73.1.61453 > 192.168.73.133.22: tcp 0
0x0000: 000c 290b 9534 0050 56c0 0008 0800 4500 ..)..4.PV.....E.
0x0010: 0028 07f0 4000 4006 1f09 c0a8 4901 c0a8 .(..@.@.....I...
0x0020: 4985 f00d 0016 f675 9adb 7cab 7b48 5010 I......u..|.{HP.
0x0030: 1006 128e 0000 0000 0000 0000 ............
2 packets captured
2 packets received by filter
0 packets dropped by kernel
14. 指定目錄保存抓到的ens33網卡上的22端口包數據
tcpdump -i ens33 tcp port 22 -w /tmp/22.pcap
注:保存目錄為tmp下,名字為22.pcap,后綴名是固定格式,名字可以自定義,抓到的包可以使用wireshark工具打開進行分析
15. 后台滾動抓包
有的時候因為問題不是立馬復現,需要后台進行抓包保存,但是如果都抓到一個包會導致數據量很大,不好分析,因此需要滾動保存包數據,以下命令就會后台執行抓包命令,並且按照時間對每個包進行命名,當不需要抓包的時候可以ps -ef|grep tcpdump 找到進程,kill掉即可
nohup tcpdump -i ens33 port 22 -s0 -G 3600 -Z root -w ssh22_%Y_%m%d_%H%M_%S.pcap &
16. 后台指定包的數量,然后滾動抓包,執行完指定數量自動結束
網卡,端口,和W參數后的包數量,還有包命名,可以根據需求自己修改,其他參數可以不用修改
nohup tcpdump -i ens33 port 22 -s0 -G 3600 -W 1 -Z root -w ssh22_%Y_%m%d_%H%M_%S.pcap &