1. 程式人生 > >Tcpdump用法詳解

Tcpdump用法詳解

tcpdump選項 tcpdump實例

Tcpdump介紹


Tcpdumph會打印輸出一個滿足條件的網絡接口上數據包內容。 它也可以用-w標誌運行,這樣它將數據信息保存到一個文件中供以後分析,或使用-r標誌,從保存的文件中讀取數據。它也可以用-V標誌運行,使其讀取已保存的數據包文件列表。 在任何情況下,只有匹配表達式的數據包才會被tcpdump處理

如果Tcpdump沒有指定-c選項,它將不斷捕獲數據包,直到它被一個SIGINT信號(例如,通過輸入中斷字符,通常為control+c)或一個SIGTERM信號(通常由kill (1)命令)中斷。如果使用-c標誌運行,它將捕獲數據包,直到數據包數量到-c為止

在支持SIGINFO信號的平臺上,比如大多數BSD(包括Mac OS X)和Digital / Tru64 UNIX,它會在接收到SIGINFO信號(例如,通過輸入“status”字符 ,通常是control-T,盡管在一些平臺上,比如Mac OS X,“status”字符默認沒有設置,所以你必須設置stty(1)才能使用它),並繼續捕獲數據包。

Tcpdump命令格式


tcpdump [ -AbdDefhHIJKlLnNOpqRStuUvxX ] [ -B buffer_size ] [ -c count ]

[ -C file_size ] [ -G rotate_seconds ] [ -F file ]

[ -i interface ] [ -j tstamp_type ] [ -m module ] [ -M secret ]

[ -P in|out|inout ]

[ -r file ] [ -V file ] [ -s snaplen ] [ -T type ] [ -w file ]

[ -W filecount ]

[ -E spi@ipaddr algo:secret,... ]

[ -y datalinktype ] [ -z postrotate-command ] [ -Z user ]

[ expression ]

雖然上面這麽多參數看著都讓人頭疼,其實總結出來很簡單:tcpdump option filter,其中option表示選項,而filter則表示過濾條件,你要對什麽進行過濾,filter可以是單個條件(tcp、src、host xxx),也可以將這些單一的參數進行組合,比如:dst port 3306 and src port 58895

Tcpdump選項


-i 選項:表示tcpdump監聽端口,如果不指定,那麽會搜索所有的網絡接口

~ ]# tcpdump -i ens33 # 在ens33這個網絡接口監聽

~ ]# tcpdump -i ens33 # linux 2.2以上支持 -i ens33,可以監聽所有端口

-n 選項:不要把ip轉換為主機名

~ ]#tcpdump -i ens33 -n

-w -選項,-w為把內容write到某個地方, -表示標準輸出 也就是輸出到標準輸出中,下面是一個超級有用的命令,把包的數據,用字符展示出來。

~ ]# tcpdump -i ens33 -w - | strings

~ ]# tcpdump -w test.cap # 把抓包結果寫入test.cap中,方便wireshark分析

-C num選項:如果test.cap 超過num大小,則新開一個文件, C fileSize , 單位是MB

~ ]# tcpdump -C 1 -w test.cap

-r 選項: 從某個文件讀取

~ ]# tcpdump -n -r test.cap

-X 選項:以十六進制以及ASCII的形式打印數據內容

~ ]# tcpdump -X

~ ]# tcpdump -x # 除了打印出header外,還打印packet裏面的數據(十六進制的形式)

~ ]# tcpdump -xx # 以十六進制的形式打印header, data內容

- A 選項,把每一個packet都用以ASCII的形式打印出來

~ ]# tcpdump -i ens33 -A host www.itshouce.com.cn

-c # 表示收到 # packet就退出

~ ]# tcpdump -i ens33 -A -c 3 172.18.14.55 # 接收三個包就退出

-D 選項:看目前機器上有哪些網絡接口

~ ]# tcpdump -D

1.nflog (Linux netfilter log (NFLOG) interface)

2.nfqueue (Linux netfilter queue (NFQUEUE) interface)

3.usbmon1 (USB bus number 1)

4.usbmon2 (USB bus number 2)

5.ens33

6.ens34

7.ens33 (Pseudo-device that captures on all interfaces)

8.lo

-e 選項:把連接層的頭打印出來

~ ]# tcpdump -i ens33 -e

16:49:14.658811 78:e3:b5:82:39:1b (oui Unknown) > 00:0c:29:66:59:95 (oui Unknown), ethertype IPv4 (0x0800), length 60: 172.18.14.200.59324 > node1.ssh: Flags [.], ack 40028648, win 2, length 0

-j 選項,修改時間格式

~ ]# tcpdump -i ens33 -j timestamp type # 可以修改輸出的時間格式,

~ ]# tcpdump -J

# 顯示支持的時間格式 : List the supported time stamp types for the interface and exit. If the time stamp type cannot be set for the interface, no time stamp types are listed。

-l 選項:把stdout bufferd住,當你既想在屏幕上看結果,又想把結果輸出到文件中時,比較有用

~ ]# tcpdump -l

# 可以配合tee命令,在屏幕上顯示dump內容,並把內容輸出到dump.log中,如下

~ ]# tcpdump -l |tee dump.log # or下面這種寫法

~ ]# tcpdump -l > dump.log &tail -f dump.log

-q 選項: 就是quiect output, 靜默輸出,盡量少的打印一些信息

~ ]# tcpdump -q

-S 選項:打印真實的,絕對的tcp seq no

~ ]# tcpdump -i ens33 -S

-s 選型:指定包大小,默認抓取包長度是65535,

~ ]# tcpdump # capture sieze 65535l

~ ]# tcpdump -s 256 # 我們設置為256 該參數目的:減少抓包文件的大小

-t 選項:不要打時間戳,

~ ]# tcpdump -i ens33 -t

-tt 選項:打出timstamp,從1970-1-1 以來的秒數,以及微秒數

~ ]# tcpdump -i ens33 -tt

-v 選項:verbose,即打印詳細信息。

~ ]# tcpdump -i ens33 -v # 打印出詳細結果,如ttl值

~ ]# tcpdump -i ens33 -vv # 打印出更加詳細的結果 如window, checksum等

Tcpdump過濾項


下面所有測試中都有 -i ens33的選項,表示抓取ens33網絡接口上的包,只是為了讓測試方便。你可以指定所有端口:-i any

# 抓取arp協議的包,然後host為192.168.199.* 測試時需要在另一個session,做一個ifconfig指令arp可以換為tcp,udp等。

~ ]# tcpudmp -i ens33 -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 ens33 -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 ens33 -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 ens33 -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

# 表示抓取destination prot 在1到80之間的端口的數據

~ ]# tcpdump -i ens33 -n dst portrange 1-80

# 抓取源的端口是20-80的包

~ ]# tcpdump -i ens33 -n src portrange 20-80

# 抓取端口是20-80的包,不考慮源

~ ]# tcpdump -i ens33 -n portrange 20-80

# 抓取destination為www.baidu.com的包

~ ]# tcpdump -i ens33 dst www.baidu.com

# 在另外的session中ping www.baidu.com ,以及 在瀏覽器中訪問www.baidu.com


# 抓取destination為192.168.14.55的包

~ ]# tcpdump -i ens33 dst 192.168.14.55

# 抓取destination為192.168.1.[0-255]的包

~ ]# tcpdump -i ens33 dst 192.168.1 # 也可以指定範圍

# 抓取source為192.168.*.*的包, 使用-n 則只是為了顯示ip,而不是主機名,

~ ]# tcpdump -i ens33 -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 ens33 -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

# 抓取包長度小於800的包

~ ]# tcpudmp -i ens33 -n less 800

21:09:17.687673 IP 192.168.199.1.50150 > *.*.*.*.1900: UDP, length 385


# 抓取包長度大於800的包

~ ]# tcpdump -i ens33 -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 ens33 -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 ens33 -n udp

21:22:48.434449 IP 192.168.199.1.50150 > *.*.*.*.1900: UDP, length 385


# 只抓取icmp的包,internet控制包

~ ]# tcpdump -i ens33 -n icmp

21:25:42.550374 IP 192.168.199.1 > 192.168.199.125: ICMP *.*.*.* unreachable - need to frag (mtu 1480), length 556




本文出自 “vinsent” 博客,請務必保留此出處http://vinsent.blog.51cto.com/13116656/1983295

Tcpdump用法詳解