Linux中的网络抓包分析工具
一,Tcpdump
Linux tcpdump命令用于倾倒网络传输数据。执行tcpdump指令可列出经过指定网络界面的数据包文件头,可以将网络中传送的数据包的“头”完全截获下来提供分析。它支持针对网络层、协议、主机、网络或端口的过滤,并提供and、or、not等逻辑语句来帮助你摘取有用信息。
由于它需要将网络接口设置为混杂模式,普通用户不能正常执行,但具备root权限的用户可以直接执行它来获取网络上的信息。
二,格式
三,常用参数
常用参数 | 说明 |
-a | 尝试将网络和广播地址转换成名称 |
-c<数据包数目> | 收到指定的数据包数目后,就停止进行倾倒操作 |
-d | 把编译过的数据包编码转换成可阅读的格式,并倾倒到标准输出 |
-dd | 把编译过的数据包编码转换成C语言的格式,并倾倒到标准输出 |
-ddd | 把编译过的数据包编码转换成十进制数字的格式,并倾倒到标准输出 |
-e | 在每列倾倒资料上显示连接层级的文件头 |
-f | 用数字显示网际网络地址 |
-F<表达文件> | 指定内含表达方式的文件 |
-i<网络界面> | 使用指定的网络截面送出数据包 |
-l | 使用标准输出列的缓冲区 |
-n | 不把主机的网络地址转换成名字 |
-N | 不列出域名 |
-O | 不将数据包编码最佳化 |
-p | 不让网络界面进入混杂模式 |
-q | 快速输出,仅列出少数的传输协议信息 |
-r<数据包文件> | 从指定的文件读取数据包数据 |
-s<数据包大小> | 设置每个数据包的大小 |
-S | 用绝对而非相对数值列出TCP关联数 |
-t | 在每列倾倒资料上不显示时间戳记 |
-tt | 在每列倾倒资料上显示未经格式化的时间戳记 |
-T<数据包类型> | 强制将表达方式所指定的数据包转译成设置的数据包类型 |
-v | 详细显示指令执行过程 |
-vv | 更详细显示指令执行过程 |
-x | 用十六进制字码列出数据包资料 |
-w<数据包文件> | 把数据包数据写入指定的文件 |
四,tcpdump常用示例
查看当前机器有哪些网络接口
tcpdump输出内容解析(指定网卡过滤)
第一列:报文的时间
第二列:网络协议 IP
第三列:发送方的ip地址、端口号、域名,上图显示的是本机的域名,可通过/etc/hosts查看本机域名
第四列:箭头 >, 表示数据流向
第五列:接收方的ip地址、端口号、域名,上图中的112.80.248.75是百度的公网IP
第六列:冒号
第七列:数据包内容,报文头的摘要信息,有ttl、报文类型、标识值、序列等信息
tcpdump输出内容解析(指定ip过滤)
最基本也是最重要的信息就是数据报的源地址/端口和目的地址/端口,上面的例子第一条数据报中,源地址 ip 是
192.168.135.1
,源端口是 10679,目的地址是 192.168.135.100,目的端口是80
。>
符号代表数据的方向。此外,上面的三条数据还是 tcp 协议的三次握手过程,第一条就是
SYN
报文,这个可以通过Flags [S]
看出。下面是常见的 TCP 报文的 Flags:
[S]
: SYN(开始连接)[.]
: 没有 Flag[P]
: PSH(推送数据)[F]
: FIN (结束连接)[R]
: RST(重置连接)而第二条数据的
[S.]
表示SYN-ACK
,就是SYN
报文的应答报文。
五,tcpdump表达式
关于数据类型的关键字
包括host、port、net:
host 192.168.130.1表示一台主机,net 192.168.130.0表示一个网络网段,port 80 指明端口号为80,在这里如果没有指明数据类型,那么默认就是host
数据传输方向的关键字
包括src、dst、dst or src、dst and src,这些关键字指明了传输的方向,比如src 192.168.130.1说明数据包源地址是192.168.130.1。dst net 192.168.130.0指明目的网络地址是192.168.130.0,默认是监控主机对主机的src和dst,即默认监听本机和目标主机的所有数据。
协议关键字
包括ip、arp、rarp、udp
其他关键字
运算类型:or、and、not、!
辅助功能型:gateway、less、broadcast、greater
基于ip地址过滤
tcpdump host 192.168.135.100 -i ens33 -n -c 5
过滤关于192.168.135.100的包
tcpdump src host 192.168.135.100 -i ens33 -n -c 5
过滤源IP地址是192.168.135.100的包
tcpdump dst host 192.168.135.100 -i ens33 -n -c 5
过滤目的IP地址是192.168.135.100的包
基于端口进行过滤
tcpdump port 22 -i ens33 -n -c 5
过滤端口号为80即nginx协议的包
基于协议的过滤
tcpdump icmp -i ens33 -n -c 10
tcpdump host 192.168.130.151 and /(192.168.130.152 or 192.168.130.153/)
#捕获主机 192.168.130.151 和主机192.168.130.152或192.168.130.153的所有通信数据包
tcpdump ip host node9 and not www.baidu.com
#捕获主机node9与其他主机之间(不包括www.baidu.com)通信的ip数据包
tcpdump -i ens33 src node10
#捕获源主机node10发送的所有的经过ens33网卡的所有数据包
tcpdump -i ens33 dst host www.baidu.com
#捕获所有发送到主机www.baidu.com的数据包
tcpdump udp port 53
#监听本机udp的53端口的数据包,udp是dns协议的端口,这也是一个dns域名解析的完整过程