UNIX系統上的抓包工具tcpdump常用命令說明


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 &


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM