Homas/ioc2rpz
GitHub: Homas/ioc2rpz
ioc2rpz 是一款用 Erlang 编写的专用 DNS 服务器,将威胁情报指标自动转换为 RPZ 响应策略区并分发给下游 DNS 服务器,实现 DNS 层面的恶意流量阻断。
Stars: 113 | Forks: 18
# ioc2rpz™ 让您的威胁情报变得可操作
[](https://opensource.org/licenses/Apache-2.0)
[](https://www.erlang.org/)
[](https://hub.docker.com/r/pvmdel/ioc2rpz)
## 目录
- [简述](#short-summary)
- [概述](#overview)
- [ioc2rpz™:威胁情报与 DNS 的交汇点](#ioc2rpz-is-a-place-where-threat-intelligence-meets-dns)
- [架构概述](#architecture-overview)
- [如何使用 ioc2rpz™](#how-to-use-ioc2rpz)
- [ioc2rpz™ Web 界面](#ioc2rpz-web-interface)
- [协议支持](#protocol-support)
- [端口摘要](#port-summary)
- [UDP (端口 53)](#udp-port-53)
- [TCP (端口 53)](#tcp-port-53)
- [DNS over TLS / DoT (端口 853)](#dns-over-tls--dot-port-853)
- [DNS over HTTPS / DoH (端口 443/8443)](#dns-over-https--doh-port-4438443)
- [速率限制](#rate-limiting)
- [DNS NOTIFY](#dns-notify)
- [ioc2rpz™ 对比 ISC BIND 及其他 DNS](#ioc2rpz-vs-isc-bind-vs-other-dns)
- [安装](#installation)
- [Docker 容器](#docker-container)
- [环境变量](#environment-variables)
- [Docker Compose](#docker-compose)
- [AWS 上的 ioc2rpz™](#ioc2rpz-on-aws)
- [证书设置](#certificate-setup)
- [从源码构建](#building-from-source)
- [ioc2rpz™ 管理](#ioc2rpz-management)
- [通过 DNS 管理](#via-dns)
- [通过 REST 管理](#via-rest)
- [监控与健康检查](#monitoring--health-checks)
- [故障排除](#troubleshooting)
- [配置文件](#configuration-file)
- [预定义配置值](#predefined-configuration-values---includeioc2rpzhrl)
- [AXFR 和 IXFR 缓存的更新方式](#how-the-axfr-full-and-ixfr-incremental-caches-are-updated)
- [热缓存](#hot-cache)
- [如何试用 ioc2rpz™](#how-to-try-ioc2rpz-or-sample-and-free-rpz-feeds-hosted-by-ioc2rpz)
- [一些免费的威胁情报源](#some-free-threat-intelligence-feeds)
- [更多文档](#further-documentation)
- [参考文献](#references)
- [支持者/捐助者](#do-you-want-to-support-to-the-project)
- [联系我们](#contact-us)
- [许可证](#license)
## 简述
ioc2rpz™:DNS 安全解决方案 - ioc2rpz™ 是一款功能强大的 DNS 服务器,可将威胁指标转化为可操作的响应策略区域 (RPZ) 数据源。它自动化了更新过程,确保您的网络免受包括恶意域名和 IP 地址在内的最新威胁。通过将 IOC 数据源转换为 RPZ,ioc2rpz™ 在威胁情报与 DNS 安全之间架起了关键桥梁,并兼容支持 RPZ 的 DNS 服务器(如 ISC BIND 或 PowerDNS)。
## 概述
DNS 是互联网的控制平面。通常 DNS 被用于正当目的,但是:
- 它可以被用来追踪用户位置及其行为;
- 恶意软件利用 DNS 进行命令与控制、数据窃取或流量重定向;
- 根据 2016 年思科年度安全报告,91.3% 的恶意软件使用了 DNS;
- 广告公司通常使用独立且隐晦的域名来展示广告;
- 免费 DNS 服务(例如 1.1.1.1、8.8.8.8、9.9.9.9 等)可以帮助您解决一些问题,但您无法定义自己的保护设置或广告过滤器。
## 预定义配置值 - include/ioc2rpz.hrl
include/ioc2rpz.hrl 包含预编译的参数。
标准参数:
- ``MGMToDNS`` (true/false) - 启用通过 DNS/TCP 进行管理;
- ``DBStorage`` (ets) - 定义 AXFR 和 IXFR 缓存的数据库存储。当前版本仅支持 ETS;
- ``SaveETS`` (true/false) - 定义是否应将 ETS AXFR/IXFR 表保存在磁盘上;
- ``Port``(数值,1 - 65535)- 定义服务运行的 DNS 端口;
- ``PortTLS``(数值,1 - 65535)- 定义服务运行的 DoT 端口;
- ``PortREST``(数值,1 - 65535)- 定义服务运行的 HTTPs 端口;
- ``TTL``(数值,以秒为单位)- DNS 记录/RPZ 规则的默认 TTL。
- ``DefConf``(字符串)- 默认配置文件;
- ``DefDB``(字符串)- 默认数据库路径;
- ``logTS`` - 如果已定义,则在日志消息中添加时间戳;
- ``debug`` - 如果已定义,则打印调试日志消息;
- ``TLSVersion`` ('tlsv1.2-1.3') - DoT 和 REST API 支持的 TLS 版本;
优化参数:
- ``DNSPktMax``(数值,100 - 65535)- 最大数据包大小。推荐值:
- 16384 - 最小区域传送大小;
- 65535 - 最小 DNS 数据包数量;
- ``Compression``(数值,0 - 9)- 压缩级别(0 - 无压缩,9 - 最高压缩)。AXFR 缓存和磁盘上的表存储压缩数据;
- ``ZoneRefTime``(数值,以毫秒为单位)- 定义区域刷新检查间隔;
- ``TCPTimeout``(数值,以毫秒为单位)- 定义 TCP 会话超时时间;
- ``HotCacheTime``(数值,以秒为单位)- IOC、规则、数据包的热缓存时间。实时区域存储在热缓存中;
- ``HotCacheTimeIXFR``(数值,以秒为单位)- 热缓存中 IXFR IOC 的热缓存时间。默认情况下,IXFR 指标会被缓存一分钟(即使设置为 0),因为当前序列号总是向下取整到前一分钟;
- ``RATE_LIMIT_WINDOW``(数值,以毫秒为单位,默认 10000)- 每个 IP 的速率限制窗口持续时间;
- ``MAX_REQUESTS_PER_WINDOW``(数值,默认 1)- 每个 IP 在每个速率限制窗口内的最大 DNS 请求数;
-ShellMaxRespSize``(数值,默认 2 GiB)- shell 命令源的最大响应大小;
- ``SourcePullTimeout``(数值,以毫秒为单位,默认 300000)- 源下载超时(5 分钟);
## AXFR(完整)和 IXFR(增量)缓存如何更新
- AXFR 缓存始终包含没有 SOA/NS/TSIG 记录的预建区域。预建意味着所有记录都已按数据包拆分,且标签已被缩短/压缩。
- 如果服务器收到 AXFR 请求,它将从 AXFR 缓存中检索数据包,并根据需要添加 SOA/NS 记录和 TSIG。
- AXFR 区域更新应被视为一种清理过程,应定期进行。只是为了确保源和缓存之间没有失去同步。
- 对于大型区域,应不频繁地安排 AXFR 更新,以尽量减少对服务器性能和所有客户端数据传输量的影响。
- 如果可能,所有更改都应通过增量区域更新完成。在这种情况下,只有在区域被更新时才会重建 AXFR 缓存。
- [TODO] 由于优化,对于新的 IOC 只会重建最后一个数据包,而对于过期的 IOC 则重建相关和对应的数据包。
- IXFR 缓存仅包含 IOC 和过期日期。[TODO] 以及数据包 ID(以使其可以快速重建区域)。
- RPZ 记录包含当前区域的 Serial 和 Serial_IXFR。Serial_IXFR 作为可用于增量区域传送的最小增量区域序列号。
- 在完整区域更新 (AXFR) 后,IXFR 缓存会被清空。Serial_IXFR = Serial。在任何情况下客户端都将收到完整的区域更新,这就是为什么不频繁地进行 AXFR 区域传送很重要的原因。
- 当 IXFR 缓存被更新时,必须重建 AXFR 缓存。
- 如果某个区域不支持 IXFR 更新 -> 它不会保存在 IXFR 表中。
- 实时区域不会缓存在 AXFR、IXFR 缓存中,但其源 (IOC) 可以缓存在热缓存中。
## 热缓存
所有 IOC、规则、数据包(包括实时 RPZ)都存储在热缓存中。预编译参数 ``HotCacheTime``、``HotCacheTimeIXFR`` 定义了存储时间。
## 如何试用 ioc2rpz™(或由 ioc2rpz™ 托管的示例和免费 RPZ 数据源)
### 免责声明
作者对这些 RPZ 数据源中的任何错误或遗漏不承担任何责任或义务。这些数据源按“原样”提供,不保证完整性、准确性、实用性或时效性,仅用于演示 ioc2rpz™ 技术。RPZ 数据源的分发服务可能会在不提前通知的情况下中断或停止。作者对因使用本服务而造成的任何直接或间接损害概不负责。
### RPZ 数据源
如果您在 [ioc2rpz™ 社区](https://ioc2rpz.net)注册,您可以使用以下数据源测试 ioc2rpz™ 技术:
- [notracking](https://github.com/notracking/hosts-blocklists);
- [Phishtank](https://www.phishtank.com/)。
### BIND 示例配置
```
options {
#This is just options for RPZs. Add other options as required
recursion yes;
response-policy {
####FQDN only zones
####Mixed zones
zone "phishtank.ioc2rpz" policy nxdomain;
####IP only zones
} qname-wait-recurse no break-dnssec yes;
};
key "ioc2rpz-YOUR-UNIQUE-KEY-NAME"{
algorithm hmac-sha256; secret "ioc2rpz-YOUR-UNIQUE-KEY";
};
zone "phishtank.ioc2rpz" {
type slave;
file "/var/cache/bind/phishtank.ioc2rpz";
masters {94.130.30.123 key "ioc2rpz-YOUR-UNIQUE-KEY-NAME";};
};
```
### PowerDNS 示例配置
```
rpzMaster("94.130.30.123", "phishtank.ioc2rpz", {defpol=Policy.NXDOMAIN, tsigname="ioc2rpz-YOUR-UNIQUE-KEY-NAME", tsigalgo="hmac-sha256", tsigsecret="ioc2rpz-YOUR-UNIQUE-KEY"})
```
### Infoblox 示例配置(导入文件)
```
header-responsepolicyzone,fqdn*,zone_format*,rpz_policy,substitute_name,view,zone_type,external_primaries,grid_secondaries,priority
responsepolicyzone,phishtank.ioc2rpz,FORWARD,Nxdomain,,default,responsepolicy,srv_1/94.130.30.123/FALSE/FALSE/TRUE/ioc2rpz-YOUR-UNIQUE-KEY-NAME/ioc2rpz-YOUR-UNIQUE-KEY/HMAC-SHA256,infoblox.localdomain/False/False/False,0
```
### DIG 示例(获取 SOA)
```
dig @94.130.30.123 -y hmac-sha256:ioc2rpz-YOUR-UNIQUE-KEY-NAME:ioc2rpz-YOUR-UNIQUE-KEY phishtank.ioc2rpz SOA
kdig @94.130.30.123 -y hmac-sha256:ioc2rpz-YOUR-UNIQUE-KEY-NAME:ioc2rpz-YOUR-UNIQUE-KEY phishtank.ioc2rpz SOA +tls
```
## 一些免费的威胁情报源
- [Netlab](http://data.netlab.360.com)
- [GitHub 上的 awesome-threat-intelligence 列表](https://github.com/hslatman/awesome-threat-intelligence)
您可以在 Wiki 页面上找到其他 IOC 数据源:https://github.com/Homas/ioc2rpz/wiki/IOC-Sources。
## 更多文档
有关详细的文档,请参见 `docs/` 目录:
- [docs/architecture.md](docs/architecture.md) — OTP 监督树、模块职责、ETS 表、数据流
- [docs/configuration.md](docs/configuration.md) — 包含所有元组类型和选项的完整配置参考
- [docs/deployment.md](docs/deployment.md) — 构建说明、Docker 部署、证书、监控、故障排除
- [docs/protocols.md](docs/protocols.md) — 协议支持 (UDP/TCP/DoT/DoH)、REST API、TSIG、速率限制、DNS NOTIFY
## 参考文献
- [RFC-6895 Domain Name System (DNS) IANA Considerations](https://tools.ietf.org/html/rfc6895)
- [RFC-1035 Domain Names - Implementation and Specification](https://tools.ietf.org/html/rfc1035)
- [RFC-1995 Incremental Zone Transfer in DNS](https://tools.ietf.org/html/rfc1995)
- [DNS Response Policy Zones (RPZ)](https://tools.ietf.org/html/draft-ietf-dnsop-dns-rpz-00) + [vixie](https://tools.ietf.org/html/draft-vixie-dns-rpz-02)
- [RFC-2845 Secret Key Transaction Authentication for DNS (TSIG)](https://tools.ietf.org/html/rfc2845)
- [RFC-2104 HMAC: Keyed-Hashing for Message Authentication](https://tools.ietf.org/html/rfc2104)
- [RFC-4635 HMAC SHA TSIG Algorithm Identifiers](https://tools.ietf.org/html/rfc4635)
- [RFC-5966 DNS Transport over TCP - Implementation Requirements](https://tools.ietf.org/html/rfc5966)
- [RFC-1996 A Mechanism for Prompt Notification of Zone Changes (DNS NOTIFY)](https://tools.ietf.org/html/rfc1996)
- [Extension Mechanisms for DNS (EDNS(0))](https://tools.ietf.org/html/rfc6891) + [EDNS Option Codes](https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-11)
- [RFC-7873 Domain Name System (DNS) Cookies](https://tools.ietf.org/html/rfc7873)
- [RFC-7858 Specification for DNS over Transport Layer Security (TLS)](https://tools.ietf.org/html/rfc7858)
- [Cowboy Web Server](https://ninenines.eu)
- [Rebar3](https://www.rebar3.org)
# 您想支持这个项目吗?
您可以通过 [GitHub Sponsor](https://github.com/sponsors/Homas)(定期付款)支持 ioc2rpz™ 项目和 ioc2rpz™ 社区。要进行一次性捐款,您可以使用 [PayPal](https://paypal.me/ioc2rpz) 或 Zelle(我们的邮箱:zelle [at] ioc2rpz [.] net)。
# 支持者
感谢 **craSH** 和 **rrbone** 在 [GitHub Sponsor](https://github.com/sponsors/Homas) 上对我的项目的支持。
# 联系我们
您可以通过电子邮件联系我们:feedback(at)ioc2rpz[.]net,或者在 [Telegram](https://t.me/ioc2rpz) 上联系。
# 许可证
版权所有 2017 - 2025 Vadim Pavlov ioc2rpz[at]gmail[.]com
根据 Apache 许可证 2.0 版("许可证")获得许可;除非遵守许可证,否则您不得使用此文件。
您可以在以下位置获取许可证副本:
```
http://www.apache.org/licenses/LICENSE-2.0
```
除非适用法律要求或书面同意,否则根据许可证分发的软件是按“原样” basis 分发的,不附带任何明示或暗示的担保或条件。请参阅许可证以了解管辖权限和限制的具体语言。

示例配置文件(点击展开)
``` {srv,{"ns1.rpz-proxy.com","support.rpz-proxy.com",["dnsmkey_3"],["127.0.0.1","10.42.0.10"]}}. {cert,{"cfg/ioc2rpz_dot.crt", "cfg/ioc2rpz_dot.key", ""}}. {key,{"dnsproxykey_1","md5","apXqLsDs90H213eV6LS9ryYp5tY8YTpkttOkRCve7dp1Zeob3SGAbaVU9BShpsW25MmR8mTiX5OY0Qetv977Yw=="}}. {key,{"dnsproxykey_2","sha512","03uuaGl9kqfenjRgIeCv6e29lVvMwviB1+cDX1I0jcVOcTU4jWFwRkfo3ULRMD+NGDfwzYvXkJ94FNEaAW4vzw=="}}. {key,{"dnsmkey_3","sha512","03uuaGl9kqfenjRgIeCv6e29lVvMwviB1+cDX1I0jcVOcTU4jWFwRkfo3ULRMD+NGDfwzYvXkJ94FNEaAW4vzw=="}}. {whitelist,{"whitelist_1","file:cfg/sample_whitelist.txt",none}}. {whitelist,{"whitelist_2","file:cfg/whitelist2.txt",""}}. {source,{"sample_fqdn","file:cfg/sample_ioc_fqdn.txt","[:AXFR:]",none}}. {source,{"sample_expire","file:cfg/sample_ioc_expire.txt","[:AXFR:]","^([A-Za-z0-9][A-Za-z0-9\\-\\._]+)\\t([0-9TZ:\\-]+)$"}}. {source,{"sample_ip","file:cfg/sample_ioc_ip.txt","[:AXFR:]",none}}. {rpz,{"localdata.ioc2rpz",7202,3600,2592000,7200,"false","true",[{"local_aaaa","fe80::1"},{"local_a","127.0.0.1"},{"local_a","127.0.0.2"},{"local_a","127.0.0.3"},{"local_a","127.0.0.4"},{"local_cname","www.example.com"},{"local_txt","Text Record www.example.com"},{"local_txt","Text Record 2"}],["dnsproxykey_1", "dnsproxykey_2"],"mixed",30,30,["sample_fqdn"],[],["whitelist_1","whitelist_2"]}}. {rpz,{"dga.ioc2rpz",7202,3600,2592000,7200,"true","true","nodata",["dnsproxykey_1","dnsproxykey_2"],"fqdn",172800,3600,["sample_expire"],[],[]}}. {rpz,{"mixed.ioc2rpz",7202,3600,2592000,7200,"true","true","passthru",["dnsproxykey_1", "dnsproxykey_2"],"mixed",86400,3600,["sample_fqdn","sample_expire"],[],["whitelist_1","whitelist_2"]}}. {rpz,{"ip-block.ioc2rpz",7202,3600,2592000,7200,"false","true","nxdomain",["dnsproxykey_1","dnsproxykey_2"],"ip",172800,0,["sample_ip"],[],[]}}. ```CEF 事件代码参考(点击展开)
| 代码 | 严重性 | 事件 | 描述 | |------|----------|-------|-------------| | 101 | 低 | 错误的 DNS 数据包 | 收到格式错误的 DNS 数据包 | | 102 | 低 | 错误的 DNS 请求 | 无法解析的 DNS 请求 | | 103 | 中 | 已拒绝 | DNS 请求被拒绝 | | 104 | 中 | 找不到 TSIG 密钥 | 请求使用了未知的 TSIG 密钥 | | 105 | 中 | TSIG 错误的 MAC | TSIG 签名验证失败 | | 106 | 中 | TSIG 错误的时间 | TSIG 时间戳超出范围 | | 107 | 中 | 其他 TSIG 错误 | 未分类的 TSIG 错误 | | 108 | 中 | 错误的 TSIG 位置 | TSIG 记录出现在意外位置 | | 109 | 低 | 收到 DNS 响应 | 收到意外的 DNS 响应 | | 120 | 中 | 找不到 RPZ | 请求的 RPZ 区域不存在 | | 121 | 低 | RPZ 未就绪 | RPZ 区域仍在加载/更新中 | | 130 | 低 | RPZ 传送错误 | 区域传送期间发生错误 | | 131 | 低 | RPZ 传送关闭 | 远程端在传送期间关闭了连接 | | 135 | 高 | REST 管理被拒绝 | REST 管理请求被 ACL 拒绝 | | 136 | 高 | 管理请求失败 | 管理请求处理失败 | | 137 | 高 | 不支持的请求 | 未知的 REST API 端点 | | 138 | 高 | 找不到区域 | REST API 引用了不存在的区域 | | 140 | 高 | REST 基础认证失败 | REST API 基础认证失败 | | 141 | 高 | REST 授权失败 | REST API 授权失败 | | 150 | 低 | Shell 命令已执行 | Shell 源命令已执行(信息) | | 151 | 高 | Shell 命令被拒绝 | Shell 源命令被拒绝(安全原因) | | 201 | 低 | RPZ 传送成功 | 区域传送完成 | | 202 | 低 | DNS 查询 | 已处理标准 DNS 查询 | | 221 | 低 | DNS 通知 | 已向辅助服务器发送通知 | | 222 | 中 | DNS 通知错误 | 发送通知失败 | | 230 | 高 | 管理请求 | 已执行管理操作 | | 301 | 高 | 管理请求被拒绝 | DNS 管理命令被拒绝 | | 429 | 高 | 请求过多 | 超出速率限制 | | 501 | 高 | 疑似 DDoS | 检测到 CVE-2004-0789 攻击模式 |标签:AWS, AXFR, DNS over HTTPS, DNS over TLS, DNS服务器, DNS防火墙, Docker, Docker Compose, DoH, DoT, DPI, Erlang, Erlang/OTP, IoC, IXFR, NIDS, REST API, RPZ, 云部署, 响应策略区, 域名安全, 威胁情报, 威胁阻断, 安全监控, 安全防御评估, 容器化, 开发者工具, 开源, 情报转换, 网络安全, 网络过滤, 请求拦截, 隐私保护, 黑名单

