做后台开发,经常需要抓取数据包,查看数据流量是否正常,在windows上可以使用Wireshark,是一个网络封包分析软件,使用WinPCAP作为接口,直接与网卡进行数据报文交换。而Linux下使用tcpdump或者ngrep。这里介绍如何使用ngrep。

使用ngrep抓包可以确定数据包是否已经到了某个服务模块,从而定位是哪个部分的问题。

ngrep介绍及安装

ngrep是一个网络抓包工具,可以用来侦听各端口的数据流入和流出。来看看man手册是如何介绍ngrep的:

DESCRIPTION
ngrep strives to provide most of GNU grep's common features, applying them to the network layer.  ngrep is a pcap-aware tool
that  will allow you to specify extended regular expressions to match against data payloads of packets.  It currently recog‐
nizes TCP, UDP and ICMP across Ethernet, PPP, SLIP, FDDI and null interfaces, and understands bpf filter logic in  the  same
fashion as more common packet sniffing tools.

大概的意思:

ngrep努力提供GNU grep的大多数通用功能,并将其应用于网络层。 ngrep是可识别pcap的工具,可让您指定扩展的正则表达式以与数据包的数据有效载荷匹配。 目前,它可以识别以太网,PPP,SLIP,FDDI和空接口上的TCP,UDP和ICMP,并以与更常见的数据包嗅探工具相同的方式理解bpf过滤器逻辑

Centos7安装ngrep

在安装ngrep之前,必须要在自己的设备上安装libpacp

yum install libpcap libpcap-devel -y

由于安装ngrep需用到libpcap库, 所以支持大量的操作系统和网络协议。最后再安装

yum  install  ngrep

安装完之后,输入ngrep来验证下安装是否成功。

Linux系统wireshark抓包 linux网络抓包工具_16进制

出来这界面表示安装成功。

ngrep选项说明:

-e # 显示空数据包
-i # 忽略大小写
-v # 反转匹配
-x # 以16进制格式显示
-X # 以16进制格式匹配
-w # 整字匹配
-p # 不使用混杂模式
-l #使标准输出行缓冲
-D # 用记录的时间间隔重播pcap_dumps
-t # 在每个匹配的包之前显示时间戳
-T # 显示上一个匹配的数据包之间的时间间隔
-M # 仅进行单行匹配
-I # 从文件中读取数据进行匹配
-O # 将匹配的数据保存到文件
-n # 仅捕获指定数目的数据包进行查看
-A # 匹配到数据包后dump随后的指定数目的数据包
-s # 设置bpf caplen
-S # 在匹配的数据包上设置limitlen
-W # 设置显示格式byline将解析包中的换行符
-c # 强制显示列的宽度
-P #将不可打印的显示字符设置为指定的值
-F # 使用文件中定义的bpf(Berkeley Packet Filter)
-N # 显示由IANA定义的子协议号
-d # 使用哪个网卡,可以用-L选项查询
-L # 查询网卡接口

简单使用

首先我们可以模拟一个请求

curl -s “www.baidu.com”

Linux系统wireshark抓包 linux网络抓包工具_抓包_02

监听指定本地网络接口的数据包

ngrep -d ens33

抓包结果:

Linux系统wireshark抓包 linux网络抓包工具_抓包_03

可以看到,结果是抓到了www.baidu.com数据流。但是内容没有完整显示出来。ip表示 :183.232.231.172是百度的ip。端口为80

支持换行符

内容要完整显示,其示就是把换行符展示出来。
首先在另一个终端输入请求:

curl -s “www.baidu.com”

然后在另一个终端输入:

ngrep -W byline -d ens33 port 80

这条命令就是用来侦听网页的request和response,注意需要以管理员身份运行.必须是root用户。

抓包结果:

Linux系统wireshark抓包 linux网络抓包工具_抓包_04


Linux系统wireshark抓包 linux网络抓包工具_抓包_05

W byline是指遇到换行符时换行显示,否则数据是连续的不可读。-d ens33是指侦听ens33网卡。port 80是指侦听80端口。

抓本机网卡与ip

抓本机eth0 与192.168.32.229的通信信息,并且以行来打印出来

ngrep -d ens33 -W byline host 192.168.32.229

抓ssh包

要使用 grep 命令在 Linux 中查找指定服务的默认端口号,只需运行

grep ssh /etc/services

Linux系统wireshark抓包 linux网络抓包工具_换行符_06


正如你在上面的输出中所看到的,SSH 服务的默认端口号是 22。抓包结果:

Linux系统wireshark抓包 linux网络抓包工具_16进制_07

正则过滤

上面的包其实太多了,怎么只抓 baidu的包呢,通过 -q 参数。

ngrep -Wbyline -d ens33 -q baidu port 80

Linux系统wireshark抓包 linux网络抓包工具_换行符_08

ngrep -Wbyline -d ens33 ‘GET /’ port 80

-d使用哪个网卡,可以用-L选项查询,

Linux系统wireshark抓包 linux网络抓包工具_16进制_09

十六进制显示

如果需要具体调试包中的 bytes,想看到 16 进制的数,怎么办呢?只需输入如下命令:

ngrep -x -d ens33 -q baidu port 80

-x 以16进制格式显示。抓包结果:

Linux系统wireshark抓包 linux网络抓包工具_抓包_10

总结

ngrep工具是grep命令的网络版,ngrep用于抓包,并可以通过正则表达式,过滤、获取指定样式的数据包。

使用ngrep抓包可以确定数据包是否已经到了某个服务模块,从而定位是哪个部分的问题。