jonasbrenk/benchmarking-network-scanners
GitHub: jonasbrenk/benchmarking-network-scanners
一个用于在标准化双机环境中对 Rust 网络扫描器 Onmap 与 Nmap 进行系统性性能基准测试的自动化框架。
Stars: 0 | Forks: 0
# 网络扫描器基准测试
本仓库在受控的双机环境下对 `nmap` 和 `onmap` 进行基准测试。
两款扫描器在相同的网络和相同的扫描配置下,针对同一目标状态运行。目标机器负责配置虚拟网络场景。扫描机器负责保存清单文件、运行扫描并存储结果。
详细的内部说明、构建产物细节和实现结构请参阅 [INFO.md](INFO.md)。
## 假设前提
- 两台 Linux 机器通过直接的以太网链路连接。
- 扫描主机运行基准测试命令。
- 目标主机配置虚拟网络状态。
- 基准测试范围仅限于:
- 端口扫描:TCP connect、TCP SYN、TCP ACK。
- 主机发现:default、ICMP echo、ICMP timestamp、TCP SYN 和 TCP ACK。
- 场景清单是确定性的真实基准。UDP 不包含在当前模型中。
关于主机发现的说明:"default" 是扫描器内置的探测选择,而不是字面意义上的 ping —
在 root 权限下,它会在直连链路上使用 ARP;在非特权模式下,它只连接 80/443 端口。ICMP echo 和
ICMP timestamp 发送实际的 ICMP 探测包;SYN 和 ACK 发现会探测单个 TCP 端口。每次运行
都会通过 `as_root` 显式声明其权限,而不是从扫描模式中推断。
## 配置
[`benchmark_config.yml`](benchmark_config.yml) 为带有直连以太网链路和 `10.10.0.0/24` 子网的标准双机环境进行了预配置。该文件必须以相同的值存在于两台机器上。除非您的网络拓扑不同,否则请保持其不变。
如果您的设置不是标准的,您可能需要调整以下值:
- `network.subnet_cidr`:配置命令将在直连链路上配置的子网
- `hosts.scanner.physical_interface` / `hosts.target.physical_interface`:如果自动检测选错了网卡(NIC)
- `hosts.scanner.management_ip` / `hosts.target.management_ip`:如果您需要不同的主机地址
- `hosts.target.ssh_user`:目标机器上的 SSH 用户
- `hosts.target.bridge.name`:如果 `br0` 与现有接口冲突
## 环境设置
1. 在目标主机上:
```
./install-target-reqs.sh
sudo python3 -m target setup
```
2. 在扫描主机上:
```
./install-scanner-reqs.sh
sudo python3 -m scanner setup
```
这会配置网络接口、将 SSH 密钥复制到目标机器、安装依赖项并运行候选程序的安装。如果需要单独重新安装候选程序(例如在更新扫描器二进制文件之后),请使用 `sudo python3 -m scanner install-candidates`。
如果扫描器二进制文件已经存在,并且您只需要刷新 `scanner/runtime_data/candidates.resolved.yml` 而无需安装任何内容或连接互联网,请运行 `python3 -m scanner write-candidate-registry`。
`scanner exec` 必须以普通基准测试用户的身份启动,而不是通过本地的 `sudo`。
## 运行基准测试
列出已索引的测试活动(campaigns):
```
python3 -m scanner list campaigns
```
列出快速的单次运行计划:
```
python3 -m scanner list runs
```
`scanner exec` 会选择测试活动或单次运行。每个选择器接收一个或多个条目,
以 `list` 索引(`1 2 3` 或 `1,2,3`)或清单名称/路径的形式给出:
- `--campaign ITEM...` 运行测试活动清单。
- `--run ITEM...` 运行单次运行计划。
- 字面标记 `list`(例如 `--campaign list`)会打印该类型的清单列表。
- 不提供选择器会启动交互式提示。
选择两个或更多条目会在同一个带有时间戳的会话文件夹中运行(使用 `--session-name` 命名,或默认为 `session`);选择单个条目则会写入一个独立的结果目录。
运行单个测试活动:
```
python3 -m scanner exec --campaign scanner/runtime_data/manifests/campaigns/port-scan-pure/tcp-syn/campaign-filtered-ratio-6pt.yml
```
根据列表索引运行多个测试活动:
```
python3 -m scanner exec --campaign 0,1,2
```
运行单个生成的或手动编写的计划:
```
python3 -m scanner exec --run scanner/runtime_data/manifests/run/smoke-port-scan-tcp-syn.yml
```
可选项:
- `--output-dir PATH` 将结果写入其他位置。
- `--session-name NAME` 将多个测试活动的结果归组到一个命名的会话目录下。
在运行处于活动状态时,`scanner/runtime_data/runner_state.json` 是 CLI 和结果查看器共同使用的单一共享进度文件。终端状态转换也会被追加到 `scanner/runtime_data/runner_state_log.jsonl` 中。
## 分析结果
分析单次运行:
```
python3 -m scanner analyze-run
```
分析单个测试活动:
```
python3 -m scanner analyze-campaign
```
## 可视化结果
为单次运行创建图表:
```
python3 -m scanner visualize-run
```
为单个测试活动创建图表:
```
python3 -m scanner visualize-campaign
```
## 清单布局
可编辑的清单位于以下位置:
- [`scanner/runtime_data/manifests/campaigns/`](/home/jb/studienarbeit/benchmarking-network-scanners/scanner/runtime_data/manifests/campaigns)
- [`scanner/runtime_data/manifests/run/`](/home/jb/studienarbeit/benchmarking-network-scanners/scanner/runtime_data/manifests/run)
- [`scanner/runtime_data/manifests/target_scenarios/`](/home/jb/studienarbeit/benchmarking-network-scanners/scanner/runtime_data/manifests/target_scenarios)
测试活动定义了一个有序的运行列表。每次运行都会引用一个场景和一个扫描配置。
`run/` 目录包含用于快速环境、扫描模式和配置检查的一次性计划。
当会话中的某个测试活动失败时,它仍会写入其正常的失败产物,并且会话会继续执行下一个测试活动。当至少有一个测试活动失败时,共享的运行状态将以 `finished_with_failures` 结束。
场景定义了预期的目标端主机和端口真实状态,用于环境配置和后续分析。
## 结果查看器
启动本地查看器:
```
python3 -m scanner results-viewer
```
可选参数:
- `--results-dir PATH`
- `--host HOST`
- `--port PORT`
- `--no-browser`
如果基准测试正在运行,查看器将仅返回一个包含开始时间和已用时间的最小静态状态页面。在该状态下,它只读取 `scanner/runtime_data/runner_state.json`,不会加载结果文件或清单。
标签:Maven构建, Rust, 云存储安全, 内存分配, 可视化界面, 性能基准测试, 插件系统, 网络发现, 网络扫描, 网络流量审计, 逆向工具