Tcpdump用法详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 [email protected] 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用法详解的主要内容,如果未能解决你的问题,请参考以下文章

tcpdump详解

c 中vector的用法详解

HttpURLConnection 用法详解

linux 详解useradd 命令基本用法

ASP中FormatDateTime函数用法详解

Promise用法详解