tcpdump 工具详解
用简单的话来定义tcpdump
,就是:dump the traffic on a network
,根据使用者的定义对网络上的数据包进行截获的包分析工具。
tcpdump
可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not
等逻辑语句来帮助你去掉无用的信息。
tcpdump
基于底层libpcap
库开发,运行需要root
权限。
安装 tcpdump
- 环境:Ubuntu
- 安装 tcpdump
1
apt-get install -y tcpdump
- 版本查看
tcpdump 参数
参数 | 含义 |
---|---|
-a | 将网络地址和广播地址转变成名字 |
-c | 在收到指定的包的数目后,tcpdump就会停止; |
-d | 将匹配信息包的代码以人们能够理解的汇编格式给出;以可阅读的格式输出。 |
-dd | 将匹配信息包的代码以c语言程序段的格式给出; |
-ddd | 将匹配信息包的代码以十进制的形式给出; |
-e | 在输出行打印出数据链路层的头部信息; |
-f | 将外部的Internet地址以数字的形式打印出来; |
-l | 使标准输出变为缓冲行形式; |
-n | 直接显示IP地址,不显示名称; |
-nn | 端口名称显示为数字形式,不显示名称; |
-t | 在输出的每一行不打印时间戳; |
-v | 输出一个稍微详细的信息,例如在ip包中可以包括ttl和服务类型的信息; |
-vv | 输出详细的报文信息; |
-F | 从指定的文件中读取表达式,忽略其它的表达式; |
-i | 指定监听的网络接口; |
-r | 从指定的文件中读取包(这些包一般通过-w选项产生); |
-w | 直接将包写入文件中,并不分析和打印出来; |
-T | 将监听到的包直接解释为指定的类型的报文,常见的类型有rpc (远程过程调用)和snmp(简单 网络管理协议;) |
命令选项使用示例
接活主机收到和发出的所有数据包
命令:
1 |
|
说明:
tcpdump
截取包默认显示数据包的头部。
普通情况下,直接启动tcpdump
将监视第一个网络接口上所有流过的数据包。
基础格式:时间 数据包类型 源 IP
端口/协议 > 目标 IP
端口/协议 协议详细信息
按下Ctrl+C
会终止tcpdump
命令。且会在结尾处生成统计信息。
指定抓包数量 -c
指定抓取2个数据包,最后会自动生成统计信息。
1 |
|
将抓包信息写入文件 -w
使用-w选项指定记录文件。
1 |
|
读取记录文件 -r
使用 -r
选项读取文件。
1 |
|
需要先更改文件的所属组:
chown root:root tcpdump_test.log
打印出所有可工作的接口 -D
1 |
|
其中,网卡为
eth0
指定监控的网卡 -i
1 |
|
如果不指定网卡,默认tcpdump只会监视第一个网络接口,一般是eth0。
显示更详细的信息 -v
-vv
选项-v
,-vv
可以显示更详细的抓包信息。
1 |
|
不使用域名反解 -n
使用-n
后,tcpdump
会直接显示IP
地址,不会显示域名(与netstat
命令相似)。
增加抓包时间戳 -tttt
选项
tcpdump
的所有输出打印行中都会默认包含时间戳信息;时间戳信息的显示格式如下:
1 |
|
此时间戳的精度与内核时间精度一致, 反映的是内核第一次看到对应数据包的时间;
而数据包从物理线路传递到内核的时间, 以及内核花费在此包上的中断处理时间都没有算进来;
使用-tttt
选项,抓包结果中将包含抓包日期:
条件过滤
指定需要抓取的协议
tcpdump
可以只抓某种协议的包,支持指定以下协议:「ip
,ip6
,arp
,tcp
,udp
,wlan
」等。
命令:
1 |
|
指定协议的端口号
使用port
参数,用于指定端口号。
1 |
|
使用portrange
参数,用于指定端口范围。
1 |
|
指定源与目标
src
表示源,dst
表示目标
1 |
|
1 |
|
指定特定主机的消息包
使用host
指定需要监听的主机。
1 |
|
注意:
若使用了
host
参数使用了计算机名或域名。例tcpdump host shi-pc
,则无法再使用-n
选项。
指定数据包大小
使用 greater
(大于)与 less
(小于)可以指定数据包大小的范围。
「例:只抓取大于1000字节的数据包。」
1 |
|
「例:只抓取小于10字节的数据包。」
1 |
|
逻辑表达式
使用基本逻辑组合拼装出更精细的过滤条件。
逻辑与
逻辑与关系,使用and
。
1 |
|
逻辑或
逻辑或关系,使用or
。
1 |
|
逻辑非
逻辑非关系,使用not
,也可以使用 !
。
若使用 !
必须与其后面的字符隔开一个空格。
例:当通过ssh
协议远程使用tcpdump
时,为了避免ssh
的数据包的输出,所以一般需要禁止ssh
数据包的输出。
1 |
|
括号
括号需要使用在引号内,或转意使用。否则会报错。
例:抓取非22端口,且主机为 192.168.1.112
和 192.168.1.113
的TCP
数据包。
1 |
|
其他示例
打印所有进入或离开 sundown 的数据包
1 |
|
截获主机 210.27.48.1 和主机 210.27.48.2 或 210.27.48.3 的通信
1 |
|
如果想要获取主机 210.27.48.1 除了和主机210.27.48.2之外所有主机通信的ip包:
1 |
|
监视所有送到主机hostname的数据包
1 |
|
获取主机 210.27.48.1 接收或发出的 telnet 包
23为telnet的端口
1 |
|
监视本机的udp 123 端口
1 |
|
使用tcpdump抓取HTTP包
1 |
|
0x4745
为”GET
“前两个字母”GE
“,0x4854
为”HTTP
“前两个字母”HT
“。
[20:2]
的含义:tcp 段中,前20个字节是tcp头部,后面才是真正的
playload
,也就是http
数据报文。而http
数据报文,起始部分是请求头或者响应头。请求头(
request line
) 是以GET / HTTP/1.1
这种格式开始的(因为是get请求,如果是post或者其他请求,就是不一样的),所以数据部分前两个字母是GE
。响应头(
response line
) 是以HTTP/1.1 200 OK
这种格式开始的,所以数据前两个字母是HT
。
tcpdump
对截获的数据并没有进行彻底解码,数据包内的大部分内容是使用十六进制的形式直接打印输出的。
显然这不利于分析网络故障,通常的解决办法是先使用带 -w
参数的tcpdump
截获数据并保存到文件中 ,然后再使用其他程序(如Wireshark
)进行解码分析。当然也应该定义过滤规则,以避免捕获的数据包填满整个硬盘。
查看数据包完成内容
tcpdump
默认不显示数据包的详细内容。
方法一
使用-A
参数能以ASCII
码显示数据包。
例:只抓取1个数据包,并显示其内容。
1 |
|
方法二
使用-X
参数能16进制数与ASCII
码共同显示数据包。
例:只抓取1个数据包,并显示其内容。
1 |
|
tcpdump 与wireshark
Wireshark
(以前是ethereal
)是Windows
下非常简单易用的抓包工具,现在也有Linux
版本。
通过Tcpdump
抓取的数据包分析比较麻烦,要想很方便的分析数据包, 我们可以用Tcpdump
+ Wireshark
的完美组合实现:在 Linux
里抓包,然后在 Windows
里分析包。
保存数据包为wireshark
能识别的文件:
1 |
|
参数 | 含义 |
---|---|
tcp | ip icmp arp rarp 和 tcp、udp、icmp这些选项等都要放到第一个参数的位置,用来过滤数据报的类型 |
-i eth1 | 只抓经过接口eth1的包 |
-t | 不显示时间戳 |
-s 0 | 抓取数据包时默认抓取长度为68字节。加上-S 0 后可以抓到完整的数据包 |
-c 100 | 只抓取100个数据包 |
dst port ! 22 | 不抓取目标端口是22的数据包 |
src net 192.168.1.0/24 | 数据包的源网络地址为192.168.1.0/24 |
-w ./target.cap | 保存成cap文件,方便用ethereal(即wireshark)分析 |