在云服务器环境中部署Zeek(原Bro)进行网络流量分析,核心目标往往不是还原完整报文,而是从流量里抽取有价值的元数据,并以结构化日志形式持续输出。元数据包含通信双方IP与端口、协议类型、请求域名、URI、响应码、字节数、持续时间等,这些信息足以支撑入侵检测、异常排查和合规审计,同时避免.full抓包带来的存储压力。云服务器通常承担Web、API或中间件业务,南北向与东西向流量混杂,用Zeek做轻量级审计非常合适。

要在云服务器上运行Zeek,第一步是确认系统环境。主流发行版如Ubuntu 22.04、CentOS 7/8均可通过源码或第三方仓库安装。以Ubuntu为例,先更新软件源并安装依赖:apt-get update && apt-get install cmake make gcc g++ flex bison libpcap-dev python3,再从官方仓库拉取Zeek稳定版源码编译。编译完成后,将zeek二进制所在路径加入PATH,执行zeek --version验证。云服务器若启用了安全组,需确保监控网卡允许Zeek读取流量,镜像流量或透明桥接方式均可,但不要和被防护业务争抢同队列导致丢包。
部署形态上,云服务器常选用独立流量探针模式:单独一台按量实例专门跑Zeek,通过端口镜像把业务实例的流量复制过来。这样业务机零侵入,探针机可根据流量规模选配CPU与内存。若业务量小,也可在同机以af_packet插件直抓云内虚拟网卡。无论哪种,都建议在zeekctl配置里设定正确的Interface,并用diag命令检查是否漏包。漏包会直接造成元数据缺失,比如一条HTTP事务只看到请求没看到响应,日志就不完整。
Zeek元数据提取的基本机制
Zeek的元数据提取依赖事件驱动模型。当流量进入,Zeek内核先做TCP/IP重组和协议猜测,随后触发对应协议的解析器,比如connection_established、dns_request、http_request、ssl_handshake等事件。用户在脚本里挂接这些事件,就能在事件回调中读取conn、dns、http等记录框架自动维护的字段。也就是说,元数据不是事后从报文抠出来的,而是在会话解析过程中由状态机实时填充的。这种设计让Zeek在10Gbps以下链路能稳定产出结构化数据。
以DNS元数据为例,当云服务器内部容器频繁解析外部域名时,Zeek的DNS模块会提取query域名、查询类型、响应IP、TTL等,写入dns.log。你不需要自己写报文解析,只要理解dns.log每一列含义即可。类似地,conn.log记录每条连接的五元组、时长、收发字节、丢包数;http.log记录方法、host、uri、referrer、status_code、user_agent。这些就是最常被提取的元数据维度,也是后续用Splunk或Elasticsearch做威胁狩猎的基础。
很多人忽略的是,Zeek的元数据粒度可通过脚本调整。默认脚本只提取通用字段,若你的云业务使用私有协议或特殊HTTP头,可以写local脚本扩展记录类型。例如在base/protocols/http/main.zeek里加一个字段记录X-Request-Id,就能把分布式追踪ID落进http.log。这种灵活性让元数据提取不局限于官方预设,而是贴合实际运维需求。
日志输出格式与落地方式
Zeek默认把日志写成TSV(制表符分隔)文本,按小时或大小滚动,存放在/spool/目录。每一类元数据对应一个.log文件,首行是字段名,次行是类型声明,其后是数据行。这种格式方便用awk、grep直接处理,也易于被Filebeat采集进ELK。在云服务器上,建议修改zeekctl.cfg里的LogDir到挂载的高性能云盘,避免系统盘写满影响业务。同时开启json日志选项,让输出带@timestamp和明确字段名,降低下游解析成本。
如果希望日志直接进对象存储或消息队列,可借助Zeek的Log::add_filter接口。比如写一个Python外发脚本,通过Log::write_hook把每条记录推到Kafka,再消费到云端日志服务。下表对比两种常见输出方式的差异:
| 输出方式 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|
| 本地TSV文件 | 零依赖,易调试,可断点查 | 需自行轮转与采集,实时性弱 | 小规模云主机审计 |
| JSON转Kafka | 实时性好,易接云日志平台 | 需维护消息中间件,有开发量 | 大流量多实例集中分析 |
在云环境里,还要考虑日志权限与加密。Zeek输出的元数据可能含内网IP、域名等敏感信息,日志目录应设700权限,外发通道走TLS。某些合规要求下,conn.log中不能保留完整字节数以外的载荷痕迹,Zeek本身不存载荷,天然满足这一条,但仍要在策略里禁用任何payload打印脚本,防止误加。
实战配置与排错要点
具体操作时,先编辑$ZEEK_HOME/share/zeek/site/local.zeek,引入需要的协议分析器并去掉冗余模块。例如云服务器只跑Web与DNS,可注释掉邮件与FTP相关加载项,减少CPU开销。然后设监控接口:在node.cfg里把worker的interface改成实际流量网卡名,如eth0或ens5。启动zeekctl deploy后,用tail -f conn.log看是否有记录生成。若长时间空文件,先用tcpdump确认该网卡确有流量,再查Zeek是否因权限不足无法抓包。
排错中常见的一类问题是时间不同步。云服务器若没开NTP,Zeek日志时间戳会偏移,导致关联分析错乱。务必安装chrony并指向云厂商内网时间源。另一类是策略脚本报错使worker退出,这时zeekctl status会显示crashed,看spool/xxx/stderr.log定位语法或字段冲突。掌握这些,你就能在云服务器上稳定用Zeek提取元数据并输出日志,把看不见的流量变成可查询的安全资产。
总体来看,云服务器结合Zeek做流量元数据提取与日志输出,是一项投入产出比很高的实践。它不取代深度包检测,但用极低存储成本保留了最关键的行为证据。只要理清提取机制、选好输出通道、守住权限与时钟底线,即便多台云主机也能通过一台探针汇总分析,为后续告警规则与态势感知提供扎实数据底座。