
maltrail v2.2
基于公开黑名单、静态恶意软件痕迹和启发式分析的实时恶意流量检测系统,用于识别DNS、HTTP和IP流量中的威胁。

Maltrail
Maltrail 是一个网络流量检测系统,用于识别与已知恶意基础设施的通信,并报告选定的流量异常。它会将网络中观察到的域名、URL、IP 地址、IP:port 对以及 User-Agent 值与一组称为 trails 的指标进行匹配。
检测结果会记录为单个事件,其中包含源地址、目标地址、协议、匹配的 trail、分类以及 trail 来源:```text "2026-08-07 09:14:22.117034" gw 10.13.13.2 57809 1.1.1.1 53 UDP DNS malware.bakewithdavid.com "asyncrat (malware)" (static)
Maltrail 专为基于指标的网络监控而设计。其启发式检测补充了特征匹配,但并不能替代端点遥测或通用入侵防御系统。
## Features
- 完整特征构建,包含超过 3,000 个捆绑静态文件、42 个公共源集成,以及可选的运维人员提供的特征。
- 一个多线程 Rust 传感器,使用 libpcap,并提供可选的 Linux `PACKET_FANOUT` 捕获工作线程。
- 一个 Python 服务器,提供报告界面、事件接收和 HTTP API。
- 纯文本自定义特征和白名单,可审查并纳入版本控制。
- 针对扫描、DNS 耗尽、类 DGA 查询、可疑下载、代理探测、可疑 User-Agent 值及相关网络活动的启发式检测。
- 本地事件日志、远程 Maltrail 日志、基于 syslog 的 CEF 以及 Logstash JSON 输出。
- 通过 `maltrail-sensor -T` 进行部署验证,并提供可选的 Prometheus 指标。
## Contents
- [架构](#architecture)
- [性能](#performance)
- [安装](#installation)
- [安装程序](#installer)
- [从源码构建](#building-from-source)
- [Systemd](#systemd)
- [Docker](#docker)
- [配置](#configuration)
- [特征](#trails)
- [事件和 API](#events-and-api)
- [运维](#operations)
- [监控](#monitoring)
- [事件保留](#event-retention)
- [文档](#documentation)
- [贡献](#contributing)
- [项目](#project)
- [许可证](#license)
- [维护者](#maintainers)
- [赞助者](#sponsors)
- [演示与出版物](#presentations-and-publications)
- [衍生黑名单](#derived-blacklist)
- [第三方集成](#third-party-integrations)
- [致谢](#acknowledgements)
## 架构
Maltrail 由两个独立的进程组成,它们可以运行在同一台主机上,也可以运行在不同主机上:```text
┌──────────┐ events (UDP or file) ┌──────────┐
│ sensor │ ───────────────────────► │ server │ ◄── browser
└──────────┘ └──────────┘
Rust Python
libpcap + PACKET_FANOUT reporting UI + API
trail matching + heuristics
传感器捕获流量,执行轨迹匹配和启发式分析,并产生事件。
它可以本地写入事件(LOG_DIR),将其发送到远程 Maltrail 服务器(LOG_SERVER),或两者兼做。它还可以通过 syslog 发送 CEF(SYSLOG_SERVER),并将 JSON 发送到 Logstash(LOGSTASH_SERVER)。
服务器接收并存储远程事件,提供本地可用的事件日志,并提供 Web 界面和 API。
性能
性能取决于处理器、流量组成、轨迹集大小、捕获驱动程序和网络接口。下图测量的是传感器数据包处理路径的隔离性能;它们不是端到端的实时捕获测量结果。
在启用启发式功能并拥有 150 万行轨迹集的 AMD Ryzen 7 PRO 4750U 上的代表性测量结果:
| 流量 | 每数据包耗时 |
|---|---|
| ICMP 回显,58 字节 | 101 ns |
| TCP SYN,70 字节 | 302 ns |
| 批量 TLS,1,473 字节 | 402 ns |
| 带热缓存的 DNS 查询,93 字节 | 452 ns |
| 混合流量,平均 866 字节 | 552 ns |
| HTTP 请求,169 字节 | 602 ns |
| 带唯一名称的 DNS 查询,93 字节 | 1,102 ns |
使用相同生成的捕获、配置和轨迹集进行的离线对比运行测得,在测试的系统中,稳态每数据包成本比已退役的 Python 传感器低 14–37 倍。对比工具会单独报告整个进程的时间,因为轨迹加载在短时重放中占主导地位。它还会打印事件数量;功能一致性由一致性语料库独立测试。
在目标系统上运行对比:```bash
python3 sensor/tools/bench_compare.py --packets 300000
--trails ~/.maltrail/trails.csv --repeat 3
默认使用一个捕获工作进程。增加工作进程可以提高捕获容量,但 Linux 流哈希会在工作进程之间划分每个源的状态,从而降低某些扫描启发式规则的灵敏度。在记录在案的测试中,单工作进程的启发式警报在使用两个工作进程时保留了 91%,使用四个时保留了 86%,使用八个时保留了 65%。精确轨迹匹配保持不变。仅当捕获丢弃指标表明有必要时,才增加 `CAPTURE_FANOUT`。
基准测试方法、硬件结果、性能分析器输出、内存测量以及实时 fanout 检查已记录在 [`sensor/docs/REPORT.md`](https://github.com/stamparm/maltrail/blob/HEAD/sensor/docs/REPORT.md) 中。
## 安装
### 安装程序
安装程序支持 Debian、Ubuntu、Raspberry Pi OS、RHEL、Fedora 和 openSUSE:```bash
curl -fsSL https://raw.githubusercontent.com/stamparm/maltrail/master/install.sh | sudo sh
它会安装依赖项,在 /opt/maltrail 下创建受管检出目录,验证预构建传感器的校验和,创建非特权 maltrail 账户,安装 systemd 单元,准备日志和状态目录,然后启动传感器和服务器。重新运行安装程序会升级该受管检出目录。
在提升权限运行脚本之前,请先审阅该脚本。从现有检出目录中,试运行会显示命令而不更改系统:```bash sh install.sh --dry-run
常见安装程序选项:```bash
sh install.sh --role sensor # Install only the sensor
sh install.sh --ref 3.1.1 # Install a release tag instead of master
sh install.sh --no-service # Install without changing systemd
sh install.sh --dry-run # Print commands without applying them
sh install.sh --uninstall # Remove the managed installation; keep logs and state
安装后,仪表板可在 http://127.0.0.1:8338 访问。请注意,随附的
HTTP_ADDRESS 为 0.0.0.0,因此可在 每个 接口上访问,而不仅仅是回环接口 — 并且
默认凭据为 admin / changeme!。请更改 USERS,并将 HTTP_ADDRESS 设置为
127.0.0.1(或将服务器置于启用 TLS 的反向代理之后),
以免主机接入不受信任的网络。
初始 trail 构建可能需要几分钟。传感器不会检测 trail 匹配,直到
有效的 trail 集可用为止。systemd 单元会在启动前运行传感器的 -T 验证,
因此缺失权限、日志目录不可写或 trail 集无效都会导致启动
明显失败。
安装程序测试工具集涵盖 Ubuntu、Debian、Fedora、openSUSE 和 Alpine 容器。Alpine 使用 musl 且不使用预构建的 glibc 传感器二进制文件;请在那里从源码构建传感器。
从源码构建
传感器需要 Rust 1.74 或更高版本、libpcap 开发头文件以及系统的 capability 工具。服务器和 trail 更新器需要 Python 3.6 或更高版本。
安装发行版软件包:```bash
Debian / Ubuntu / Raspberry Pi OS
sudo apt-get install cargo libpcap-dev libcap2-bin python3
RHEL / Fedora
sudo dnf install cargo libpcap-devel libcap python3
openSUSE / SLES
sudo zypper install cargo rust libpcap-devel libcap-progs python311
然后构建并验证传感器:```bash
git clone --depth 1 https://github.com/stamparm/maltrail.git
cd maltrail
cargo build --release --manifest-path sensor/Cargo.toml
sudo setcap cap_net_raw,cap_net_admin=eip \
sensor/target/release/maltrail-sensor
sudo install -d -o "$USER" -g "$(id -gn)" -m 750 /var/log/maltrail
sensor/target/release/maltrail-sensor -T
sensor/target/release/maltrail-sensor
在另一个终端或另一台主机上启动服务器:```bash python3 server.py
预构建的 `x86_64` 和 `aarch64` 传感器二进制文件随当前版本提供,并带有 SHA-256
校验和。它们面向 glibc 2.28,并在运行时需要 libpcap。在基于 musl 的系统(如
Alpine Linux)上,请从源码构建。
已退役的 Python 传感器仅用于比较与一致性工具。这些工具还
要求 `pcapy-ng` 和 Python 开发头文件,如
[`sensor/docs/INSTALL.md`](https://github.com/stamparm/maltrail/blob/HEAD/sensor/docs/INSTALL.md) 中所述。
### Systemd
提供的 `maltrail-server.service` 和 `maltrail-sensor.service` 单元以
非特权 `maltrail` 用户身份运行这两个进程。Systemd 会创建 `/var/log/maltrail` 和 `/var/lib/maltrail`,限制
文件系统访问,并授予传感器 `CAP_NET_RAW` 和 `CAP_NET_ADMIN`。
安装程序会自动配置这些单元。对于现有的源码安装,请按照
[`sensor/docs/INSTALL.md`](https://github.com/stamparm/maltrail/blob/HEAD/sensor/docs/INSTALL.md) 中的手动服务流程操作。
使用以下命令检查服务状态和日志:```bash
systemctl status maltrail-sensor maltrail-server
journalctl -u maltrail-sensor -f
Docker
使用以下命令启动随附的 Compose 部署:```bash docker compose -f docker/docker-compose.yml up -d
容器配置、存储、特权及健康检查记录于
[`docker/README.md`](https://github.com/stamparm/maltrail/blob/HEAD/docker/README.md)。
## 配置
Maltrail 读取 `maltrail.conf`,其中包含独立的 `[Sensor]` 和 `[Server]` 设置。安装程序将受管配置放置在 `/etc/maltrail.conf`。
常用的传感器选项包括:
| Option | Purpose |
| --- | --- |
| `MONITOR_INTERFACE` | 捕获接口或接口列表;`any` 选择所有受支持的接口 |
| `CAPTURE_FILTER` | BPF 捕获过滤器 |
| `CAPTURE_FANOUT` | Linux 捕获套接字数量;默认为一 |
| `LOG_DIR` | 本地事件日志目录 |
| `TRAILS_FILE` | 生成的 trail 数据库 |
| `LOG_SERVER` | 远程 Maltrail 事件服务器 |
| `SYSLOG_SERVER` | CEF syslog 目标或目标列表 |
| `LOGSTASH_SERVER` | Logstash JSON 目标或目标列表 |
| `STATS_ADDRESS` | Prometheus 指标监听器;除非配置,否则禁用 |
| `UPDATE_PERIOD` | Trail 刷新间隔 |
| `USER_WHITELIST` | 不应触发告警的操作员管理指标 |
| `CUSTOM_TRAILS_DIR` | 操作员管理的 trail 目录 |
`PROCESS_COUNT` 适用于已退役的 Python 传感器。Rust 传感器的捕获工作进程应改用 `CAPTURE_FANOUT` 配置。
更改配置后,请运行部署检查:```bash
sensor/target/release/maltrail-sensor -T
该检查会验证配置、痕迹、白名单条目、捕获过滤器、权限、日志 存储、更新支持和工作线程设置。成功的检查会包含非零的痕迹和白名单 计数,而不仅仅是确认文件存在。
痕迹
痕迹以纯文本指示符形式存储:```text trails/static/malware/ malware-related static trails trails/static/malicious/ malicious infrastructure trails/static/suspicious/ suspicious infrastructure and behavior trails/feeds/*.py public feed integrations
在 `CUSTOM_TRAILS_DIR` 下添加本地指标。将永远不应生成警报的指标添加
到 `USER_WHITELIST`。将自定义数据保留在受管检出之外可防止升级
覆盖它。
更新程序根据已启用的数据源、捆绑的静态 trail 和自定义 trail 重新构建 `TRAILS_FILE`。只有
在构建成功后才以原子方式发布新文件。空数据源或失败的数据源会被报告,因此运行中的部署不会静默
依赖过期或已停用的数据源。
Trail 贡献应包含指标、分类和可验证的来源。在提交拉取请求之前,请参阅
[Contributing](#contributing)。
## 事件与 API
Maltrail 每次检测记录一个以空白字符分隔的事件,使用 CSV 引用来处理值
包含空格的情况:```text
"<time>" <sensor> <src_ip> <src_port> <dst_ip> <dst_port> <proto> <type> <trail> "<info>" <reference>
type 字段标识匹配的内容,包括 DNS、IP、IPORT、URL、PATH、HTTP、
UA、PORT 和 CERT。info 字段包含轨迹分类,reference
标识产生该结果的静态列表、订阅源、自定义来源或启发式规则。
指标查询
使用 /check 查询一个域名、IP 地址或 URL:```bash
curl 'http://127.0.0.1:8338/check?q=www.sub.evil.example'
请提供需要翻译的Markdown内容。```json
{
"query": "www.sub.evil.example",
"found": true,
"trail": "evil.example",
"info": "asyncrat (malware)",
"reference": "(static)"
}
子域查询可以匹配其列出的父域。URL 查询会先检查 host/path,然后再单独检查
主机。服务器读取内存映射的 trail 数据库,无需重启即可观察到 trail
更新。
公共静态和 feed trail 无需身份验证即可使用,与远程传感器使用的 /trails
端点一致。自定义 trail 需要授权会话;未授权的仅自定义查询
会被报告为未命中。事件数据始终保持需认证状态。
操作
监控
使用 maltrail-sensor -T 作为部署和配置门禁。随附的 systemd 单元将其
作为 ExecStartPre 运行。
配置了 STATS_ADDRESS 时,至少监控以下 Prometheus 指标:
| 指标 | 操作含义 |
|---|---|
maltrail_up == 0 | 没有捕获工作进程在运行 |
Increasing maltrail_capture_dropped_total | 捕获环形缓冲区正在丢弃数据包 |
Increasing maltrail_local_log_errors_total | 事件已产生但无法写入本地 |
Increasing maltrail_remote_log_errors_total | 事件无法传送到远程接收端;启用 DISABLE_LOCAL_LOG_STORAGE 时这些事件将丢失 |
maltrail_trail_generation 不推进 | 活动 trail 集未被刷新 |
maltrail_log_dir_free_bytes | 本地事件存储的剩余容量 |
Increasing maltrail_state_saturations_total | 已达到某个启发式状态限制 |
Increasing maltrail_throttle_evictions_total | 事件节流表已达上限,事件比配置的时间更早被聚合 |
状态饱和会影响相应的启发式逻辑;精确 trail 匹配仍然有效。
发送 SIGHUP 或使用 systemctl reload maltrail-sensor 请求重新加载 trail。由其他进程更新的
trail 文件会被自动检测并发布到工作进程,而无需
重启传感器。
精简可观察存储(USE_CONDENSED_STORAGE, meta.sqlite)支持服务器的
novelty 和 retro-hunt 视图。与已退役传感器的兼容性记录在
sensor/docs/COMPATIBILITY.md 中。
事件保留
Maltrail 不会轮转或删除事件日志。运营人员负责根据存储要求和组织策略定义保留、 归档和删除。
推荐做法:
- 使用
LOG_SERVER、SYSLOG_SERVER或LOGSTASH_SERVER将持久事件副本发送到远程 Maltrail 服务器 或 SIEM。 - 针对
maltrail_log_dir_free_bytes设置告警,并为预期事件速率预留足够余量。 - 使用外部工具轮转、归档或删除本地每日日志。
- 将报告界面所需的文件以未压缩形式保留在
LOG_DIR中;将压缩文件 归档到其他位置。
当日志文件系统已满时,传感器无法追加事件。事件日志还可能包含在某些司法管辖区被认定为个人数据的 IP 地址和域名;保留策略 应考虑适用的要求。
文档
| 文档 | 内容 |
|---|---|
sensor/docs/INSTALL.md | 安装、权限、配置和故障排除 |
sensor/docs/ARCHITECTURE.md | 传感器内部结构和数据流 |
sensor/docs/COMPATIBILITY.md | 与已退役的 Python 传感器在刻意设计上的差异 |
sensor/docs/REPORT.md | 测量、配置文件和测试结果 |
sensor/docs/ROADMAP.md | 待处理的传感器工作 |
old/README.md | 已退役的 Python 传感器,保留作为对等一致性参考 |
贡献
欢迎提交 trail 新增、feed 维护、错误报告、文档和传感器改进。 trail 提交应包含可靠的来源,并使用最窄的适当 分类。
在提交代码之前运行相关检查。完整的传感器门禁为:```bash bash sensor/tools/check.sh
它运行格式化、Clippy(禁止警告)、调试与发布测试,以及针对已退役 Python 传感器的奇偶校验回放。使用以下命令运行 Python 服务器套件:```bash
bash tests/run.sh python3
项目
许可证
Maltrail 在 MIT 许可证下分发。参见 LICENSE。
维护者
- Miroslav Stampar (@stamparm)
- Mikhail Kasimov (@MikhailKasimov)
赞助商
演示与出版物
- 第 47 届 TF-CSIRT 会议,布拉格,2016 (幻灯片)
- 《使用 Maltrail 检测网络攻击》,《Linux Magazine》,2022 (文章)
- 《最佳网络威胁情报源》,Silent Push,2022 (评测)
- 《基于 Maltrail 的网络恶意流量检测系统研究》,《Nanotechnology Perceptions》,2024 (论文)
衍生黑名单
从 trails/static/malware 派生的仅域名列表发布在
maltrail-malware-domains.txt。
它可用作 DNS 过滤系统的输入,但操作员在启用拦截前应审查并测试它。
威胁情报列表可能包含误报或不适用于所有环境的指标。
第三方集成
- FreeBSD Port
- OPNsense Gateway Plugin
- D4 Project
- BlackArch Linux
- Validin
- Maltrail Add-on for Splunk
- Maltrail decoder and rules for Wazuh
- GScan(仅 trails)
- MalwareWorld(仅 trails)
- oisd domain blocklist(仅 trails)
- NextDNS(仅 trails)
- NoTracking(仅 trails)
- OWASP Mobile Audit(仅 trails)
- Mobile Security Framework MobSF(仅 trails)
- pfBlockerNG-devel(仅 trails)
- Sansec eComscan(仅 trails)
- Palo Alto Networks Cortex XSOAR(trail 连接器)
致谢
- Thomas Kristner
- Eduardo Arcusa Les
- James Lay
- Ladislav Baco (@laciKE)
- John Kristoff (@jtkdpu)
- Michael Münz (@mimugmail)
- David Brush
- @Godwottery
- Chris Wild (@briskets)
- Keith Irwin (@ki9us)
- Simon Szustkowski (@simonszu)