Zeek 网络流量分析实战:开源安全监控平台部署指南

适用场景

Zeek 网络流量分析适用于需要构建被动式网络监控(NSM)能力的安全团队。Zeek(原 Bro)通过旁路镜像流量或 TAP 接入,对网络流量进行深度解析,生成连接日志、DNS 日志、HTTP 日志、证书日志等结构化记录,并支持通过脚本语言编写自定义检测逻辑。典型场景包括:旁路监控 Web 攻击行为、记录内部网络资产间的异常通信、检测恶意域名与加密流量中的证书异常,以及为威胁狩猎提供长时间段的流量元数据。

前置条件

  • 一台独立监控主机(建议 4C8G 起步,存储建议 500G 以上),与业务网络隔离
  • 交换机配置 SPAN / 镜像端口,将需要监控的流量复制到监控主机网卡
  • 监控主机操作系统为 Ubuntu 20.04+ / Debian 11+ / CentOS 8+
  • 监控网卡不配置 IP 地址(纯监听模式),避免 Zeek 自身流量污染

原理说明

Zeek 采用 事件驱动架构:捕获层基于 libpcap 接收数据包,事件引擎(Event Engine)将原始报文解析为协议事件,策略脚本(Policy Scripts)通过 Zeek 脚本语言对这些事件进行过滤、聚合与关联,最终输出结构化的 *.log 日志文件。与基于规则匹配的 IDS(如 Suricata)不同,Zeek 的重点是记录与语义分析,其 DPD(Dynamic Protocol Detection)能够自动识别非标准端口上的应用层协议(如 HTTP、FTP、SSH)。

操作步骤

步骤一:安装 Zeek

# Ubuntu / Debian(官方 OBS 源)
echo 'deb http://download.opensuse.org/repositories/security:/zeek/xUbuntu_22.04/ /' > /etc/apt/sources.list.d/zeek.list
curl -fsSL https://download.opensuse.org/repositories/security:/zeek/xUbuntu_22.04/Release.key | gpg --dearmor -o /etc/apt/trusted.gpg.d/zeek.gpg
apt-get update && apt-get install -y zeek

# CentOS 8
dnf install -y https://download.opensuse.org/repositories/security:/zeek/CentOS_8/x86_64/zeek-6.0.0-0.x86_64.rpm

# 将 zeek 加入 PATH
echo 'export PATH=/opt/zeek/bin:$PATH' >> /etc/profile.d/zeek.sh
source /etc/profile.d/zeek.sh
zeek --version

步骤二:配置监听接口

编辑 /opt/zeek/etc/node.cfg

[zeek]
type=standalone
host=127.0.0.1
interface=eth1
# 部署配置并启动
zeekctl deploy

# 查看节点状态
zeekctl status
# 预期输出 zeek 节点 running

步骤三:查看核心日志

# 日志目录(按天分目录)
ls /opt/zeek/logs/current/

# 常用日志文件说明
# conn.log      —— 所有网络连接记录(源目 IP、端口、字节数、状态)
# dns.log       —— DNS 查询记录
# http.log      —— HTTP 请求记录(URL、UA、响应码)
# ssl.log       —— TLS 证书信息(SNI、证书哈希)
# notice.log    —— 命中告警策略的事件

# 实时查看连接日志
tail -f /opt/zeek/logs/current/conn.log | zeek-cut id.orig_h id.resp_h id.resp_p proto conn_state

步骤四:DPD 深度包检测与脚本告警

创建自定义检测脚本 /opt/zeek/share/zeek/site/local_zeek_test.zeek

# 检测源 IP 发起超过 100 个连接的情况(疑似扫描)
event new_connection(c: connection) {
    if (c$id$resp_p == 80/tcp && c$conn_state == "S0") {
        NOTICE([$note=Weird_Activity,
                $msg=fmt("Possible port scan from %s", c$id$orig_h),
                $conn=c]);
    }
}
# 在 local.zeek 中加载该脚本
echo "@load local_zeek_test" >> /opt/zeek/share/zeek/site/local.zeek

# 重新加载脚本
zeekctl deploy
sleep 60
# 查看告警
tail -f /opt/zeek/logs/current/notice.log

步骤五:对接可视化与告警平台

# Zeek 日志为 TSV 格式,可直接导入 Elasticsearch / Splunk
# 以 filebeat + elastic 为例,将 /opt/zeek/logs/current/*.log 配置为输入源即可

# 或使用 zeek-cut 提取字段导出 CSV 做离线分析
zeek-cut -d id.orig_h id.resp_h id.resp_p proto < /opt/zeek/logs/current/conn.log > /tmp/conn.csv

配置验证

# 在镜像网段内发起一次 HTTP 请求后,检查 http.log
zeek-cut ts host uri status_code < /opt/zeek/logs/current/http.log | tail -5
# 预期输出本次请求的域名、URI 与状态码

# 检查 DNS 日志
zeek-cut ts query answers < /opt/zeek/logs/current/dns.log | tail -5

若 http.log 与 dns.log 中出现了对应记录,说明 Zeek 已正确解析镜像流量。

常见问题

FAQ 1:Zeek 抓不到任何流量?

首先确认镜像口与监听网卡是否一致(ip link show 检查 eth1 是否有 RX 包计数增长);其次确认监听网卡未配置 IP(配置了 IP 会触发 Zeek 自身的地址抑制);最后用 tcpdump -i eth1 -c 100 验证镜像流量是否真正到达。

FAQ 2:日志增长太快,磁盘空间不足怎么办?

/opt/zeek/etc/zeekctl.cfg 中调整 LogRotationInterval=3600(小时级轮转)与 LogDir=/data/zeek(挂载大容量磁盘),同时配置 cron 定期清理 30 天前的日志:find /opt/zeek/logs -type d -mtime +30 -exec rm -rf {} \;。也可通过过滤脚本仅记录关心的子网流量。

总结

Zeek 作为开源网络流量分析平台,通过结构化日志与脚本化检测为安全团队提供了强大的网络可见性。部署时应重点规划镜像流量接入方式、日志存储周期与告警对接方案,将 Zeek 与 SIEM、威胁情报平台联动,才能真正发挥其长期威胁狩猎的价值。