什么是tcpdump
? ? 在Linux中輸入命令man tcpdump給出的定義如下所示:
tcpdump - 轉(zhuǎn)儲網(wǎng)絡上的數(shù)據(jù)流
是不是感覺很懵?我們用通俗、形象、學術(shù)的表達方式來全方位描述tcpdump:
- 通俗的來說,tcpdump是一個抓包工具,用于抓取網(wǎng)絡中傳輸?shù)臄?shù)據(jù)包
- 形象的來說,tcpdump如同國家海關(guān),凡是入境和出境的貨物,海關(guān)都要抽樣檢查,看看里面具體是什么貨物
- 學術(shù)的來說,tcpdump是一種Sniffer(嗅探器),利用以太網(wǎng)的特性,通過將網(wǎng)絡設(shè)備置于混雜模式來獲取傳輸在網(wǎng)絡中的信息包
在使用tcpdump需要了解以下的知識點:
1、了解和使用過Linux系統(tǒng)
2、學習OSI七層協(xié)議和作用
3、熟悉網(wǎng)絡協(xié)議,特別是IP/TCP/UDP
4、了解交換機、路由器所對應的協(xié)議層且知道兩者的差異
基本語法
tcpdump [選項] [網(wǎng)絡接口]
常用選項如下所示:
| 選項 | 說明 |
|---|---|
| -A | 只顯示ASCII形式的數(shù)據(jù)包內(nèi)容 |
| -c | 就是Count的含義,指在接收到指定數(shù)量的分組包后退出,簡單來說就是允許抓幾個包 |
| -d | 將匹配信息包的編碼以人們能夠理解的格式進行顯示并退出 |
| -dd | 將匹配信息包的編碼以C語言程序段的格式顯示 |
| -ddd | 將匹配信息包的編碼以十進制的形式顯示 |
| -D | 列出所有可以選擇的抓包對象 |
| -e | 添加數(shù)據(jù)鏈路層的頭部信息 |
| -F | 指定過濾表達式所在的文件 |
| -i | 即interface,指定監(jiān)聽的網(wǎng)絡接口 |
| -l | 將輸出變?yōu)樾芯彌_模式 |
| -n | 不將主機地址轉(zhuǎn)換為名字 |
| -nn | 不轉(zhuǎn)換協(xié)議和端口號,當tcpdump遇到協(xié)議號或端口號,不需要將這些數(shù)字轉(zhuǎn)換為對應的協(xié)議名稱或端口名稱,如22端口SSH端口,我們希望顯示22,而非SSH |
| -p | 將網(wǎng)絡接口設(shè)置為非混雜模式 |
| -q | 快速輸出,僅輸出較少的協(xié)議信息 |
| -r | 從文件中讀取原始數(shù)據(jù)包,而這個文件通過由選項 -w 所產(chǎn)生 |
| -t | 在每一行中不輸出時間戳 |
| -tt | 在每一行中輸出非格式化的時間戳 |
| -ttt | 在每一行中輸出本行與前一行的時間差,單位為ms |
| -tttt | 在每一行中輸出由date處理的默認格式的時間戳 |
| -ttttt | 在每一行中輸出本行與第一行的時間差,單位為ms |
| -v | 顯示更詳細的信息 |
| -w | 將原始數(shù)據(jù)包信息保存到文件中 |
| -X | 將協(xié)議頭和包內(nèi)容原原本本的顯示出來 |
示例
如果要使用tcpdump抓包,一定要切換到root賬戶中。
1、第一個抓包示例
[root@localhost ~]# tcpdump -i ens5f1 -nn -X 'port 22' -c 1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens5f1, link-type EN10MB (Ethernet), capture size 262144 bytes
22:34:11.334916 IP 192.168.8.8.22 > 112.64.61.186.37035: Flags [P.], seq 3341229570:3341229782, ack 1999159071, win 31152, length 212
0x0000: 4510 00fc 7e99 4000 4006 44a8 c0a8 0808 E...~.@.@.D.....
0x0010: 7040 3dba 0016 90ab c727 1e02 7728 bf1f p@=......'..w(..
0x0020: 5018 79b0 7799 0000 0000 00b0 823d 4cf1 P.y.w........=L.
0x0030: 1108 58fc 3686 2bd2 5220 fe37 85ab 74cc ..X.6.+.R..7..t.
0x0040: bfb1 8831 7d1c 3b57 52ae aa91 28a2 67d8 ...1}.;WR...(.g.
0x0050: 08fb a257 7fc8 7186 39dc d266 3d32 cce8 ...W..q.9..f=2..
0x0060: 3eb7 130b a7d3 833b 59c9 bdf8 2141 6863 >......;Y...!Ahc
0x0070: 7cae 25ff 459e c94a a635 7098 6925 db48 |.%.E..J.5p.i%.H
0x0080: a9b0 32ab 5393 737f cf8c f2ed b47a 7d8b ..2.S.s......z}.
0x0090: 346c 39df 3ecc d2b0 e0ad 5104 272d 6513 4l9.>.....Q.'-e.
0x00a0: 4b8d 5ee6 6c7d 9477 e40b 8637 996a bb5a K.^.l}.w...7.j.Z
0x00b0: 471a 2ac4 3335 266d 0485 2e52 b2c2 f6e8 G.*.35&m...R....
0x00c0: 0549 5ae0 9c7b ad45 da0a eef2 1ccb b2ac .IZ..{.E........
0x00d0: a4a2 0a96 cc5f 238c 9570 0d15 984e 6f58 ....._#..p...NoX
0x00e0: d8ff 8034 1165 cf44 02e4 ed6b 631e 2548 ...4.e.D...kc.%H
0x00f0: 56fd 4c8a 664c e5ee d845 2e50 V.L.fL...E.P
1 packet captured
1 packet received by filter
0 packets dropped by kernel
-i : 指定用來抓包的網(wǎng)絡接口,這個參數(shù)在服務器有多個網(wǎng)卡的時候非常有效
-nn : 不轉(zhuǎn)換協(xié)議和端口號,當tcpdump遇到協(xié)議號或端口號,不需要將這些數(shù)字轉(zhuǎn)換為對應的協(xié)議名稱或端口名稱,如22端口SSH端口,我們希望顯示22,而非SSH
-X : 將協(xié)議頭和包內(nèi)容原原本本的顯示出來,tcpdump會同時以16進制和ASCII的形式進行顯示,在協(xié)議分析時非常好用。
'port 22' : 告訴tcpdump要有選擇的顯示所抓到的包,在該示例中,只顯示源端口或目的端口是22的數(shù)據(jù)包,其他的數(shù)據(jù)包則不顯示。
-c : 用來指定抓包的個數(shù),示例設(shè)置的個數(shù)為1,則代表僅抓取一個包之后就退出不再抓包了。
2、-e 增加數(shù)據(jù)鏈路層的頭部信息
- 不帶-e的抓包
[root@localhost ~]# tcpdump -i ens5f1 -c 1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens5f1, link-type EN10MB (Ethernet), capture size 262144 bytes
23:44:06.918259 IP localhost.localdomain.ssh > 112.64.61.186.37035: Flags [P.], seq 3341233794:3341234006, ack 1999165283, win 31152, length 212
1 packet captured
6 packets received by filter
0 packets dropped by kernel
- 帶-e的抓包
[root@localhost ~]# tcpdump -i ens5f1 -c 1 -e
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens5f1, link-type EN10MB (Ethernet), capture size 262144 bytes
23:45:51.114314 dc:fe:18:65:76:f2 (oui Unknown) > 34:97:f6:5a:50:e0 (oui Unknown), ethertype IPv4 (0x0800), length 82: 112.85.42.197.20263 > localhost.localdomain.ssh: Flags [P.], seq 254675888:254675904, ack 306708143, win 155, options [nop,nop,TS val 3668622988 ecr 391712180], length 16
1 packet captured
8 packets received by filter
0 packets dropped by kernel
? ? 通過兩個命令的輸出對比,可以看到增加-e選項后,輸出的結(jié)果中增加MAC地址信息。而且在輸出內(nèi)容中會有oui Unknown,OUI即Organizationally unique identifier(組織唯一標識符),在任何一塊網(wǎng)卡中燒錄的6字節(jié)MAC地址中,前3個字節(jié)體現(xiàn)了OUI,其表明了網(wǎng)卡的制造組織,通常情況下,該標識符是唯一的。在本例中,由于沒有識別出網(wǎng)卡的制造商,因此顯示為Unknown。
3、-l 將輸出變?yōu)樾芯彌_模式
? ? -l的作用是將tcpdump的輸出行為變?yōu)?strong>行緩沖方式,這樣可以保證tcpdump遇到換行符,就立即將緩沖的內(nèi)容輸出到標準輸出(stdout),方便利用管道或重定向方式進行后續(xù)處理,而不會造成延遲。
? ? 在Linux的標準I/O中提供了全緩沖、行緩沖、無緩沖三種緩沖方式。標準錯誤是不帶緩沖的,而終端設(shè)備常為行緩沖,其他默認則為全緩沖。
[root@localhost ~]# tcpdump -i ens5f1 -l -c 5 | awk '{print $5}'
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens5f1, link-type EN10MB (Ethernet), capture size 262144 bytes
112.64.61.186.37035:
gateway.domain:
localhost.localdomain.49348:
gateway.domain:
localhost.localdomain.ssh:
5 packets captured
13 packets received by filter
0 packets dropped by kernel
? ? 在該例中,將tcpdump輸出的內(nèi)容通過管道提取第5列,可以用來查看詳細的連接信息。而如果不加 -l 選項時,則只有當緩沖區(qū)全部占滿時,tcpdump才會將緩沖區(qū)中的內(nèi)容輸出,這樣就有可能導致輸出不連續(xù)的,如果強行結(jié)束,則會影響下一行的完整性。
4、-t 輸出不加時間戳
[root@localhost ~]# tcpdump -i ens5f1 -c 1
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens5f1, link-type EN10MB (Ethernet), capture size 262144 bytes
23:48:03.193526 IP localhost.localdomain.ssh > 112.64.60.194.19101: Flags [P.], seq 3091447763:3091447975, ack 4113666212, win 251, length 212
1 packet captured
6 packets received by filter
0 packets dropped by kernel
[root@localhost ~]# tcpdump -i ens5f1 -c 1 -t
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens5f1, link-type EN10MB (Ethernet), capture size 262144 bytes
IP localhost.localdomain.ssh > 112.64.60.194.19101: Flags [P.], seq 3091448643:3091448855, ack 4113666488, win 251, length 212
1 packet captured
6 packets received by filter
0 packets dropped by kernel
? ? 在增加選項-t選項后,時間23:48:03.193526就消失了。tcpdump默認情況下是按微秒來計時,因此最一個時間精確到了第6位。
5、 -v 顯示詳細信息
[root@localhost ~]# tcpdump -i ens5f1 -c 1 -v
tcpdump: listening on ens5f1, link-type EN10MB (Ethernet), capture size 262144 bytes
23:53:13.252748 IP (tos 0x10, ttl 64, id 24820, offset 0, flags [DF], proto TCP (6), length 188)
localhost.localdomain.ssh > 112.64.60.194.19101: Flags [P.], cksum 0x7661 (incorrect -> 0x2474), seq 3091449471:3091449619, ack 4113666972, win 251, length 148
1 packet captured
7 packets received by filter
0 packets dropped by kernel
? ? 在增加-v選項后,會在輸出的內(nèi)容中增加tos、ttl、id、offset、協(xié)議編號、總長度等,如需要理解這些信息,就需要了解TCP/IP協(xié)議中的頭的具體定義了。
6、-F 指定過濾表達式所在的文件
? ? 在第一個示例中,命令行增加了'port 22',而這一項就叫過濾條件,如果設(shè)置了過濾條件,則tcpdump只抓取滿足過濾條件的數(shù)據(jù)包。如需要設(shè)置較為復雜的過濾條件或復用過濾條件時,這時可以將過濾條件保存為文件,然后通過-F加載該過濾文件。
[root@localhost ~]# cat tcpdumpFilter.txt
port 22
[root@localhost ~]# tcpdump -i ens5f1 -c 1 -v -F ~/tcpdumpFilter.txt
tcpdump: listening on ens5f1, link-type EN10MB (Ethernet), capture size 262144 bytes
00:05:52.685555 IP (tos 0x10, ttl 64, id 25291, offset 0, flags [DF], proto TCP (6), length 188)
localhost.localdomain.ssh > 112.64.60.194.19101: Flags [P.], cksum 0x7661 (incorrect -> 0x827b), seq 3091492507:3091492655, ack 4113685300, win 251, length 148
1 packet captured
3 packets received by filter
0 packets dropped by kernel
7、 -w 將原始數(shù)據(jù)包信息保存到文件中
[root@localhost ~]# tcpdump -i ens5f1 -c 1 -v -F ~/tcpdumpFilter.txt -w ~/tcpdumpRAW
tcpdump: listening on ens5f1, link-type EN10MB (Ethernet), capture size 262144 bytes
1 packet captured
1 packet received by filter
0 packets dropped by kernel
[root@localhost ~]# cat tcpdumpRAW
?2?ˉOW[?
ˊ?ev??ZE?c&@@ap@<J?Du???P???W?.[?OG??F ??C?>{d6toв?w厸§Ng}???O?6I}+/l??
G?Z?°}_`a5±?z
寂Y凢
? ? 當我們查看保存的文件時,出現(xiàn)的是亂碼。則代表無法直接查看,很有可能是二進制文件。那么怎么查看保存的文件了?請看下一個示例。
[root@localhost ~]# file tcpdumpRAW
tcpdumpRAW: tcpdump capture file (little-endian) - version 2.4 (Ethernet, capture length 262144)
7、 -r 從文件中讀取原始數(shù)據(jù)包
[root@localhost ~]# tcpdump -r ~/tcpdumpRAW
reading from file /root/tcpdumpRAW, link-type EN10MB (Ethernet)
00:11:27.838878 IP localhost.localdomain.ssh > 112.64.60.194.19101: Flags [P.], seq 3091494399:3091494547, ack 4113686720, win 251, length 148
? ? 通過-w和-r選項即可實現(xiàn)抓包的錄制回放功能。