☰
Linux 命令大全之 ngrep:面向数据包的网络版 grep 抓包搜索工具实战指南
2026/10/2 1:51:40 网站建设 项目流程
  • 文档
  • 教程

【免费下载链接】linux-command

Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux

项目地址:https://gitcode.com/GitHub_Trending/linux/linux-command
点击查看免费下载

本篇指南基于 linux-command 仓库中的 ngrep 命令文档 展开,系统讲解 ngrep 的安装、语法、全部选项与真实抓包场景。读完你可以掌握:如何在 Linux 上从源码编译安装 ngrep,如何用类 grep 的正则表达式在实时流量中搜寻指定数据包,如何借助-W byline、-d、-t、-N等参数完成 HTTP 请求/响应、Flash 视频地址等实战抓取,并理解其与 libpcap、BPF 过滤器的关系。

什么是 ngrep:grep 的网络版

ngrep(network grep)是 grep 命令的网络版,它力求继承 grep 的多数特征,用于在实时网络流量中搜寻指定的数据包。简单来说,grep 在文本文件里做正则匹配,而 ngrep 在网卡上流过的数据包里做正则匹配。

ngrep 之所以能做到这一点,是因为它依赖libpcap库工作。libpcap 是 Linux 平台上最经典的抓包库,同样被 tcpdump 命令 所依赖。正因如此,ngrep 得以支持大量的操作系统和网络协议:它能识别TCP、UDP 和 ICMP包,并且理解BPF(Berkeley Packet Filter)过滤机制——这正是 tcpdump 抓包过滤表达式的底层引擎。

在本仓库中,ngrep 属于网络通讯类命令的范畴,与 tcpdump、netstat、ping、nc 等工具并列,是网络排障与安全分析中"按内容找包"的利器:tcpdump 擅长按主机、端口、协议过滤包,而 ngrep 更进一步,可以按包内的字符串内容(如 URL、关键字)匹配并展示整段报文。

安装 ngrep:libpcap 与源码编译

ngrep 的核心依赖是 libpcap,因此安装分两步:先装好 libpcap,再编译安装 ngrep 本体。

第一步:安装 libpcap

在 Red Hat 系发行版上,最简单的做法是直接用包管理器安装:

yum install libpcap

需要注意:有时候用 libpcap 安装包装出来的库不完整,会直接影响 ngrep 的正常使用。如果 yum 无法安装,或安装后 ngrep 报错,建议采用源码编译方式安装 libpcap:

wget http://www.tcpdump.org/release/libpcap-1.3.0.tar.gz tar -zxf libpcap-1.3.0.tar.gz cd libpcap-1.3.0 ./configure make && make install

第二步:编译安装 ngrep

ngrep 本身的安装就是经典的 configure / make / make install 三部曲:

./configure make make install

常见问题:pcap 头文件路径

在 configure 阶段如果遇到please wipe out all unused pcap installations之类的报错,说明系统中存在多个 libpcap 安装,configure 无法判断使用哪一个。此时需要显式指定 pcap 头文件的安装路径,常见写法如下:

./configure --with-pcap-includes=/usr/local/include/pcap

安装完成后,直接在终端输入ngrep即可验证安装是否成功——能正常输出网卡接口和启动信息,说明安装无误。

语法与命令行结构

ngrep 的完整语法如下:

ngrep <-LhNXViwqpevxlDtTRM> <-IO pcap_dump> <-n num> <-d dev> <-A num> <-s snaplen> <-S limitlen> <-w normal|byline|single|none> <-c cols> <-P char> <-F file> <match expression> <bpf filter>

语法结构可以拆解为三个层次:

  1. 选项区:尖括号内是可选的命令行选项,控制显示格式、匹配行为、抓包数量等;
  2. match expression(匹配表达式):这是 ngrep 的核心,使用类 grep 的正则表达式去匹配数据包内容,例如\.flv匹配包含.flv字符串的包;
  3. bpf filter(BPF 过滤器):可选,使用 tcpdump 风格的过滤表达式,例如tcp port 18080,只让符合条件的包进入匹配流程。

三者同时使用时,先由 BPF 过滤器做粗粒度筛选(按协议、端口、主机),再由正则匹配表达式做内容级筛选,最后按选项要求的格式输出。这与 grep 的"先选文件、再匹配内容"思路一脉相承。

选项速查表

ngrep 的选项分为几类,下面逐一说明:

匹配行为类

-e # 显示空数据包 -i # 忽略大小写 -v # 反转匹配(不匹配指定模式的数据包才会显示) -w # 整字匹配 -x # 以16进制格式显示 -X # 以16进制格式匹配 -N # 显示由 IANA 定义的子协议号 -M # 仅进行单行匹配

其中-N在分析未知协议时非常有用:它会输出数据包所属的 IANA 子协议编号,便于判断应用层协议类型。

时间与输出格式类

-t # 在每个匹配的包之前显示时间戳 -T # 显示上一个匹配的数据包之间的时间间隔 -W # 设置显示格式,byline 将解析包中的换行符 -c # 强制显示列的宽度 -P # 设置不可打印字符的显示字符 -l # 使标准输出行缓冲(make stdout line buffered) -q # 静默输出(仅打印匹配到的包,不打印接口、match 等头信息)

-W byline是最常用的可读性参数:默认情况下 ngrep 会把包内所有数据连续打印成一行,换行符也被当作普通字节,导致 HTTP 报文可读性极差;加上-W byline后,ngrep 会解析包内的换行符,把 HTTP 请求/响应的每一行(请求行、Header、空行)分行显示。

抓包控制类

-d # 使用哪个网卡,可以用 -L 选项查询 -L # 查询网卡接口 -p # 不使用混杂模式 -n # 仅捕获指定数目的数据包进行查看 -A # 匹配到数据包后 dump 随后的指定数目的数据包 -s # 设置 bpf 的 caplen(抓取长度) -S # 设置匹配包上的 limitlen(显示长度上限)

-d any可以同时监听所有网卡;-A num类似 grep 的-A(after context),匹配到目标包后继续显示后续 num 个包,非常适合追踪一次请求引发的后续数据包。

文件读写与权限类

-I # 从文件中读取数据进行匹配 -O # 将匹配的数据保存到文件 -F # 使用文件中定义的 bpf(Berkeley Packet Filter) -D # 按 pcap_dump 文件记录的原始时间间隔回放数据包 -R # 不做权限降级逻辑(don't do privilege revocation logic)

-I/-O让 ngrep 也能像 tcpdump 一样离线分析 pcap 文件:先用 tcpdump 或 ngrep-O抓包落盘,再用-I慢慢分析,避免线上长时间占用终端。-D则用于按原始时间间隔回放抓包文件,还原现场。

通配说明

上表中的-Lh组合里,-h用于显示帮助信息;其余选项的英文描述(如-R、-D、-s、-S、-P、-l)在帮助输出中即为原文,中文注释为补充解释。

实战一:捕捉指定端口的 HTTP 请求与响应

最常见的场景是在开发调试时,查看本机某个服务端口上进出站的 HTTP 报文。以监听本机18080端口为例:

ngrep -W byline -d lo port 18080
  • -W byline:解析包中的换行符,否则包内所有数据都是连续的,可读性差;
  • -d lo:监听本地回环网卡(loopback),本机进程间通信的流量都走 lo;
  • port 18080:BPF 过滤器,只匹配 TCP/UDP 端口为 18080 的包。

如果要监听对外网卡上的 Web 流量(比如本机对外提供 80 端口服务),把网卡换成对外网卡即可:

ngrep -W byline -d eth0 port 80

注意网卡名称在不同发行版/虚拟化环境可能不同(如eth0、ens33、enp0s3),可以先运行ngrep -L查看本机可用的网卡列表再指定。

如果不确定流量走哪张网卡,可以用-d any捕获所有网卡的包,再叠加过滤条件:

ngrep '[a-zA-Z]' -t -W byline -d any tcp port 18080

这条命令同时演示了三个要素的组合用法:

  • '[a-zA-Z]':正则匹配表达式,只匹配包含字母的包,过滤掉纯二进制的噪声包;
  • -t:在每个匹配的包前显示时间戳,便于观察请求时序;
  • -d any+tcp port 18080:先按协议(TCP)和端口(18080)粗筛,再做内容匹配。

实战二:从实时流量中提取 Flash 视频下载地址

ngrep 一个非常经典的用途:在浏览网页时,从网络流量中实时抓取视频、图片等资源的真实下载 URL。

例如要捕获包含字符串.flv的数据包(Web Flash 视频文件的下载地址通常就藏在 GET 请求里),可以执行:

ngrep -d3 -N -q \.flv

启动后 ngrep 会先打印当前使用的网卡接口和匹配表达式,例如:

interface: \Device\TNT_40_1_{670F6B50-0A13-4BAB-9D9E-994A833F5BA9} (10.132.0.0/255.255.192.0) match: \.flv

这条命令用到了三个关键参数:

  • -d3:监听编号为 3 的网卡接口(不同平台编号规则不同,Windows 上会显示为\Device\TNT_40_1_...这样的 GUID 名称);
  • -N:显示由 IANA 定义的子协议号,帮助识别应用层协议;
  • -q:静默模式,只输出匹配到的数据包正文,不打印接口和 match 头信息,减少干扰。

此时打开一个视频播放页面,ngrep 会立刻捕获到携带.flv关键字的 HTTP GET 请求:

T(6) 10.132.34.23:24860 -> 61.142.208.154:80 [AP] GET /f59.c31.56.com/flvdownload/12/19/ggyg7741@56.com_56flv_zhajm_11955697397.flv HTTP/1.1..accept: */*..Referer: http://www.56.com/flashApp/v_player_site.swf..x-flash-version: 9,0,45,0..UA-CPU: x86..Accept-Encoding: gzip, deflate..User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30)..host: f59.r.56.com..Connection: Keep-Alive..Cookie: whistoryview=23423759-23635627-23423344-23171935-23058374-23081156-23207350-22395727-; geoip=............; wl_all_s=y....

逐字段解读这段输出:

  • T(6):-t类时间戳信息,括号内数值与抓包时间处理相关;
  • 10.132.34.23:24860 -> 61.142.208.154:80:源地址端口到目的地址端口,说明这是本机发出的、发往对端 80 端口的请求;
  • [AP]:TCP 标志位标记,A 表示 ACK、P 表示 PUSH,说明这是携带数据的确认包;
  • GET /f59.c31.56.com/.../....flv HTTP/1.1:请求行,.flv文件的完整路径就在其中;
  • 后续的accept、Referer、User-Agent、host、Cookie等是 HTTP 请求头,注意默认输出下它们之间以..分隔——这正是换行符未被解析的表现。

至此地址已经找到:http://f59.c31.56.com/flvdownload/12/19/ggyg7741@56.com_56flv_zhajm_11955697397.flv。

实战三:加 -W byline 提升可读性

默认输出把换行符显示为..,整段 Header 挤在一行里难以阅读。加上-W byline参数后,ngrep 会解析包内的换行符,输出变成按行展示的标准 HTTP 报文:

T(6) 2007/11/25 15:56:12.192619 10.132.34.23:26365 -> 59.151.21.101:80 [AP] GET /aa.flv HTTP/1.1. Accept: */*. Accept-Language: zh-cn. UA-CPU: x86. Accept-Encoding: gzip, deflate. User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30). Host: www.google.cn. Connection: Keep-Alive. Cookie: PREF=id=a0b2932c336477e9:TB=4:NW=1:TM=1187877372:LM=1187956074:S=Y1FzndprT3vFo7ac; SID=DQAAAHcAAABJCEXeOVLHu2rIfb5BfKP3GG9PbhJDEkXsLTV8y0f_lvSd2Y46Q0FPt83CnEs9rxA1xBDM9mLR8-ckWeScyOQA8PyYnX5u5OjFvjfRbDg_FDZfwxhRzqS9KPZv26pjnsUxs0FDM1xpJ5AgDn38pXtlCdkksJ0-cbiIWoA61oHWMg; NID=7=AvJxn5B6YOLLxoYz4LLzhIbNsQUQiulRS6UJGxdBniQBmXm99y7L-NBNORN82N3unmZSGHFPfePVHnLK2MjYjglyXZhU9x7ETXNBnY3NurNijHDhJ7Kyi7E53UBOcv4V.

对比默认输出可以看到:

  • 行首时间戳升级为完整格式:2007/11/25 15:56:12.192619,精确到微秒;
  • 每个 Header 独占一行,句尾的.即原包中的\r\n换行符解析结果;
  • 请求行、各请求头、Cookie 一目了然,适合直接阅读和复制分析。

与 grep、tcpdump 的配合与区别

  • grep:处理的是文本文件/命令输出,在 linux-command 仓库中对应 grep 命令文档。它支持-i(忽略大小写)、-v(反转)、-w(整词)、-A/-B/-C(上下文行)等;ngrep 借鉴了其中大部分语义(-i、-v、-w、-A),但作用对象从"行"变成了"网络数据包"。
  • tcpdump:处理的是网络数据包,对应仓库中的 tcpdump 命令文档,按主机、端口、协议等 BPF 表达式过滤,输出包头信息;ngrep 同样内置 BPF 过滤器(port 18080、tcp port 18080写法一致),但额外提供包内容正则匹配和可读的报文正文展示(-W byline),适合直接在流量里找关键字、看请求内容。

实际排障时可以组合使用:先用 tcpdump 确认流量存在与包方向,再用 ngrep 匹配具体内容;或先用 tcpdump-w落盘抓包,再用 ngrep-I离线分析,互不冲突。

常见问题与注意事项

  1. 权限问题:抓包通常需要 root 权限,若提示网卡无法打开,请用sudo或 root 用户执行;-R选项用于控制是否执行权限降级逻辑。
  2. 网卡选择:不确定用哪张网卡时,先ngrep -L列出所有接口;本机通信用-d lo,对外流量用-d eth0或-d any。
  3. 正则转义:匹配点号等特殊字符时要转义,如\.flv;在 shell 中最好用单引号包裹表达式,防止[a-zA-Z]这类字符被 shell 展开。
  4. 可读性:观察 HTTP 这类按行组织的文本协议时,务必加-W byline,否则包内数据会连成一行。
  5. 依赖完整性:libpcap 安装不完整是 ngrep 无法正常工作的常见原因,遇到 configure 报please wipe out all unused pcap installations时,按上文用--with-pcap-includes指定头文件路径重新 configure 即可。
  6. 离线分析:需要长时间抓包时,用-O将匹配数据保存为 pcap 文件,之后再通过-I读取分析,或配合-D按原始时间间隔回放。

延伸阅读

  • 本文原始出处为仓库中的 command/ngrep.md,可在 linux-command 仓库(通过 npm 安装linux-command包 或直接浏览 command 目录)中查阅。
  • 相关工具文档:tcpdump 抓包命令、grep 文本搜索命令、netstat 网络状态命令、nc 网络工具。
  • 仓库还提供了完整的 命令贡献规范,如需补充 ngrep 更多实例,可参照其中的文档格式约定提交。
  • 文档
  • 教程

【免费下载链接】linux-command

Linux命令大全搜索工具,内容包含Linux命令手册、详解、学习、搜集。https://git.io/linux

项目地址:https://gitcode.com/GitHub_Trending/linux/linux-command
点击查看免费下载
上一篇:如何掌握房间布局估计技术:Awesome Scene Understanding中的核心算法论文完全指南
下一篇:XiangShan XSPdb 反汇编子系统解析:spike-dasm/capstone 双引擎、四类内存区域反汇编与缓存机制

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询