InfraGuard 是一个命令与控制(C2)重定向代理和管理器,可保护你的红队基础设施免受威胁归因。

红队基础设施追踪器与 C2 重定向器——[RedWarden](https://github.com/mgeeky/RedWarden) 的现代替代方案。
InfraGuard 位于互联网与你的 C2 teamserver 之间,根据你的可塑 C2 配置文件验证每一个入站请求,并阻止任何不符合规范的请求。扫描器、机器人以及蓝队探测会被重定向到诱饵站点,而合法的 beacon 流量则通过并到达你的 teamserver。


## 架构

## 功能特性
### 代理与监听器
- **多域名代理**——同时代理多个域名,每个域名拥有独立的 C2 配置文件、上游和规则
- **多协议监听器**——HTTP/HTTPS、HTTP/3 (QUIC)、WebSocket、gRPC、DNS、MQTT 和 TCP 隧道监听器同时运行,共享 IP 情报和事件追踪
- **熔断器**——按上游的故障保护,具有关闭/打开/半开状态;当后端不可达时,回退到该域名的丢弃动作
- **协议故障转移**——按优先级排序的监听器协议之间自动故障转移和故障恢复
### C2 配置文件支持
- **C2 配置文件验证**——解析并强制执行 Cobalt Strike、Mythic、Brute Ratel C4、Sliver、Havoc、Nighthawk 和 PoshC2 配置文件作为重定向器规则
- **热插拔配置文件**——在运行时从仪表板切换域名的活动 C2 配置文件,无需重启代理
- **配置文件生成向导**——通过引导式表单为所有 8 种支持的类型从头生成新的 C2 配置文件,或导入并上传现有配置文件,自动进行类型检测和验证
- **AI 辅助配置文件生成**——可选的 Ollama 集成在仪表板中提供聊天面板,用于配置文件创建帮助和 OPSEC 建议
### 过滤管道
- **基于评分的过滤管道**——10 个过滤器各自贡献 0.0--1.0 的评分;可配置的阈值决定阻止/允许。过滤器:JA3、IP、bot、header、DNS、geo、profile、replay、enumeration、sandbox。
- **JA3 TLS 指纹过滤**——在 TLS 握手层阻止 Masscan、ZGrab2、Shodan、curl、Python requests 和 Nmap,在任何 HTTP 数据交换之前;通过反向代理头或自定义 asyncio 协议工作;可选的允许列表模式强制 beacon JA3
- **沙箱和无头浏览器检测**——跨 HTTP 信号累积评分:HeadlessChrome UA、缺少 Accept-Language、没有 sec-ch-ua 的 Chrome、Safe Links 和 msnbot 扫描器 UA、非浏览器 Accept 排序
- **路径枚举检测**——在滑动窗口中按 IP 追踪唯一 URI;在 dirbuster/ffuf/gobuster 映射 URI 空间之前阻止它们
- **DNS 子域名枚举检测**——按客户端 IP 追踪 NXDOMAIN 响应;在阈值突破时自动阻止源 IP
- **反机器人 / 反爬取**——40+ 已知扫描器/机器人 User-Agent 模式,头部异常检测
- **重放保护**——按内容哈希拒绝重复请求;哈希持久化到 SQLite,因此保护在重启后仍然有效
- **丢弃动作**——重定向、TCP 重置、代理到诱饵站点或 tarpit(慢速滴流响应以浪费扫描器时间)
### 情报
- **IP 情报**——内置 19 个安全厂商范围(Shodan、Censys、Rapid7 等)的 CIDR 阻止列表、GeoIP 过滤、反向 DNS 关键词匹配
- **威胁情报源**——从公共来源(abuse.ch、Emerging Threats、Spamhaus DROP、Binary Defense)自动更新阻止列表,具有可配置的刷新间隔和磁盘缓存
- **动态 IP 阻止**——阻止白名单范围之外的 IP;在 N 个有效 C2 请求后自动将 IP 加入白名单
- **白名单增强**——白名单 CIDR 在启动时通过 GeoIP 数据库自动增强 ASN、组织、国家和大陆数据
- **暴露检测**——通过 crt.sh 监控证书透明度日志,通过 URLhaus/OpenPhish/Google Safe Browsing 进行域名声誉自我监控,以及当单个 IP 访问多个操作员域名时进行跨域名分析师检测
- **暴露置信度评分**——来自 6 个加权信号的连续 0--100 评分:JA3 多样性、流量峰值、新 ASN、CT 日志暴露、声誉命中以及失败认证尝试。包括推荐动作:监控、轮换或立即暴露。
- **金丝雀令牌注入**——追踪像素、蜜罐链接和蜜罐表单自动注入到诱饵页面,以检测蓝队调查
- **被动 DNS 监控**——轮询 CIRCL PDNS 以获取你的域名的外部解析;检测新记录、NXDOMAIN 峰值和首次出现的暴露
### 载荷投递
- **内容投递路由**——通过 PwnDrop、Mythic 文件存储、本地文件系统或 HTTP 代理后端在特定路径提供载荷、诱饵和静态文件;可选的条件投递,向目标提供真实内容,向扫描器提供诱饵
- **Mythic 文件暂存**——`mythic_file` 后端在干净的 URL 上代理 Mythic 的 `/direct/download/{uuid}`;固定 UUID 或代理模式;访问控制由 InfraGuard 的过滤栈提供
- **一次性载荷令牌**——当 beacon 被动态加入白名单时自动发放令牌;原子单次使用 SQLite 强制执行防止分析师或沙箱重放 URL;可配置的 TTL 和最大使用次数
- **按路由速率限制**——内容路由上的滑动窗口按 IP 下载速率限制器;超过限制时提供配置的扫描器诱饵或 429
- **投递守卫**——内容路由的环境键控:要求 beacon IP、UA 允许列表、必需的头部值、禁止的头部;检查失败时提供域名丢弃动作,而不是原始 403
- **钓鱼活动令牌**——通过嵌入电子邮件链接中的按活动令牌来门控钓鱼页面;静态令牌列表或 HMAC 签名的自验证令牌,具有可配置的 TTL
### 弹性
- **基础设施轮换**——一键蓝绿 Terraform 轮换,跨 5 个云提供商,具有预检、回滚和 age 加密状态
- **轮换调度**——自动化轮换策略:固定间隔、暴露触发、请求计数阈值和交错滚动
- **自动轮换看门狗**——按间隔轮询暴露评分和证书到期;当暴露阈值触发或证书剩余不足 N 天时自动轮换,或回退到仅告警模式并设置成本上限
- **熔断器**——按上游的故障追踪,具有 HEALTHY / PROBING / TRIPPED 状态和可配置的恢复超时,在仪表板的 Upstreams 小部件中实时显示
- **域名前置**——通过 SNI/Host 头拆分进行基于 CDN 的 C2 路由,具有 CDN 头部剥离和 SSRF 保护
- **死人开关**——操作员心跳 TTL,如果操作员未能签到则自动停止 C2 转发
- **紫队镜像**——将允许的事件即发即忘地复制到蓝队收集器以进行交战评分
- **共享状态后端 (Redis)**——可选的跨节点重放缓存、动态白名单、beacon 会话包和丢弃速率限制,使水平扩展的副本看到相同的状态
- **边缘代理**——Cloudflare Worker 和 AWS Lambda 用于通过 CDN 基础设施进行域名前置、边缘国家阻止和主机重写
### 仪表板与操作员工具
- **Web 仪表板**——实时 SPA,具有登录页面、实时请求流、域名统计、顶级被阻止 IP、WebSocket 事件流以及内联阻止/白名单/解除阻止操作
- **诱饵页面管理**——直接从仪表板列出、预览和编辑诱饵 HTML 页面;按域名的 **Canary Overview**(像素 / 隐藏链接 / 隐藏表单切换)以及 **Canary Hits** 面板,显示每个拉取了诱饵资产的扫描器或沙箱
- **具有专用回调端点的诱饵令牌**——注入的追踪像素、隐藏链接和隐藏表单各自在 `/_ig/px|hp|hf?c=<token>` 上触发 `canary_hit` 事件;命中记录到追踪数据库,`filter_result=canary_hit`,并实时流式传输到 Decoys 页面和任何订阅的告警插件
- **Plugins 标签页**——列出已加载的插件,具有运行时 `enable / disable` 切换(无需重启)以及 **Plugin Marketplace**,可一键添加 29 个内置插件中的任何一个;每次变更都持久化到 `config.yaml` 并作为提交落入配置历史仓库
- **Command Post**——多实例聚合仪表板,将来自多个 InfraGuard 节点的统计、请求和实时事件合并到单一视图中,具有 **Fleet Map**(MapLibre),在地理定位的经纬度上绘制每个代理以及每个被阻止的源 IP,以及用于跨实例操作的扇出插件切换
- **终端 UI**——基于 Textual 的 TUI,具有登录屏幕、实时 API 轮询、颜色编码的请求日志
- **交战报告**——自包含的 HTML、JSON 或 CSV 报告,具有按域名的细分、过滤器有效性和操作员审计追踪
- **Prometheus 指标**——`/metrics` 端点暴露请求计数器、上游延迟直方图、熔断器状态、源新鲜度、活动连接以及 Helm HPA 据以扩展的 `infraguard_active_beacons` 仪表
- **OpenTelemetry**——可选的 OTLP 追踪 + 指标导出器;可观测性 compose 配置文件启动 OTEL 收集器以及 Prometheus + 自动配置的 Grafana 概览仪表板
- **Kubernetes Helm chart**——代理、仪表板、Redis StatefulSet、ServiceMonitor 以及基于活动 beacon 仪表的 HPA;位于 `deploy/helm/infraguard/`
### 集成与插件
- **SIEM 集成**——Elasticsearch、Wazuh 和 Syslog (CEF/JSON) 的内置插件,具有批量转发
- **Webhook 告警**——Discord(嵌入)、Slack(Block Kit)、通用 webhook、**PagerDuty**(Events API v2,去重键控)和 **Telegram**(双向运维聊天:从手机执行 `/status`、`/sessions`、`/kill`、`/ack`)的内置插件
- **检测插件**——对请求体运行 YARA 规则、GreyNoise Community 查询、ML 机器人分类器(对 JA4 + UA + 时序进行逻辑回归)、响应金丝雀(canarytokens.org)、p0f v3 指纹识别、JA4/JA4H 增强、GeoIP 增强
- **响应操纵器**——HTML 重写器、载荷水印、签名剥离器、JS 挑战、缓存模仿、慢速 tarpit、影子阻止(向扫描器返回 200,使它们永远不会适应)
- **Phishing.club 集成**——HMAC 签名的 webhook 接收器,摄取钓鱼事件并自动将点击的目标 IP 加入白名单
- **插件系统**——事件驱动架构,具有 `on_event` 钩子、按插件配置和事件过滤;每个插件都可以从仪表板的 **Plugins** 标签页切换或加载,无需重启,并且更改会持久化回 `config.yaml` 并带有配置历史审计提交
### 配置与部署
- **配置加密**——age(整文件)和 SOPS(按值)加密,支持 `.env` 文件
- **配置验证**——CLI 差异工具和 20+ 安全、运维和 TLS 验证检查
- **API 密钥管理**——创建、撤销和轮换 API 密钥,具有按密钥的速率限制、使用追踪和配额
- **后端配置生成**——生成 Nginx、Caddy 或 Apache 配置,具有 TLS、IP 过滤、头部检查、别名和自定义头部
- **规则摄取**——从现有的 `.htaccess` 和 `robots.txt` 文件导入 IP 阻止列表和 User-Agent 模式
- **Docker 部署**——Dockerfile + docker-compose,具有可选的 Let's Encrypt、GeoIP 下载器、PwnDrop 载荷服务器和 Ollama AI 助手
- **GeoIP 支持**——所有三个 GeoLite2 数据库(City、ASN、Country),具有 Docker 自动下载
- **自签名 TLS 回退**——当配置的路径不存在时自动生成证书
- **环境变量支持**——`.env` 文件自动加载;`${VAR}` 语法适用于所有配置值和键
- **可配置的健康端点**——更改健康检查路径以避免指纹识别
- **结构化日志**——通过 structlog 的 JSON 格式结构化日志
- **追踪与持久化**——SQLite 使用 WAL 模式进行请求日志记录、统计、节点注册表、重放哈希和载荷令牌
## 安装指南
查看 [Wiki 页面](https://infraguard.whispergate.org/docs/getting-started/installation/) 了解安装
## CLI 参考```
infraguard --version Show version
infraguard --help Show help
infraguard run -c config.yaml Start the reverse proxy
infraguard run -c config.yaml --port 8443 Override listen port
infraguard run -c config.yaml --host 0.0.0.0 Override bind address
infraguard dashboard -c config.yaml Start the web dashboard
infraguard dashboard -c config.yaml --port 9090 Override dashboard port
infraguard tui Launch TUI with login screen
infraguard tui --url http://host:8080 --token TOK Auto-connect to dashboard
infraguard tui -c config.yaml Read URL/token from config
infraguard command-post -c command-post.yaml Start multi-instance dashboard
infraguard command-post --instance name:url:token Add instance via CLI (repeatable)
infraguard profile parse <file> Parse and display a C2 profile
infraguard profile parse <file> --format json Output as JSON
infraguard profile parse <file> --type brute_ratel Force profile type
infraguard profile convert <file> -o out.json Convert profile to JSON
# Supported --type values: auto, cobalt_strike, mythic, brute_ratel, sliver, havoc, nighthawk, poshc2
# Auto-detection: .profile = CS, .toml = Havoc, .yaml = PoshC2, .json = auto-detect by keys
infraguard ingest <files...> Ingest .htaccess/robots.txt rules
infraguard ingest <files...> --format blocklist Output as IP blocklist
infraguard ingest <files...> --format json Output as JSON
infraguard ingest <files...> -o banned_ips.txt Write blocklist to file
infraguard generate nginx -c config.yaml Generate Nginx config
infraguard generate caddy -c config.yaml Generate Caddyfile
infraguard generate apache -c config.yaml Generate Apache VirtualHost
infraguard init -o config.yaml Generate starter config
infraguard validate -c config.yaml Validate config file
infraguard simulate-beacon -c config.yaml --domain <d> Run one synthetic beacon
through the loaded filter
pipeline in-process
infraguard drop-preview -c config.yaml --domain <d> Render the drop-action
response without any live
traffic (decoy / redirect
/ tarpit preview)
infraguard events tail -c config.yaml Tail the tracking DB as a
structured event stream
infraguard profile transpile <in> --to <c2> Convert a C2 profile
between formats using the
shared profile IR
infraguard preflight -c config.yaml Adversary-emulation
self-test: DNS, cert,
upstream, decoy dir,
writes a Markdown report
infraguard config set <domains.<d>.upstream> <value> Mutate config from CLI;
writes .bak, atomic file
replace, and commit to the
config-history git repo
infraguard config log Show mutation history
infraguard config revert HEAD~N Roll back N mutations
```
### 生成器选项
`generate` 命令接受额外的标志用于操作员自定义:
| 标志 | 描述 |
|---|---|
| `--listen-port PORT` | 覆盖监听端口(默认:来自配置) |
| `--ssl-cert PATH` | 覆盖 SSL 证书路径 |
| `--ssl-key PATH` | 覆盖 SSL 密钥路径 |
| `--redirect-url URL` | 覆盖被阻止请求的重定向 URL |
| `--default-action redirect\|404` | 对不匹配请求的操作 |
| `--no-ip-filter` | 省略 IP 允许/拒绝块 |
| `--no-header-check` | 省略头部验证规则 |
| `--alias DOMAIN:ALIAS` | 添加服务器名称别名(可重复) |
| `--header NAME:VALUE` | 添加自定义响应头(可重复) |
## 指挥所(多实例仪表板)
当在不同的 VPS 或云提供商上运行多个 InfraGuard 实例时,指挥所将所有节点的统计信息、请求和实时事件聚合到一个仪表板中。```
┌─────────────────────────────┐
│ Command Post Dashboard │
│ http://localhost:9090 │
└──────────┬──────────────────┘
│ parallel fetch
┌─────┼──────┬──────────┐
▼ ▼ ▼ ▼
IG-1 IG-2 IG-3 ... IG-N
```

### 快速开始```bash
# Via config file
infraguard command-post -c config/command-post.yaml
# Via CLI args
infraguard command-post \
--instance "prod:https://ig1.example.com:8080:TOKEN1" \
--instance "staging:https://ig2.example.com:8080:TOKEN2" \
--port 9090
# Via Docker
docker compose --profile command-post up -d command-post
```
### 配置
创建 `config/command-post.yaml`:```yaml
instances:
- name: "prod-cs"
url: "https://ig1.example.com:8080"
token: "${IG_PROD_TOKEN}"
- name: "prod-mythic"
url: "https://ig2.example.com:8080"
token: "${IG_MYTHIC_TOKEN}"
- name: "staging"
url: "https://ig3.example.com:8080"
token: "${IG_STAGING_TOKEN}"
port: 9090
# auth_token: "${COMMAND_POST_TOKEN}"
```
### 功能展示
- **合并统计** -- 所有实例的请求总数、允许数、阻止数汇总
- **实例健康状态栏** -- 每个已连接节点的绿色/红色状态
- **交错请求日志** -- 来自所有实例的请求按时间戳排序,每条标记其所属实例名称
- **合并的顶级被阻止 IP** -- 跨所有实例聚合
- **按域统计** -- 来自所有实例的域,并重新计算阻止率
- **实时事件流** -- 来自所有节点的多路复用 WebSocket 事件
- **阻止/白名单操作** -- 分发到所有实例或指定实例
### API 端点
| 端点 | 方法 | 描述 |
|---|---|---|
| `/api/instances` | GET | 列出所有实例及其健康状态 |
| `/api/stats` | GET | 来自所有实例的合并统计 |
| `/api/requests` | GET | 来自所有实例的交错请求日志 |
| `/api/intel/whitelist` | POST | 在所有实例上将 IP 加入白名单 |
| `/api/intel/blocklist` | POST | 在所有实例上阻止 IP |
| `/api/intel/blocklist` | DELETE | 在所有实例上解除对 IP 的阻止 |
| `/ws/events` | WS | 来自所有实例的多路复用实时事件 |
## Docker 部署
### 快速开始```bash
cp .env.example .env
# Edit .env with your domain, teamserver, and token
docker compose up -d
```
这会启动两个服务:
- **proxy** -- 监听 443 和 80 端口的重定向器
- **dashboard** -- 监听 8080 端口的 Web UI
### 使用 Let's Encrypt```bash
# Set in .env:
# INFRAGUARD_LETSENCRYPT=true
# INFRAGUARD_DOMAIN=cdn.example.com
# [email protected]
# Obtain the initial certificate
docker compose --profile letsencrypt up certbot
# Start the proxy (will use the LE cert)
docker compose up -d proxy dashboard
# Start auto-renewal (checks every 12 hours)
docker compose --profile letsencrypt up -d certbot-renew
```
Let's Encrypt 的要求:
- 端口 80 必须可从互联网访问
- `INFRAGUARD_DOMAIN` 必须解析到该主机的公网 IP
- `INFRAGUARD_DOMAIN_EMAIL` 必须是有效的电子邮件地址
### 使用 GeoIP 数据库```bash
# Download all three GeoLite2 databases (City, ASN, Country)
docker compose --profile geoip up geoip-update
# Then start normally - databases are mounted at /app/geoip/
docker compose up -d proxy dashboard
```
### 使用 PwnDrop(载荷投递)```bash
# Start PwnDrop alongside the proxy
docker compose --profile pwndrop up -d pwndrop
# Access PwnDrop admin UI at https://localhost:8443
# InfraGuard reaches it internally at http://pwndrop:80
```
然后在你的配置中配置内容路由,将 payload 路径代理到 PwnDrop:```yaml
domains:
cdn.example.com:
content_routes:
- path: "/downloads/*"
backend:
type: "pwndrop"
target: "http://pwndrop:80"
auth_token: "${PWNDROP_TOKEN}"
```
### 使用 Ollama(AI 辅助配置文件生成)```bash
# Start the Ollama service
docker compose --profile ollama up -d ollama
# Pull the default model (~5 GB)
docker compose --profile ollama exec ollama ollama pull qwen3:8b
# The dashboard's AI chat panel will connect automatically
```
仪表盘环境变量 `INFRAGUARD_OLLAMA_URL` 已在 docker-compose.yml 中预配置。当 Ollama 运行时,AI 助手开关会出现在仪表盘的诱饵和配置文件页面中。
### 扩展```bash
# Run multiple redirector nodes
docker compose up -d --scale proxy-node=3
```
在 `docker-compose.yml` 中取消注释 `proxy-node` 服务以启用。
### 卷
| 卷 | 用途 |
|---|---|
| `./config` | 配置文件(以只读方式挂载) |
| `./examples` | C2 配置文件(以只读方式挂载) |
| `./rules` | 已导入的阻止列表和规则源文件(以只读方式挂载) |
| `./data` | SQLite 数据库和生成的配置文件(持久化) |
| `certs` | TLS 证书(在代理和 certbot 之间共享) |
| `geoip` | GeoLite2 数据库(由 `geoip-update` 服务填充) |
| `pwndrop-data` | PwnDrop 上传的文件和数据库 |
| `ollama-data` | Ollama 模型权重和配置 |
> 在 Linux 主机上,如果你希望由仪表板驱动的变更
> (drop-action、配置文件切换、插件开关)持久化回 `config.yaml`,请执行 `chown -R 1000:1000 config/`。
> 容器的非 root uid 需要对挂载点具有写权限。
## Kubernetes 部署
`deploy/helm/infraguard/` 下的 Helm chart 会部署代理、仪表板、Redis
StatefulSet,以及一个基于 `infraguard_active_beacons`
自定义指标对代理进行扩缩的 HPA(需要集群内的 `prometheus-adapter`)。完整指南请参阅 wiki 的
[Kubernetes 部署](https://infraguard.whispergate.org/docs/deployment/kubernetes/)
页面。```bash
# One-shot install
helm install infraguard deploy/helm/infraguard \
--namespace infraguard --create-namespace \
-f my-values.yaml
# Get the API token the chart minted
kubectl get secret -n infraguard infraguard-secrets \
-o jsonpath='{.data.INFRAGUARD_API_TOKEN}' | base64 -d
```
该图表的探针使用 `scheme: HTTPS` 访问 HTTPS 监听器上的 `/health`,因此容器需要在配置中包含 `tls:` 块(自签名回退即可)。
## 贡献
- Mgeeky - 原始想法([RedWarden](https://github.com/mgeeky/RedWarden))
- curi0usJack - [.htaccess 规则](https://gist.github.com/curi0usJack/971385e8334e189d93a6cb4671238b10)
- 配置文件
- threatexpress - [jquery-c2.3.14.profile](https://github.com/threatexpress/malleable-c2/blob/master/jquery-c2.3.14.profile)
- InfinityCurve - [Havoc 配置文件](https://github.com/whispergate/infraguard/blob/main/examples/kaine.toml)
- C2 框架
- [Cobalt Strike](https://www.cobaltstrike.com/) - 支持 Malleable C2 配置文件
- [Mythic](https://github.com/its-a-feature/Mythic) - 支持 HTTPX 配置文件 + 文件暂存
- [Brute Ratel C4](https://bruteratel.com/) - 支持服务器配置配置文件
- [Sliver](https://github.com/BishopFox/sliver) - 支持 HTTP C2 配置文件
- [Havoc](https://www.infinitycurve.org/) - 支持 TOML 配置文件
- [Nighthawk](https://nighthawkc2.io/) - 支持 JSON 监听器配置
- [PoshC2](https://github.com/nettitude/PoshC2) - 支持 YAML 配置
如果您想为该项目做出贡献,请创建一个以版本名命名的新分支,并在拉取请求中指定相同的版本名。例如:branch=v1.2.3 | [v1.2.3] 添加了某某项。
## 许可证
BSD 2-Clause 许可证。详情请参阅 [LICENSE](https://github.com/whispergate/infraguard/blob/main/LICENSE)。
版权所有 (c) 2026, Whispergate