拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Brim与Zui协同安装指南:大流量pcap分析工作流实战

Brim与Zui协同安装指南:大流量pcap分析工作流实战

周四下午在客户现场,一个三四个G的pcap包摆在我面前,客户问能不能快速找出昨天的几条异常HTTP请求。Wireshark打开直接吃了8G内存,差点当场宕机。我当时用Brim配合Zui导入、预处理,再回到Brim里做可视化分析,前后不到十分钟就定位到了问题。从那时起,Brim加Zui这套组合就成了我处理流量分析的标准配置,不管是几G的小包还是上TB的采集数据,都能撑住。

标题里提到的“Brim与ZUI协同安装”,很多朋友看到会有个疑问:Brim不是已经被Zui替代了吗?为什么还要装两个?其实这俩是同一套数据引擎的不同产品形态,协同起来能兼顾桌面端操作体验和底层查询性能。这篇文章就从下载安装开始,一步步带你装完两个工具,再用实际流量包把分析链路完整走一遍,最后把我踩过的坑和排查思路都交代清楚。

1. 为什么要把Brim和Zui一起装:先搞清楚分工再下载

网上很多教程会把Brim和Zui说成“新老替代关系”,这个说法有些片面。它们确实是同一个团队做的,底层也共用同一套数据存储和查询引擎,但产品定位完全不是一回事。在动手安装之前,把二者的分工弄清楚,后面协同用起来才顺。

1.1 Brim并不是被淘汰了,它只是变成了桌面壳

还记得最早的Brim吗?一个基于Electron的桌面应用,最大的特点就是可以拖一个pcap进去,自动调用Zeek把原始流量转成结构化日志,然后直接拿类SQL语法去查询。对于单机分析和快速看包来说,那个交互界面至今依然很高效,拖拽、试错、看表格、点字段,整个流程都在图形界面里完成。

Brim的底层其实早就实现了数据湖(Zed lake)能力,只不过它的侧重点一直在“桌面体验”上,功能按钮都围绕高效浏览设计。我的使用感受是,Brim适合做交互式探索——你先在图形界面上灌入一个pcap,然后点几个字段看网络行为,再写几条查询验证猜想,这个过程特别顺手。大几千行的连接日志在Brim里翻起来比纯文本工具舒服得多。

1.2 Zui到底是什么东西

Zui(命令行里通常叫 zui)是同一个数据引擎的完整形态,可以理解成把Brim底层的查询引擎抽出来,做成了一组独立的命令行工具和服务端程序。主要包含三块能力:

  • 创建和管理数据湖(lake),也就是我们存放pcap、日志、数据的池子;
  • 高性能导入pcap或日志文件,直接把原始网络数据转换成列式存储;
  • 提供 Zed 查询语言服务,支持交互式命令行查询、REST API查询,还能以服务模式跑起来让其他客户端连接。

简单说,Zui是那个能扛大规模数据的“体力劳动者”,数据的导入、转换、海量查询由它负责;Brim是那个“门面担当”,帮你把数据变成看得见摸得着的表格和统计。二者协同,才是一个完整高效的流量分析工作流。

1.3 协同安装到底解决了什么问题

我实际工作中最常见的用法有三个,每个场景单独用Brim或单独用Zui都会不太顺手,配合起来就很理想:

  • 大pcap包先用Zui导入和预处理,形成lake后再用Brim打开,避免直接在Brim里导大包导致内存炸掉;
  • 远程服务器上用Docker跑一个Zui服务,本地Brim连接这个服务查数据,不用把所有原始包拉到本地;
  • 批量日志文件用Zui命令行完成清洗和转换,导出结果后用Brim做可视化确认。

三个场景的共同逻辑是:把“重活”交给Zui,把“细活”交给Brim。所以在下面的安装环节,我也会把两个工具装在同一台机器上,让它们在同一个目录下工作。

工具核心能力适合场景
Brim桌面图形界面、交互式浏览、快速查询、Zeek日志可视化单机分析、快速验证、日常看包
Zui命令行导入、列式存储、高吞吐查询、REST服务、Docker化部署大pcap预处理、远程分析、批量日志处理

2. 安装前的环境准备:版本、网络和依赖别搞错

安装步骤其实不难,但我在帮人排查时见过不少低级问题:版本选错、系统依赖缺、Brim启动后弹不出来、Zui命令行明明装了却说找不到命令。这些坑大多在安装前可以规避,所以环境准备阶段千万别跳过。

2.1 版本号怎么选

关于版本,我的建议是先确认你的机器是64位系统,然后到GitHub的官方Release页面找最新Release版本,而不是下载Nightly版本。Nightly版本虽新,但偶尔会有查询引擎改动导致Brim不兼容。

对Brim来说,它的最新稳定版通常能在 brimdata/brim 的Release页面找到;对Zui来说,要进 brimdata/zui 的Release页面下载。别在第三方“绿色版”站点下载,这些工具更新非常频繁,第三方包的版本往往滞后,而且安全风险不值当。

2.2 各操作系统的隐藏依赖

Windows:

Brim基于Electron,新版Windows通常自带WebView2运行时。如果你还在用比较老的Win10版本(比如LTSC),安装完Brim后双击可能没反应。这时可以去微软官网装WebView2运行库。这个问题比较隐蔽,因为Brim不会提示缺少依赖,你只会看到一个“点图标没动静”的现象。

macOS:

dmg安装包正常拖入Applications即可。如果首次打开提示“已损坏,无法打开”,通常是因为系统安全策略拦截了从网络下载的程序,执行下面这条命令解除隔离再打开:

xattr -d com.apple.quarantine /Applications/Brim.app

Linux:

Brim提供deb、rpm和AppImage三种格式。deb/rpm安装比较省心,依赖会自动处理;AppImage很便携,但要求系统有FUSE库,部分服务器最小化安装时没有这个库,启动时会报/dev/fuse相关错误,需要手动安装fuse。Ubuntu系执行:

sudo apt install fuse libfuse2

2.3 什么时候考虑用Docker

如果你和我一样,经常需要在Linux服务器、内网环境或临时容器里执行数据导入任务,那么用Docker跑Zui是非常扫平依赖的选择。本机上只需要有Docker环境即可,命令如下:

docker pull brimdata/zui:latest

镜像启动后,Zui服务会监听指定端口,你可以把宿主机的数据目录挂载到容器里,这样容器内生成的lake数据在宿主机上也能访问。后面第3.2节我会给出更完整的启动命令。

3. 一步一步装:Brim桌面端和Zui CLI都能跑起来

环境准备完了就可以正式安装。这一节我按“先装Brim桌面端,再装Zui命令行,最后让它们互相认识”的顺序推进,每一个步骤都按我实际成功的路径来写。

3.1 安装Brim桌面端

Brim桌面端的安装其实非常简单,真正的坑在“首次启动后”。

Windows

到GitHub Release页面下载最新的Brim-Setup.exe,双击安装。如果没有特别需求,保持默认路径即可。安装完不要急着导入pcap,先打开一次,让它初始化默认配置。如果打开后卡在启动界面很久,大概率是它正在联网下载运行时组件或Zeek引擎,保持网络畅通等一会儿。

macOS

下载Brim.dmg,打开后把Brim图标拖进Applications。首次启动时会弹窗要求允许应用运行,在“系统设置 -> 隐私与安全性”里点“仍要打开”即可。

Linux

我这边Ubuntu环境最常用的是deb包:

cd ~/Downloads sudo apt install ./Brim-*.deb

装完后在应用菜单里找到Brim启动。如果是AppImage方式,执行:

chmod +x Brim-*.AppImage ./Brim-*.AppImage

首次启动时Brim会在用户目录下创建数据目录,路径类似~/brim或~/Brim。这里有一个关键点:之后Zui创建的lake如果能放在同一个父级目录下,协同使用会更方便。我习惯把所有分析数据统一放到~/data/brim-zui/下,这样不管是Brim还是Zui,路径记忆成本都低。

3.2 安装Zui CLI的三种方式

Zui CLI的安装方式比Brim多,我分别试过包管理器、二进制包和Docker三种,这里把适用场景和踩坑点一起说。

方式一:Homebrew(macOS)

macOS用户如果有Homebrew,执行下面的命令最简洁:

brew install brimdata/tap/zui

这个tap源是官方维护的,版本更新速度不错。安装完成后在终端里执行zui version,应当能看到类似zui version v1.x.x的输出。

方式二:GitHub Release二进制包(Linux/macOS)

到brimdata/zui的Release页面下载对应系统的压缩包,比如Linux版文件名通常是zui_<版本>_Linux_x86_64.tar.gz。解压后把可执行文件放到PATH目录中:

mkdir -p ~/zui-bin tar -xzf zui_*_Linux_x86_64.tar.gz -C ~/zui-bin sudo ln -s ~/zui-bin/zui /usr/local/bin/zui sudo ln -s ~/zui-bin/zq /usr/local/bin/zq

注意Zui包通常同时提供zui和zq两个命令。zq是轻量级的Zed查询工具,可以和标准输入输出一起配合;zui则用来管理数据湖。两个都放到PATH里,后面都用到。

方式三:Docker容器

如果你要在一台没有GUI的服务器上跑Zui服务,优先用Docker:

mkdir -p ~/data/brim-zui/lake docker run -d --name zui \ -p 9867:9867 \ -v ~/data/brim-zui/lake:/lake \ brimdata/zui:latest \ zui serve -lake /lake -L :9867

起完容器后用docker logs zui能看到服务启动日志。设备宿主机上的~/data/brim-zui/lake就是实际存储lake数据的目录,后续Brim打开这个目录就能看到数据。

3.3 Brim和Zui的“握手”

两个工具都装好后,首次“握手”我推荐先从Brim端发起。

打开Brim,在菜单栏找“Open”或“Folder”入口,定位到Zui的数据lake目录,比如刚才Docker挂载的~/data/brim-zui/lake。如果Brim识别成功,左侧池子里会列出所有pools。此时Brim和Zui已经共享同一份数据目录了。

另一种握法是走网络连接:先在Zui端启动服务:

zui serve -lake ~/data/brim-zui/lake -L :9867

然后在Brim的“Connect to Lake”面板里填http://localhost:9867。这种方式的好处是不用管底层目录,只要网络通就能查,特别适合Brim跑在本机、Zui服务跑在远程服务器的场景。不过要注意,走网络时Brim目前主要适合查询和浏览,导入数据还是建议直接通过Zui完成,图形界面里的导入功能在高延迟网络下容易超时。

4. 第一次实战:哪个工具负责干活,哪个负责展示

装完总得用起来。这一节我带大家从零走一遍:造测试流量包、用Zui导入、用Brim浏览、再回到Zed查询。整个过程能直观看到“谁在干活、谁在展示”。

4.1 先造一份测试流量

手上暂时没有pcap文件的朋友,最方便的造数方式就是用tcpdump抓一段自己电脑的HTTP/DNS流量。终端执行:

sudo tcpdump -i any -w ~/data/brim-zui/test.pcap -s 0 'port 53 or port 80 or port 443' & sleep 20 sudo kill %1

等20秒期间,用浏览器正常访问几个网站,或者用curl发几条请求:

curl -I https://example.com curl http://example.com dig example.com @8.8.8.8

这样生成的test.pcap里就有了DNS和HTTP流量,足够后续练习。想用现成样本的,也可以到公开流量包站点找一些CTF赛题pcap或MIT林肯实验室的经典样本,下载下来分析。

4.2 用Zui导入pcap到lake

先创建一个全新的lake目录,命令如下:

zui lake create ~/data/brim-zui/lake

如果目录已存在,会提示已初始化,直接复用没问题。接着把test.pcap导入:

zui import -f pcap ~/data/brim-zui/test.pcap

首次导入时,它会对pcap按时间范围重新组织数据,同时在后台调用Zeek生成连接日志和协议日志。导入结束后执行:

zui query '* | count() by _path'

如果能看到类似下表这样的分组统计,说明pcap已经被成功解析成Zeek结构化日志:

_pathcount
conn236
dns112
http38
ssl41

这里要解释一下它经历了什么过程:原始流量先被Zeek按协议识别并拆解成日志,比如每个TCP连接会在conn日志里生成一条记录,每个DNS请求会在dns日志里生成一条记录;这些日志再以列式存储的形式落入lake,查询时只扫需要的列而不是整个文件,所以速度远快于直接读原始pcap。遇到几个GB的大包,Zui导入阶段的优势非常明显,慢没关系,导入完成后查询就是毫秒级响应。

4.3 用Brim打开同一份数据集

现在打开Brim,找到菜单里的“Open Folder”,输入~/data/brim-zui/lake,点确定。如果前面步骤都正确,Brim界面左侧会出现几个对象,对应刚才Zui导入后生成的池子。双击任意一个池子,Brim会加载出连接日志列表,字段包括时间戳、来源IP、目的IP、端口、协议等。

此时你可以在Brim顶部的查询框里输入同样的Zed查询:

* | count() by _path

点击执行,右侧会以表格形式展示结果。Brim的优势就在这:同样的数据,命令行里要看需要手动排字段,图形界面里点开就能浏览;对某个字段感兴趣,直接点排序,或选中某一条记录看详情面板。你会发现即使没有写一条查询,单纯看表格也能对网络流量有个初步概念。

5. 流量分析实战:从HTTP、DNS到VoIP录音定位

工具跑通了,真正有含金量的是查询思路。下面三个实战场景,难度从基础到进阶,覆盖了大多数流量分析工作的核心需求。

5.1 快速摸清流量画像

不管是分析自己抓的包还是处理CTF赛题,第一步永远是“先看总体画像”。在Brim或Zui里执行:

* | count() by _path

得到每种日志条目的数量分布,能告诉我们流量里大部分是什么类型。接着按来源和目的IP统计:

* | count() by id.orig_h, id.resp_h | sort -count

如果回答“哪个主机是流量最大的发起者”这类问题,这一条就够用。注意Zed语言里sort默认升序,加-count才是降序。这个细节很容易被忽略,我第一次用的时候没加,结果最想看的IP排到了最底下。

5.2 分析HTTP请求与DNS解析

比如怀疑某个内网主机在探测外网域名,先查dns日志:

_path=="dns" | count() by query | sort -count

如果看到出现频率明显异常的域名,比如大量随机子域名,很可能就是DGA域名。再跟进连接日志:

_path=="conn" | id.orig_h==192.168.1.100 | sort ts

这条查询能把这个IP所有连接按时间展开。结合HTTP日志:

_path=="http" | cut ts, id.orig_h, id.resp_h, method, uri, status_code

cut的作用和SQL里的select差不多,只保留关心的字段,大幅减少干扰信息。我发现配合Brim界面浏览时,每一步查询结果都能在视图里继续点选字段做二次筛选,排查进程顺畅很多。

5.3 VoIP场景:从SIP日志定位通话并提取录音

这里接住一个很多朋友都在搜的需求:流量分析里抓到VoIP数据包后,怎么还原出来通话录音。要注意,只有在对你自己系统进行测试,或者拿到合法授权、比赛赛题里明确允许的前提下才可以做还原操作,不要拿这套方法去碰没有授权的流量。

先查SIP协议日志,定位一次SIP呼叫:

_path=="sip" | sort ts | cut ts, call_id, from, to, user_agent

在结果里找到INVITE请求对应的call_id和时间段。接着用那段时间窗口过滤RTP流,通常是在Wireshark里按刚才的时间窗口和两端IP做过滤,通过“Telephony -> VoIP Calls”菜单找到对应呼叫,选中后点击“Play”就能听并导出通话录音。如果单纯在Brim/Zui环境中操作,也可以用Zeek直接解析RTP,但流程会更长,一般还是建议和Wireshark配合定位和取流。

这个场景的关键是:先通过Brim快速定位到可疑呼叫的大致时间点,再用Wireshark做精细提取。两个工具互相配合,比用单个工具从头查到尾效率高很多。

6. 协同安装和使用的常见坑,帮你在20分钟内搞定

最后这部分,我把自己和身边朋友在Brim与Zui协同安装过程中踩过的高频问题整理成清单。如果你在安装后遇到奇怪现象,先按这几个方向排查。

6.1 Brim双击无反应或Linux AppImage打不开

这问题八成出在WebView2或FUSE依赖上,不考虑其他原因。Windows用户先检查WebView2运行库是否安装;Linux用户确认FUSE可用,执行:

fusermount --version

如果提示找不到命令,就按第2.2节补装。还有一个比较隐蔽的点:AppImage文件放在挂载了noexec属性的分区上也会启动失败,把它复制到~/AppImages目录再试。

6.2 Zui导入pcap时报错或导入结果为空

导入时报错先看文件权限,确认pcap文件可读。导入结果为空则要确认pcap确实是完整抓包,icmpv6或非标准端口流量不一定能生成丰富的日志。早期版本的Zeek对某些UDP流量的解析时间比较长,耐心等待即可,不要中途Ctrl+C中断导入任务,中断极有可能留下一个不完整的lake目录。

6.3 Zui lake权限问题导致Brim打不开

用Docker跑Zui时,容器内进程默认以root运行,会在挂载目录里生成root所有制的文件。宿主机上Brim以普通用户打开这些文件就可能报权限拒绝。解决办法是启动容器时指定当前用户ID:

docker run -d --name zui \ -p 9867:9867 \ -u $(id -u):$(id -g) \ -v ~/data/brim-zui/lake:/lake \ brimdata/zui:latest \ zui serve -lake /lake -L :9867

这样容器内生成的lake文件归当前用户所有,Brim打开时不会再被权限卡住。

6.4 大pcap直接拖进Brim,内存起飞

我的建议是大于500MB的pcap一律不要直接拖进Brim,先交给Zui导入成lake,再用Brim打开lake目录。否则Brim在内存里组织数据时很容易吃满内存,界面卡死,只能强杀进程。按4.2节的流程走一遍,整个过程平稳很多。

6.5 版本不匹配的小贴士

Brim某个旧版本打开新版本Zui创建的lake时,偶尔会提示格式不支持。最稳妥的方案是同时更新:升级Brim的时候,顺手把Zui CLI也升到同期的Release版本,不要只升其中一个。

我现在的日常节奏是:pcap落盘后先跑一条Zui导入命令,接着打开Brim去看结果。整套流程从下载安装到分析跑通,熟练之后20分钟完全够用。这篇文章里所有命令和查询语法,都来自实际踩坑后的稳定版本,你按顺序执行,应该能避开绝大多数新手问题。如果装完之后还有奇怪报错,建议先看官方Release页面的Issue区,很多启动类问题在GitHub上都有现成解决方案。

返回列表