周四下午在客户现场,一个三四个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.appLinux:
Brim提供deb、rpm和AppImage三种格式。deb/rpm安装比较省心,依赖会自动处理;AppImage很便携,但要求系统有FUSE库,部分服务器最小化安装时没有这个库,启动时会报/dev/fuse相关错误,需要手动安装fuse。Ubuntu系执行:
sudo apt install fuse libfuse22.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结构化日志:
| _path | count |
|---|---|
| conn | 236 |
| dns | 112 |
| http | 38 |
| ssl | 41 |
这里要解释一下它经历了什么过程:原始流量先被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_codecut的作用和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上都有现成解决方案。