网站搜索

ngrep - 适用于 Linux 的网络数据包分析器


Ngrep (network grep) 是一个简单但功能强大的网络数据包分析器。它是一个类似 grep 的工具,应用于网络层 – 它匹配通过网络接口的流量。它允许您指定扩展的正则或十六进制表达式来匹配数据包的数据有效负载(传输数据中的实际信息或消息,但不是自动生成的元数据)。

该工具适用于各种类型的协议,包括 IPv4/6、TCP、UDP、ICMPv4/6、IGMP 以及许多接口上的 Raw。它的操作方式与 tcpdump 数据包嗅探工具相同。

可以使用包管理工具从主流 Linux 发行版的默认系统存储库中安装包 ngrep,如图所示。

sudo apt install ngrep
sudo yum install ngrep
sudo dnf install ngrep

安装 ngrep 后,您可以使用以下示例开始分析 Linux 网络上的流量。

1.以下命令将帮助您匹配默认工作接口上的所有 ping 请求。您需要打开另一个终端并尝试 ping 另一台远程计算机。 -q 标志告诉 ngrep 安静地工作,除了数据包标头及其有效负载之外不输出任何信息。

sudo ngrep -q '.' 'icmp'

interface: enp0s3 (192.168.0.0/255.255.255.0)
filter: ( icmp ) and ((ip || ip6) || (vlan && (ip || ip6)))
match: .

I 192.168.0.104 -> 192.168.0.103 8:0
  ]...~oG[....j....................... !"#$%&'()*+,-./01234567                                                                                                             

I 192.168.0.103 -> 192.168.0.104 0:0
  ]...~oG[....j....................... !"#$%&'()*+,-./01234567                                                                                                             

I 192.168.0.104 -> 192.168.0.103 8:0
  ]....oG[............................ !"#$%&'()*+,-./01234567                                                                                                             

I 192.168.0.103 -> 192.168.0.104 0:0
  ]....oG[............................ !"#$%&'()*+,-./01234567  

您可以按 Ctrl + C 来终止它。

2. 要仅匹配前往特定目标网站(例如 “google.com”)的流量,请运行以下命令,然后尝试从浏览器访问它。

sudo ngrep -q '.' 'host google.com'

interface: enp0s3 (192.168.0.0/255.255.255.0)
filter: ( host google.com ) and ((ip || ip6) || (vlan && (ip || ip6)))
match: .

T 172.217.160.174:443 -> 192.168.0.103:54008 [AP]
  ..................;.(...RZr..$....s=..l.Q+R.U..4..g.j..I,.l..:{y.a,....C{5>[email ..                                                                       

T 172.217.160.174:443 -> 192.168.0.103:54008 [AP]
  .............l.......!,0hJ....0.%F..!...l|.........PL..X...t..T.2DC..... ..y...~Y;[email 

3.如果您正在网上冲浪,请运行以下命令来监视您的浏览器正在请求哪些文件:。

sudo ngrep -q '^GET .* HTTP/1.[01]'

interface: enp0s3 (192.168.0.0/255.255.255.0)
filter: ((ip || ip6) || (vlan && (ip || ip6)))
match: ^GET .* HTTP/1.[01]

T 192.168.0.104:43040 -> 172.217.160.174:80 [AP]
  GET / HTTP/1.1..Host: google.com..User-Agent: Links (2.13; Linux 4.17.6-1.el7.elrepo.x86_64 x86_64; 
  GNU C 4.8.5; text)..Accept: */*..Accept-Language: en,*;q=0.1..Accept-
  Encoding: gzip, deflate, bzip2..Accept-Charset: us-ascii,ISO-8859-1,ISO-8859-2,ISO-8859-3,ISO-8859-4,
  ISO-8859-5,ISO-8859-6,ISO-8859-7,ISO-8859-8,ISO-8859-9,ISO-8859-10,I
  SO-8859-13,ISO-8859-14,ISO-8859-15,ISO-8859-16,windows-1250,windows-1251,windows-1252,windows-1256,
  windows-1257,cp437,cp737,cp850,cp852,cp866,x-cp866-u,x-mac,x-mac-ce,x-
  kam-cs,koi8-r,koi8-u,koi8-ru,TCVN-5712,VISCII,utf-8..Connection: keep-alive.... 

4. 要查看跨源或目标端口 25 (SMTP) 的所有活动,请运行以下命令。

sudo ngrep port 25

5. 要监视任何基于网络的系统日志流量是否出现单词“错误”,请使用以下命令。

 
sudo ngrep -d any 'error' port 514

重要的是,该工具可以将“/etc/services”(在Linux等类Unix系统上)中存储的服务端口名称转换为端口号。该命令与上面的命令等效。

sudo ngrep -d any 'error' port syslog

6. 您还可以针对 HTTP 服务器(端口 80)运行 ngrep,它将匹配对目标主机的所有请求,如图所示。

sudo ngrep port 80

interface: eth0 (64.90.164.72/255.255.255.252)
filter: ip and ( port 80 )
####
T 67.169.59.38:42167 -> 64.90.164.74:80 [AP]
  GET / HTTP/1.1..User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i
  686) Opera 7.21  [en]..Host: www.darkridge.com..Accept: text/html, applicat
  ion/xml;q=0.9, application/xhtml+xml;q=0.9, image/png, image/jpeg, image/gi
  f, image/x-xbitmap, */*;q=0.1..Accept-Charset: iso-8859-1, utf-8, utf-16, *
  ;q=0.1..Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0..Cookie: SQ
  MSESSID=5272f9ae21c07eca4dfd75f9a3cda22e..Cookie2: $Version=1..Connection:
  Keep-Alive, TE..TE: deflate, gzip, chunked, identity, trailers....
##

正如您在上面的输出中看到的,所有 HTTP 标头传输都以详细的方式显示。但它很难解析,所以让我们看看当您应用 -W byline 模式时会发生什么。

sudo ngrep -W byline port 80

interface: eth0 (64.90.164.72/255.255.255.252)
filter: ip and ( port 80 )
####
T 67.169.59.38:42177 -> 64.90.164.74:80 [AP]
GET / HTTP/1.1.
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; X11; Linux i686) Opera ...
Host: www.darkridge.com.
Accept: text/html, application/xml;q=0.9, application/xhtml+xml;q=0.9 ...
Accept-Charset: iso-8859-1, utf-8, utf-16, *;q=0.1.
Accept-Encoding: deflate, gzip, x-gzip, identity, *;q=0.
Cookie: SQMSESSID=5272f9ae21c07eca4dfd75f9a3cda22e.
Cookie2: $Version=1.
Cache-Control: no-cache.
Connection: Keep-Alive, TE.
TE: deflate, gzip, chunked, identity, trailers.

7. 每次匹配数据包时,以 YYYY/MM/DD HH:MM:SS.UUUUUU 的形式打印时间戳,使用-t标志。

sudo ngrep -t -W byline port 80

interface: enp0s3 (192.168.0.0/255.255.255.0)
filter: ( port 80 ) and ((ip || ip6) || (vlan && (ip || ip6)))
####
T 2018/07/12 16:33:19.348084 192.168.0.104:43048 -> 172.217.160.174:80 [AP]
GET / HTTP/1.1.
Host: google.com.
User-Agent: Links (2.13; Linux 4.17.6-1.el7.elrepo.x86_64 x86_64; GNU C 4.8.5; text).
Accept: */*.
Accept-Language: en,*;q=0.1.
Accept-Encoding: gzip, deflate, bzip2.
Accept-Charset: us-ascii,ISO-8859-1,ISO-8859-2,ISO-8859-3,ISO-8859-4,ISO-8859-5,utf-8.
Connection: keep-alive.

8. 为了避免将受监控的接口置于混杂模式(拦截并读取完整到达的每个网络数据包),请添加 -p 标志。

sudo ngrep -p -W byline port 80

9.另一个重要的选项是-N,它在您观察原始或未知协议时非常有用。它告诉 ngrep 显示子协议号以及单字符标识符。

sudo ngrep -N -W byline

有关详细信息,请参阅 ngrep 手册页。

man ngrep

ngrep Github 存储库:https://github.com/jpr5/ngrep

就这样! Ngrep (network grep) 是一个网络数据包分析器,它以与 tcpdump 相同的方式理解 BPF 过滤器逻辑。我们想在评论部分了解您对 ngrep 的看法。