Stenographer 是一个全包捕获工具,用于将数据包缓冲到磁盘,以满足入侵检测和事件响应需求。它提供了从网卡到磁盘的高性能数据包写入实现,处理磁盘空间满时自动删除旧文件,并提供快速简便地读取特定数据包集合的方法。
其设计目标是:
它不设计用于:
复杂的数据包处理(TCP 流重组等)
回读大量数据包(超过写入数据包的 1%)
如需进一步了解,请查阅 DESIGN.md 了解 stenographer 的设计讨论,或阅读 INSTALL.md 了解如何在机器上安装 stenographer。
用户通过一种非常简单的查询语言从 stenographer 请求数据包。这种语言是 BPF 的一个简单子集,包括以下原语:
host 8.8.8.8 # 单个 IP 地址(不允许主机名)
net 1.0.0.0/8 # 带 CIDR 的网络
net 1.0.0.0 mask 255.255.255.0 # 带掩码的网络
port 80 # 端口号(UDP 或 TCP)
ip proto 6 # IP 协议号 6
icmp # 等同于 'ip proto 1'
tcp # 等同于 'ip proto 6'
udp # 等同于 'ip proto 17'
# Stenographer 特有的时间添加:
before 2012-11-03T11:05:00Z # 特定时间之前的数据包(UTC)
after 2012-11-03T11:05:00-07:00 # 特定时间之后的数据包(带时区)
before 45m ago # 相对时间之前的数据包
after 3h ago # 相对时间之后的数据包
注意:相对时间必须使用整数小时或分钟表示,如上所示。
原语可以使用 and/&& 和 or/|| 组合,它们具有相同的优先级并从左到右求值。也可以使用括号进行分组。
(udp and port 514) or (tcp and port 8080)
stenoread 命令行脚本用于自动从 Stenographer 获取数据包并以可用格式呈现给分析师。它从 stenographer 请求原始数据包,然后通过 tcpdump 运行它们,以提供更全面的格式化/过滤体验。stenoread 的第一个参数是 stenographer 查询(参见上面的“查询语言”)。所有其他参数都传递给 tcpdump。例如:
# 从 IP 1.2.3.4 端口 6543 请求所有数据包,然后通过 TCP 标志进行额外过滤(标准 stenographer 不支持此功能)。
$ stenoread 'host 1.2.3.4 and port 6543' 'tcp[tcpflags] & tcp-push != 0'
# 请求端口 8765 上的数据包,打印时禁用 IP 解析 (-n) 并显示链路层头部 (-e)。
$ stenoread 'port 8765' -n -e
# 请求范围 1.1.1.0-1.1.1.255 内任何 IP 的数据包,将其写入本地 PCAP 文件,以便在 Wireshark 中打开。
$ stenoread 'net 1.1.1.0/24' -w /tmp/output_for_wireshark.pcap
要下载源代码,请先在本地安装 Go,然后运行:
$ go get github.com/google/stenographer
Go 将自动下载并安装 stenographer 所依赖的所有 Go 库。要构建 stenotype,请进入 stenotype 目录并运行 make。你可能需要安装以下 Ubuntu 软件包(或其他 Linux 发行版的等效包):
这不是一个正式的 Google 产品(无论是实验性的还是其他),它只是恰好归 Google 所有的代码。
此代码不用于(也不用于)监视 Google 的用户。其目的是通过增强我们内部监控能力来提高我们网络的安全性。