网络/命令行抓包工具Tcpdump详解

用简单的话来定义tcpdump,就是:dump the traffic on a network,根据使用者的定义对网络上的数据包进行截获的包分析工具。
首页 新闻资讯 行业资讯 网络/命令行抓包工具Tcpdump详解

[[373681]]

 概述

用简单的话来定义tcpdump,就是:dump the traffic on a  network,根据使用者的定义对网络上的数据包进行截获的包分析工具。

tcpdump可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你去掉无用的信息。

tcpdump基于底层libpcap库开发,运行需要root权限。

一、tcpdump安装

1.环境 虚拟机:vmware 15.5.2 os: ubuntu 12.04

2.安装tcpdump

复制

sudo apt-get install tcpdump
  • 1.

 

3. 版本查看

复制

tcpdump --h
  • 1.

 tcpdump version 4.0。

libpcap version 1.1.1 表示libpcap的版本。

二、tcpdump参数常用参数

选项说明:

三、命令选项使用举例

1. 截获主机收到和发出的所有数据包。

命令:

复制

tcpdump
  • 1.

说明:

tcpdump截取包默认显示数据包的头部。

普通情况下,直接启动tcpdump将监视第一个网络接口上所有流过的数据包。

基础格式:时间 数据包类型 源IP 端口/协议 > 目标IP 端口/协议 协议详细信息


按下Ctrl+C会终止tcpdump命令。且会在结尾处生成统计信息。


终止tcpdump

2. 指定抓包数量 -c

指定抓取2个数据包。

命令:

复制

tcpdump -c 2
  • 1.

说明:

最后会自动生成统计信息。


【注意,已经切换到管理员了,虚拟机中要产生数据包,可以另外开一个窗口ping baidu.com后面不再提示】

 

ping baidu.com

3. 将抓包信息写入文件 -w

使用-w选项指定记录文件。

命令:

复制

tcpdump -c 10 -w tcpdump_test.log
  • 1.

说明:

保存的文件不是文本格式,不能直接查看。tcpdump保存的文件的格式是几乎所有主流的抓包工具软件都可以读取。所以可以使用更易读的图形界面工具来查看记录文件。

4. 读取记录文件 -r

使用-r选项读取文件。

命令:

复制

tcpdump -r tcpdump_test.log
  • 1.

![读取记录文件


5. 打印出所有可工作的接口 -D

命令:

复制

tcpdump -D
  • 1.

 其中网卡为eth0。

6. 指定监控的网卡 -i

命令:

复制

tcpdump -i eth0
  • 1.

如果不指定网卡,默认tcpdump只会监视第一个网络接口,一般是eth0。

7. 显示更详细的数据包信息 -v -vv

选项-v,-vv可以显示更详细的抓包信息。


tcpdump -v


tcpdump -vv

8. 不使用域名反解 -n

使用-n后,tcpdump会直接显示IP地址,不会显示域名(与netstat命令相似)。

9. 增加抓包时间戳 -tttt选项

tcpdump的所有输出打印行中都会默认包含时间戳信息;时间戳信息的显示格式如下

复制

hh:mm:ss.frac (nt: 小时:分钟:秒.)
  • 1.

此时间戳的精度与内核时间精度一致, 反映的是内核第一次看到对应数据包的时间;

而数据包从物理线路传递到内核的时间, 以及内核花费在此包上的中断处理时间都没有算进来;

使用-tttt选项,抓包结果中将包含抓包日期:

命令:

复制

tcpdump -tttt
  • 1.

 

增加抓包时间戳

四、条件过滤

1.  过滤:指定需要抓取的协议

tcpdump可以只抓某种协议的包,支持指定以下协议:「ip,ip6,arp,tcp,udp,wlan」等。

命令:

复制

tcpdump udp  tcpdump icmp  tcpdump tcp  tcpdump arp
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

  • 6.

  • 7.

2. 过滤:指定协议的端口号

使用port参数,用于指定端口号。

命令:tcpdump tcp port 80

使用portrange参数,用于指定端口范围。

命令:tcpdump tcp portrange 1-1024

3. 过滤:指定源与目标

src 表示源。

dst 表示目标。

命令:

tcpdump src port 8080

tcpdump dst port 80

4. 过滤:指定特定主机的消息包

使用host指定需要监听的主机。

命令:

复制

tcpdump host 192.168.1.113
  • 1.

注意:若使用了host参数使用了计算机名或域名。例tcpdump host shi-pc ,则无法再使用-n选项。

5. 过滤:指定数据包大小

使用greater(大于)与less(小于)可以指定数据包大小的范围。

「例:只抓取大于1000字节的数据包。」

命令:

复制

tcpdump greater 1000
  • 1.

「例:只抓取小于10字节的数据包。」

命令:

复制

tcpdump less 10
  • 1.

五、 逻辑表达式

使用基本逻辑组合拼装出更精细的过滤条件。

1. 逻辑与

逻辑与关系,使用and。

命令:

复制

tcpdump tcp and host 192.168.1.112  tcpdump tcp and src 192.168.1.112 and port 8080
  • 1.

  • 2.

  • 3.

2. 逻辑或

逻辑或关系,使用or。

命令:

复制

tcpdump host 192.168.1.112 or 192.168.1.113
  • 1.

3. 逻辑非

逻辑非关系,使用not,也可以使用 ! 。

若使用 ! 必须与其后面的字符隔开一个空格。

例:当通过ssh协议远程使用tcpdump时,为了避免ssh的数据包的输出,所以一般需要禁止ssh数据包的输出。

命令:

复制

tcpdump not tcp port 22  tcpdump ! tcp port 22
  • 1.

  • 2.

  • 3.

4. 括号

括号需要使用在引号内,或转意使用。否则会报错。

例:抓取非22端口,且主机为192.168.1.112 和 192.168.1.113的TCP数据包。

命令:

复制

tcpdump not tcp port 22 and host 192.168.1.112or192.168.1.113  tcpdump "not tcp port 22 and host (192.168.1.112 or 192.168.1.113)"  tcpdump not tcp port 22 and host "(192.168.1.112 or 192.168.1.113)"
  • 1.

  • 2.

  • 3.

  • 4.

  • 5.

六、其他实例

1. 打印所有进入或离开sundown的数据包

复制

tcpdump host sundown
  • 1.

2. 截获主机210.27.48.1 和主机210.27.48.2 或210.27.48.3的通信

复制

tcpdump host 210.27.48.1 and \ (210.27.48.2 or 210.27.48.3 \)
  • 1.

3. 如果想要获取主机210.27.48.1除了和主机210.27.48.2之外所有主机通信的ip包,使用命令:

复制

tcpdump ip host 210.27.48.1 and ! 210.27.48.2
  • 1.

4. 监视所有送到主机hostname的数据包

复制

tcpdump -i eth0 dst host hostname
  • 1.

5. 获取主机210.27.48.1接收或发出的telnet包

23为telnet的端口

复制

tcpdump tcp port 23 and host 210.27.48.1
  • 1.

6. 监视本机的udp 123 端口

123 为ntp的服务端口

复制

tcpdump udp port 123
  • 1.

7. 使用tcpdump抓取HTTP包

复制

tcpdump  -XvvennSs 0 -i eth0 tcp[20:2]=0x4745 or tcp[20:2]=0x4854
  • 1.

  • 0x4745 为"GET"前两个字母"GE",

  • 0x4854 为"HTTP"前两个字母"HT"。

tcpdump 对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。

显然这不利于分析网络故障,通常的解决办法是先使用带**-w参数的tcpdump  截获数据并保存到文件中**,然后再使用其他程序(如Wireshark)进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。

六、查看数据包完整内容

tcpdump默认不显示数据包的详细内容。

方法一:

使用-A参数能以ASCII码显示数据包。

例:只抓取1个数据包,并显示其内容。

命令:

复制

tcpdump -c 1 -A
  • 1.

 

方法二:

使用-X参数能16进制数与ASCII码共同显示数据包。

例:只抓取1个数据包,并显示其内容。

命令:

复制

tcpdump -c 1 -X
  • 1.

 

七、tcpdump  与wiresharkWireshark

(以前是ethereal)是Windows下非常简单易用的抓包工具,现在也有Linux版本。

通过Tcpdump抓取的数据包分析比较麻烦,要想很方便的分析数据包, 我们可以用Tcpdump + Wireshark 的完美组合实现:在 Linux  里抓包,然后在Windows 里分析包。

保存数据包为wireshark能识别的文件:

复制

tcpdump tcp -i eth1 -t -s 0 -c 100 and dst port ! 22 and src net 192.168.1.0/24 -w ./target.cap
  • 1.

参数含义

 

42    2021-01-05 06:12:38    Tcpdump 工具 网络