天天看點

tcpdump指令詳解(轉載)

1、tcpdump指令簡介

tcpdump指令是基于unix系統的指令行的資料報嗅探工具,可以抓取流動在網卡上的資料包。它的原理大概如下:linux抓包是通過注冊一種虛拟的底層網絡協定來完成對網絡封包(準确的是網絡裝置)消息的處理權。當網卡接收到一個網絡封包之後,它會周遊系統中所有已經注冊的網絡協定,如以太網協定、x25協定處理子產品來嘗試進行封包的解析處理。當抓包子產品把自己僞裝成一個網絡協定的時候,系統在收到封包的時候就會給這個僞協定一次機會,讓它對網卡收到的保溫進行一次處理,此時該子產品就會趁機對封包進行窺探,也就是啊這個封包完完整整的複制一份,假裝是自己接收的封包,彙報給抓包子產品。

1.1 文法

檢視本地網卡狀态:

[[email protected] daocoder]# netstat -i
Kernel Interface table
Iface      MTU    RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
docker0   1500    40409      0      0 0         20376      0      0      0 BMU
ens5f0    1500 22999894941      0      0 0      25581016784      0      0      0 BMRU
lo       65536 850291094      0      0 0      850291094      0      0      0 LRU
           

Iface:存在的網卡。

MTU:最大傳輸單元。

RX-OK RX-ERR RX-DRP RX-OVR:正确接收資料報的數量以及發生錯誤、流式、碰撞的總數。

TX-OK TX-ERR TX-DRP TX-OVR:正确發送資料報的數量以及發生錯誤、流式、碰撞的總數。

[[email protected] daocoder]# tcpdump --help
tcpdump version 4.9.0
libpcap version 1.5.3
OpenSSL 1.0.1e-fips 11 Feb 2013
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 ]
           

這裡面大概可以分成幾類來看:

1、類型的關鍵字

host:指明一台主機。如:host 10.1.110.110

net:指明一個網絡位址,如:net 10.1.0.0

port:指明端口号:如:port 8090

2、确定方向的關鍵字

src:ip包的源位址,如:src 10.1.110.110

dst:ip包的目标位址。如:dst 10.1.110.110

3、協定的關鍵字(預設是所有協定的資訊包)

fddi、ip、arp、rarp、tcp、udp。

4、其它關鍵字

gateway、broadcast、less、greater。

5、常用表達式

! or not

&& or and

|| or or

6、參數詳解

A:以ascii編碼列印每個封包(不包括鍊路的頭)。

a:将網絡位址和廣播位址轉變成名字。

c:抓取指定數目的包。

C:用于判斷用 -w 選項将封包寫入的檔案的大小是否超過這個值,如果超過了就建立檔案(檔案名字尾是1、2、3依次增加);

d:将比對資訊包的代碼以人們能夠了解的彙編格式給出;

dd:将比對資訊包的代碼以c語言程式段的格式給出;

ddd:将比對資訊包的代碼以十進制的形式給出;

D:列出目前主機的所有網卡編号和名稱,可以用于選項 -i;

e:在輸出行列印出資料鍊路層的頭部資訊;

f:将外部的Internet位址以數字的形式列印出來;

F<表達檔案>:從指定的檔案中讀取表達式,忽略其它的表達式;

i<網絡界面>:監聽主機的該網卡上的資料流,如果沒有指定,就會使用最小網卡編号的網卡(在選項-D可知道,但是不包括環路接口),linux 2.2 核心及之後的版本支援 any 網卡,用于指代任意網卡;

l:如果沒有使用 -w 選項,就可以将封包列印到 标準輸出終端(此時這是預設);

n:顯示ip,而不是主機名;

nn:顯示port,而不是服務名;

N:不列出域名;

O:不将資料包編碼最佳化;

p:不讓網絡界面進入混雜模式;

q:快速輸出,僅列出少數的傳輸協定資訊;

r<資料封包件>:從指定的檔案中讀取包(這些包一般通過-w選項産生);

s<資料包大小>:指定抓包顯示一行的寬度,-s0表示可按包長顯示完整的包,經常和-A一起用,預設截取長度為60個位元組,但一般ethernet MTU都是1500位元組。是以,要抓取大于60位元組的包時,使用預設參數就會導緻包資料丢失;

S:用絕對而非相對數值列出TCP關聯數;

t:在輸出的每一行不列印時間戳;

tt:在輸出的每一行顯示未經格式化的時間戳記;

T<資料包類型>:将監聽到的包直接解釋為指定的類型的封包,常見的類型有rpc (遠端過程調用)和snmp(簡單網絡管理協定);

v:輸出一個稍微詳細的資訊,例如在ip包中可以包括ttl和服務類型的資訊;

vv:輸出詳細的封包資訊;

x/-xx/-X/-XX:以十六進制顯示包内容,幾個選項隻有細微的差别,詳見man手冊;

w<資料封包件>:直接将包寫入檔案中,并不分析和列印出來;

expression:用于篩選的邏輯表達式;

1.2 視圖參數含義

[[email protected] dcocoder]# tcpdump host 10.1.110.110 -i ens5f0 -c 10 -l -n
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens5f0, link-type EN10MB (Ethernet), capture size 262144 bytes
10:59:51.071567 IP 10.1.85.21.ssh > 10.1.110.110.7608: Flags [P.], seq 1715331653:1715331865, ack 2259278754, win 65535, length 212
10:59:51.071699 IP 10.1.85.21.ssh > 10.1.110.110.7608: Flags [P.], seq 212:408, ack 1, win 65535, length 196
10:59:51.071794 IP 10.1.85.21.ssh > 10.1.110.110.7608: Flags [P.], seq 408:572, ack 1, win 65535, length 164
10:59:51.071861 IP 10.1.85.21.ssh > 10.1.110.110.7608: Flags [P.], seq 572:736, ack 1, win 65535, length 164
10:59:51.071910 IP 10.1.85.21.ssh > 10.1.110.110.7608: Flags [P.], seq 736:900, ack 1, win 65535, length 164
10:59:51.071958 IP 10.1.85.21.ssh > 10.1.110.110.7608: Flags [P.], seq 900:1064, ack 1, win 65535, length 164
10:59:51.072006 IP 10.1.85.21.ssh > 10.1.110.110.7608: Flags [P.], seq 1064:1228, ack 1, win 65535, length 164
10:59:51.072053 IP 10.1.85.21.ssh > 10.1.110.110.7608: Flags [P.], seq 1228:1392, ack 1, win 65535, length 164
10:59:51.072141 IP 10.1.85.21.ssh > 10.1.110.110.7608: Flags [P.], seq 1392:1556, ack 1, win 65535, length 164
10:59:51.077438 IP 10.1.110.110.7608 > 10.1.87.25.ssh: Flags [.], ack 212, win 63360, length 0
10 packets captured
13 packets received by filter
0 packets dropped by kernel
           

1、第一行:

tcpdump: verbose output suppressed, use -v or -vv for full protocol decode

使用選項v和vv,可以看出更全的詳細内容。

2、第二行:

listening on ens5f0, link-type EN10MB (Ethernet), capture size 262144 bytes

,說明監聽的是ens5f0這個NIC裝置的網絡包,且它的鍊路層是基于以太網的,要抓的包大小限制262144,裝包大小限制可以用利用-s來控制。

3、第三行:

10:59:51.071567 IP 10.1.87.21.ssh > 10.1.110.110.7608: Flags [P.], seq 1715331653:1715331865, ack 2259278754, win 65535, length 212

10:59:51.071567:抓包時間為時、分、秒、微妙。

IP 10.1.87.21.ssh > 10.1.110.110.7608: Flags [P.], seq 1715331653:1715331865, ack 2259278754, win 65535, length 212

,這裡用man dump這個指令引用說明:

src > dst: flags data-seqno ack window urgent options
Src and dst are the source and destination IP addresses and ports.
Flags are some combination of S (SYN), F (FIN), P (PUSH), R (RST), U (URG), W (ECN CWR), E (ECN-Echo) or '.' (ACK), or 'none' if no flags are set.
Data-seqno describes the portion of sequence space covered by the data in this packet (see example below). Ack is sequence number of the next data expected the other direction on this connection.
Window is the number of bytes of receive buffer space available the other direction on this connection.
Urg indicates there is `urgent' data in the packet.
Options are tcp options enclosed in angle brackets (e.g., <mss 1024>).
           

上面視圖簡單的解釋就是該包10.1.87.21傳到10.1.110.110,通過的端口是22(ssh的端口)向7608,前幾個是使用的是PUSH的辨別,最後一個是傳回的ACK辨別。

1.3 常用場景

1、擷取10.1.85.21和10.1.85.19之間的通信,使用指令注意轉義符号。

2、擷取從10.1.85.21發來的包。

[[email protected] daocoder]# tcpdump src host 10.1.85.21 -c 10 -i ens5f1
           

3、監聽tcp(udp)端口。

4、擷取主機10.1.85.21和除10.1.85.19之外所有主機的通信。

[[email protected] daocoder]# tcpdump ip host 10.1.85.21 and ! 10.1.85.19 -c 10 -i any
           

5、擷取從10.1.85.19且端口主機到10.1.85.21主機的通信。

[[email protected] daocoder]# tcpdump src host 10.1.85.19 and src port 48565 and dst host 10.1.85.21 an
           

轉載:https://www.jianshu.com/p/23427a80fc9d

繼續閱讀