soakes/blackhole-threats

GitHub: soakes/blackhole-threats

一个 Go 实现的 RTBH 守护进程,将威胁情报自动转换为 BGP 黑洞路由并宣告至下游。

Stars: 0 | Forks: 0

# 🛡️ Blackhole Threats [![Validate](https://img.shields.io/github/actions/workflow/status/soakes/blackhole-threats/build-and-validate.yml?branch=main&style=flat-square&label=validate)](https://github.com/soakes/blackhole-threats/actions/workflows/build-and-validate.yml) [![Container](https://img.shields.io/github/actions/workflow/status/soakes/blackhole-threats/container-image.yml?branch=main&style=flat-square&label=container)](https://github.com/soakes/blackhole-threats/actions/workflows/container-image.yml) [![Release](https://img.shields.io/github/v/release/soakes/blackhole-threats?sort=semver&style=flat-square)](https://github.com/soakes/blackhole-threats/releases) [![APT Repository](https://img.shields.io/badge/APT-signed%20repo-A81D33?style=flat-square&logo=debian&logoColor=white)](https://soakes.github.io/blackhole-threats/) [![GHCR](https://img.shields.io/badge/GHCR-published-2088FF?style=flat-square&logo=github)](https://ghcr.io/soakes/blackhole-threats) [![Go](https://img.shields.io/badge/Go-1.24%2B-00ADD8.svg?style=flat-square&logo=go&logoColor=white)](https://go.dev/) [![License](https://img.shields.io/badge/License-MIT-2EA043.svg?style=flat-square)](LICENSE) [![Buy Me a Coffee](https://img.shields.io/badge/Buy%20Me%20a%20Coffee-support-FFDD00?style=flat-square&logo=buymeacoffee&logoColor=000000)](https://buymeacoffee.com/soakes) 为需要单一服务、单一配置格式和单一发布路径的操作者而构建 他们可以实际部署:源码构建、容器镜像、Debian 包 以及一个签名 APT 仓库。 **快速链接:** [📦 Releases](https://github.com/soakes/blackhole-threats/releases) · [🐳 GHCR](https://ghcr.io/soakes/blackhole-threats) · [🔐 APT Repository](https://soakes.github.io/blackhole-threats/) · [🏗️ Architecture](docs/architecture.md) ## 🧭 Table of Contents - [📖 Overview](#overview) - [✨ Capabilities](#capabilities) - [🔄 How It Works](#how-it-works) - [✅ Prerequisites](#✅-prerequisites) - [🚀 Installation](#installation) - [⚙️ Configuration](#configuration) - [🌐 Feed Sources and Formats](#feed-sources-and-formats) - [🧪 Usage](#usage) - [🐳 Container](#container) - [📦 Debian Package](#debian-package) - [🔐 APT Repository](#apt-repository) - [🤖 CI/CD and Release Automation](#cicd-and-release-automation) - [🗂️ Project Structure](#project-structure) - [🩺 Troubleshooting](#troubleshooting) - [🤝 Contributing](#contributing) - [📄 License](#license) ## 📖 Overview `blackhole-threats` 是一个 Go RTBH 路由服务器。它读取本地或远程威胁 源,提取 IPv4 和 IPv6 网络,进行汇总,并通过 BGP 广播 结果路由,以便下游路由器可以应用黑洞策略。 在正常运行时,服务执行以下四项操作: - 从 YAML 加载 GoBGP 和 feed 配置 - 获取并解析配置的 feeds - 计算当前广播路由集与已有路由的增量 - 在刷新循环中宣布新路由并撤销过期路由 该仓库将此工作流程打包为单一服务,提供第一方 源码构建、容器镜像、Debian 包以及签名 APT 仓库。 ### 快速开始 选择与你的部署方式匹配的路径: - **容器**:拉取 `ghcr.io/soakes/blackhole-threats:latest` 获取最新标记版本 - **Debian**:使用签名 APT 仓库并安装 `blackhole-threats` - **源码**:运行 `make build` 并执行 `dist/blackhole-threats` - **验证**:在将守护进程投入生产前使用 `-check-config` 或 `-once` ### 首次部署检查清单 1. 复制 [`examples/blackhole-threats.yaml`](examples/blackhole-threats.yaml) 并替换本地 ASN、路由器 ID、对等体以及网络对应的 feed 社区。 2. 使用 `./dist/blackhole-threats -conf /path/to/blackhole-threats.yaml -check-config` 验证文件。 3. 使用 `-once` 与一个非特权 BGP 端口进行首次冒烟测试,然后再绑定到生产端口 `179`。 4. 启动守护进程并检查启动日志中的 `tag_version`、`local_as`、`router_id`、`peer_count` 以及首个 `Refresh completed` 行。 5. 仅在一键验证路径确认无误后,才启用自动服务启动。 ### 动机与谱系 最初的 `blackhole-threats` 项目由 Eric Barkie 创建,确立了基于 GoBGP 广播威胁源路由的基本模式。该仓库于 2026 年 3 月 31 日归档。 本仓库沿用相同的工作模型,使用当前的 Go 工具链、Debian 打包、容器发布、 GitHub Actions 工作流以及自动化的 pin 刷新。 原始项目与创意的归属: - 原始仓库: - 原始项目标题:`Blackhole threats (with GoBGP)` ## ✨ 功能 - **Feed 摄取**:读取本地文件以及 `http://` 和 `https://` 源 - **格式处理**:解析纯文本、JSON、JSONL 和 NDJSON feeds - **前缀支持**:提取并汇总 IPv4 和 IPv6 网络 - **社区控制**:支持每个 feed 的 BGP 社区,默认使用 `<本地 ASN>:666` - **运行时控制**:支持周期性刷新、`SIGUSR1`、`-check-config` 和 `-once` - **故障处理**:当 feed 刷新失败时保留最后有效的社区状态 - **日志记录**:输出结构化的 logfmt 风格日志,便于 Docker、journald 和 syslog 管道使用 - **分发**:发布二进制发行版、多架构容器镜像、Debian 包和签名 APT 仓库 - **自动化**:包含验证、发布发布以及固定依赖刷新工作流 ## 🔄 工作原理 在运行时,`blackhole-threats` 遵循一个简单的路由生命周期: ``` flowchart TD A[Load YAML configuration] --> B[Merge configured feeds and extra -feed arguments] B --> C[Start embedded GoBGP server] C --> D[Fetch configured feeds concurrently] D --> E[Parse IPv4 and IPv6 prefixes] E --> F[Summarise overlapping prefixes] F --> G[Group routes by BGP community] G --> H[Diff against currently advertised routes] H --> I[Announce new routes] H --> J[Withdraw stale routes] I --> K[Wait for refresh interval or SIGUSR1] J --> K K --> D ``` 如果某个社区的 feed 刷新失败,守护进程会保留该社区的最后有效路由 并在下一个刷新周期重试,而不是在部分输入时撤销。 1. 从 `blackhole-threats.yaml` 或配置路径加载 YAML 配置。 2. 合并配置的 feeds 与任何额外的 `-feed` CLI 参数。 3. 启动嵌入式 GoBGP 服务器。 4. 并发获取所有配置的 feeds。 5. 从每个源解析 IPv4 和 IPv6 前缀。 6. 汇总重叠前缀以减少路由抖动。 7. 按 BGP 社区对路由进行分组。 8. 对新路由集与当前路由集进行差分。 9. 宣布新路由并撤销过期路由。 10. 按照配置的刷新间隔重复,或在收到 `SIGUSR1` 时立即刷新。 有关软件包布局和组件边界,请参见 [docs/architecture.md](docs/architecture.md)。 ## ✅ 先决条件 - 一个运行 BGP 的环境,下游路由器可以与本服务建立对等 - 用于本地 ASN、路由器 ID 和对等体的有效 GoBGP 配置 - 一个或多个可访问的威胁源,支持: - 本地文件 - `http://` URL - `https://` URL - 如果从源码构建,需要 Go `1.24+` - 如果运行容器镜像,需要 Docker - 如果本地构建 `.deb` 包,需要 Debian 打包工具 ## 🚀 安装 ### 从源代码构建 ``` git clone https://github.com/soakes/blackhole-threats.git cd blackhole-threats make build ``` 这会生成: ``` dist/blackhole-threats ``` 最低支持的 Go 版本与 Debian trixie 的打包保持同步。 GitHub Actions 和容器构建会独立跟踪当前稳定的 Go 发行版。 ### 运行发布的容器 ``` docker pull ghcr.io/soakes/blackhole-threats:latest ``` `latest` 跟踪稳定的标记版本。默认分支镜像发布为 `ghcr.io/soakes/blackhole-threats:main`,发布候选版本发布到 `ghcr.io/soakes/blackhole-threats:rc` 通道以及完整的 `v*-rc.*` 标签。 ### 构建 Debian 包 ``` make package ``` 这需要 Debian 打包工具,例如 `debhelper`、`golang-any` 和 `devscripts`。 ## ⚙️ 配置 服务使用一个包含两个主要部分的 YAML 文件: - `gobgp`:GoBGP 配置集 - `feeds`:摄取的威胁情报源 一个可立即编辑的参考文件位于 [`examples/blackhole-threats.yaml`](examples/blackhole-threats.yaml)。 该文件是一个包含多个对等体、混合 IPv4/IPv6 邻居以及更广泛 feed 集合的完整参考示例。 下面是简要的 README 版本,用于保持页面可读。 ### 示例配置 ``` gobgp: global: config: as: 64520 routerid: "198.51.100.10" neighbors: - config: neighboraddress: "198.51.100.1" peeras: 64520 - config: neighboraddress: "203.0.113.1" peeras: 64520 - config: neighboraddress: "2001:db8:10::1" peeras: 64520 - config: neighboraddress: "2001:db8:20::1" peeras: 64520 feeds: - url: http://localhost:41412/security/blocklist community: 64520:1100 - url: https://team-cymru.org/Services/Bogons/fullbogons-ipv4.txt community: 64520:1101 - url: https://team-cymru.org/Services/Bogons/fullbogons-ipv6.txt community: 64520:1101 - url: https://www.spamhaus.org/drop/drop_v4.json community: 64520:1102 - url: https://www.spamhaus.org/drop/drop_v6.json community: 64520:1103 - url: https://rules.emergingthreats.net/fwrules/emerging-Block-IPs.txt community: 64520:1107 - url: https://sslbl.abuse.ch/blacklist/sslipblacklist.txt community: 64520:1108 ``` ### 配置说明 - 如果省略 `community`,服务会默认将其设为 `<本地 ASN>:666` - 社区必须写作 `:` 格式 - 每个社区组件必须在范围 `0-65535` 内 - 支持本地文件路径作为 feed URL - 刷新计时器默认为 `2h` - 示例配置使用 RFC 5737 IPv4 和 RFC 3849 IPv6 文档地址;请替换为真实的路由器 ID 和对等地址 ### RouterOS 示例 RouterOS 过滤规则示例作为起点包含在下方。根据你的网络调整 ASN、地址和策略。 #### RouterOS v6 ``` /routing bgp instance set default as=64512 /routing bgp peer add address-families=ip,ipv6 allow-as-in=2 in-filter=threats-in name=threats remote-address=\ 192.168.1.2 ttl=default /routing filter add action=accept address-family=ip bgp-communities=64512:666 chain=threats-in comment=\ "Blackhole IPv4 C&C and don't route or peer addresses" protocol=bgp set-type=blackhole add address-family=ipv6 bgp-communities=64512:666 chain=threats-in comment=\ "Unreachable IPv6 C&C and don't route or peer addresses" protocol=bgp set-type=unreachable ``` #### RouterOS v7 ``` /routing bgp template set default as=64512 disabled=no routing-table=main /routing bgp connection add address-families=ip,ipv6 as=64512 disabled=no input.allow-as=2 .filter=threats-in local.role=ibgp \ name=threats remote.address=192.168.1.2 routing-table=main templates=default /routing filter rule add chain=threats-in comment="Blackhole C&C and don't route or peer addresses" disabled=no rule=\ "if (bgp-communities equal 64512:666) {set blackhole yes; accept}" ``` ## 🌐 源和格式 `blackhole-threats` 支持从磁盘和网络摄取 feed。 ### 支持的来源 - 没有 URI 方案的本地文件 - `http://` 端点 - `https://` 端点 ### 支持的格式 - 纯文本前缀列表 - JSON - JSONL - NDJSON ### 纯文本 feed 解析 对于纯文本 feed,解析器会: - 忽略空行 - 忽略以 `#`、`;` 或 `//` 开头的注释行 - 从混合内容行提取前缀或单个 IP - 接受 IPv4 和 IPv6 条目 ### JSON feed 解析 对于 JSON 派生的 feed,解析器会查找常见字段,例如: - `cidr` - `prefix` - `ip` - `address` 自动将单个 IP 地址转换为对应的主机前缀。 支持顶层的 JSON 数组和行分隔的 JSON 流。 ### 示例公共 feeds - [AbuseIPDB export by tmiland](https://abuseipdb.tmiland.com/abuseipdb.txt) - [abuse.ch Botnet C2 IP Blacklist](https://sslbl.abuse.ch/blacklist/sslipblacklist.txt) - [blocklist.de fail2ban 报告服务](https://lists.blocklist.de/lists/all.txt) - [Dan.me.uk Tor 出口列表](https://www.dan.me.uk/torlist/?full) - [Emerging Threats fwip 规则](https://rules.emergingthreats.net/fwrules/emerging-Block-IPs.txt) - [Peter Hansteen 陷阱列表](https://home.nuug.no/~peter/bsdly.net.traplist) - [Spamhaus DROP](https://www.spamhaus.org/drop/drop.txt) - [Spamhaus EDROP](https://www.spamhaus.org/drop/edrop.txt) - [Talos IP 黑名单](https://www.talosintelligence.com/documents/ip-blacklist) - [Team Cymru fullbogons IPv4](https://team-cymru.org/Services/Bogons/fullbogons-ipv4.txt) - [Team Cymru fullbogons IPv6](https://team-cymru.org/Services/Bogons/fullbogons-ipv6.txt) ## 🧪 用法 ### 基本运行 ``` ./dist/blackhole-threats -conf examples/blackhole-threats.yaml -debug ``` ### 命令行标志 ``` -conf string Configuration file (default "blackhole-threats.yaml") -check-config Validate configuration and exit -debug Enable debug logging -log-format string Log format (default "logfmt") -log-level string Log level (default "info") -feed value Threat intelligence feed (use multiple times) -once Run a single refresh cycle and exit -refresh-rate duration Refresh timer (default 2h0m0s) -version Print version information and exit ``` ### 示例 使用默认配置路径运行: ``` ./dist/blackhole-threats ``` 使用自定义配置文件运行: ``` ./dist/blackhole-threats -conf /etc/blackhole-threats.yaml ``` 验证配置并退出而不启动 BGP: ``` ./dist/blackhole-threats -conf examples/blackhole-threats.yaml -check-config ``` 运行单次刷新循环并退出: ``` ./dist/blackhole-threats -conf examples/blackhole-threats.yaml -once ``` 对于无特权的冒烟测试,使用一个临时配置并将 `gobgp.global.config.port` 设置为高位端口,例如 `1179`。 通过额外添加 feed 而不编辑 YAML 文件: ``` ./dist/blackhole-threats \ -conf examples/blackhole-threats.yaml \ -feed https://www.spamhaus.org/drop/drop.txt ``` 使用更快的刷新间隔进行测试: ``` ./dist/blackhole-threats \ -conf examples/blackhole-threats.yaml \ -refresh-rate 15m \ -log-format logfmt \ -log-level debug ``` 触发正在运行进程的即时刷新: ``` kill -USR1 ``` 对于打包安装,可以通过以下方式触发相同刷新: ``` sudo systemctl reload blackhole-threats ``` 打印构建元数据: ``` ./dist/blackhole-threats -version ``` ### 维护者命令 ``` make fmt make fmt-check make vet make test make build make docker-build make package ``` ### 日志记录 守护进程将结构化 logfmt 风格的行写入标准输出。这使得输出 易于本地阅读,同时也能很好地与 `docker logs`、 `journalctl` 和常见的 syslog 或日志收集管道配合使用。 使用 `-log-format logfmt` 获取默认的操作员导向输出,或 使用 `-log-format json` 获取换行符分隔的 JSON 日志以供日志收集器使用。 使用 `-log-level` 进行常规操作控制。旧的 `-debug` 标志仍可用作 `-log-level debug` 的简写。 启动日志包含构建和运行时元数据,例如: - tag 版本、提交和构建日期 - Go 运行时版本和平台 - 配置路径、运行模式、刷新间隔和 feed 数量 - 本地 ASN、路由器 ID、默认社区和已配置对等体数量 - 对于未打标签的分支构建,`tag_version` 可能为 `unknown` 示例启动行: ``` time=2026-04-20T00:00:28Z level=info msg="Starting blackhole-threats" build_date=2026-04-20T00:00:09Z commit=1a2b3c4 go_arch=arm64 go_os=linux go_version=go1.26.2 pid=76 tag_version=v1.0.0 ``` 等效的 JSON 启动行: ``` {"build_date":"2026-04-20T00:00:09Z","commit":"1a2b3c4","go_arch":"arm64","go_os":"linux","go_version":"go1.26.2","level":"info","msg":"Starting blackhole-threats","pid":76,"tag_version":"v1.0.0","time":"2026-04-20T00:00:28Z"} ``` ## 🐳 容器 容器镜像发布到 GitHub Container Registry,地址为: ``` ghcr.io/soakes/blackhole-threats ``` ### 容器说明 - 基于 Debian Trixie 运行时 - 使用当前稳定的 Go 构建阶段(基于 Debian Trixie) - 使用 S6 Overlay 进行监督和生命周期管理 - 在构建时验证并固定 S6 Overlay 版本及校验和 - 运行时配置存储在 `/config` 下 - 自动在首次启动时创建 `/config/blackhole-threats.yaml` - 结构化标准输出日志,适合 Docker 日志收集与解析 - 可选容器覆盖: - `BLACKHOLE_THREATS_CONF` 用于指定不同的配置路径 - `BLACKHOLE_THREATS_EXTRA_OPTS` 用于追加守护进程标志,例如 `-log-format json -log-level info` - 支持多架构镜像:`linux/amd64` 和 `linux/arm64` ### 示例用法 ``` docker pull ghcr.io/soakes/blackhole-threats:latest docker run -d \ -p 179:179 \ -v "$PWD/config:/config" \ -e BLACKHOLE_THREATS_EXTRA_OPTS="-log-level debug -refresh-rate 15m" \ --name blackhole-threats \ ghcr.io/soakes/blackhole-threats:latest ``` 如果你想要使用移动中的默认分支构建而不是最新的标记版本,请使用 `ghcr.io/soakes/blackhole-threats:main`。如果你想要当前的发布候选流,请使用 `ghcr.io/soakes/blackhole-threats:rc`。 查看实时服务日志: ``` docker logs -f blackhole-threats ``` ## 📦 Debian 包 Debian 包会将服务安装到标准 Debian 位置。 ### 安装路径 - 二进制文件:`/usr/sbin/blackhole-threats` - 默认配置:`/etc/blackhole-threats.yaml` - 服务默认值:`/etc/default/blackhole-threats` - 手册页:`/usr/share/man/man8/blackhole-threats.8.gz` - 示例配置:`/usr/share/doc/blackhole-threats/examples/blackhole-threats.yaml` - 附加文档:`/usr/share/doc/blackhole-threats/` ### 服务集成 该软件包提供一个 systemd 单元文件和一个用于原生服务管理的 `/etc/default/blackhole-threats` 环境文件(适用于 Debian 系列系统)。 运行时日志会写入 journald,并使用 `blackhole-threats` 的 syslog 标识符。 安装后可通过本地命令查阅命令参考: ``` man blackhole-threats ``` 触发即时 feed 刷新: ``` sudo systemctl reload blackhole-threats ``` 查看服务日志: ``` sudo journalctl -u blackhole-threats -f ``` ## 🔐 APT 仓库 自动发布的 `v*` 版本通过 GitHub Pages 发布一个签名 APT 仓库。 页面根目录也作为公共产品主页,而 APT 索引、包池和签名文件 在同一基础 URL 下供机器使用。 仓库基础 URL: ``` https://soakes.github.io/blackhole-threats/ ``` 归档密钥: ``` https://soakes.github.io/blackhole-threats/blackhole-threats-archive-keyring.gpg ``` 归档密钥指纹: ``` https://soakes.github.io/blackhole-threats/blackhole-threats-archive-keyring.fingerprint.txt ``` ### 添加仓库 ``` sudo install -d -m 0755 /etc/apt/keyrings curl -fsSL https://soakes.github.io/blackhole-threats/blackhole-threats-archive-keyring.gpg \ | sudo tee /etc/apt/keyrings/blackhole-threats-archive-keyring.gpg >/dev/null curl -fsSL https://soakes.github.io/blackhole-threats/blackhole-threats-archive-keyring.fingerprint.txt # 在继续之前,请验证指纹是否与预期的存档密钥匹配 sudo tee /etc/apt/sources.list.d/blackhole-threats.sources >/dev/null <<'EOF' Types: deb deb-src URIs: https://soakes.github.io/blackhole-threats/ Suites: stable Components: main Signed-By: /etc/apt/keyrings/blackhole-threats-archive-keyring.gpg EOF sudo apt update sudo apt install blackhole-threats ``` ### 运维说明 - 二进制索引发布在 `dists/stable/main/binary-*` - 源码索引发布在 `dists/stable/main/source` -仓库元数据已签名并以 `InRelease` 和 `Release.gpg` 发布 - 公共归档密钥与仓库一同发布,供 `signed-by` 使用 - 完整的归档密钥指纹与仓库一同发布,供带外验证 - 软件包通过 GitHub Pages 而非 GitHub Releases 资产列表托管 - 着陆页从 `website/` 构建,并与签名的软件包索引一起部署 - 仅当 `main` 分支有变更时才会重新部署;网站更新会覆盖到最新的仓库快照,因此签名的 APT 内容保持不变 - 已标记的 GitHub Releases 会附带可安装的二进制文件、运行时 Debian 包、`sha256sums.txt` 和 Debian 源码包三元组,供离线检索和检查;维护者专用构件(如 `-dbgsym`、`.buildinfo` 和 `.changes`)不会出现在发布页面上 - 必须为仓库启用 GitHub Pages,且 GitHub Actions 用作发布源 - 签名流程使用受保护的环境密钥: - `APT_GPG_PRIVATE_KEY` - `APT_GPG_KEY_ID`(如果导入的密钥包含多个签名密钥) - `APT_GPG_PASSPHRASE`(如果签名密钥受密码保护) ## 🤖 CI/CD 和发布自动化 GitHub Actions 负责验证、打包、发布以及定时固定依赖刷新。 ### 工作流 - **Build and Validate** - 执行格式化、代码检查、测试、原生构建检查、二进制冒烟测试、Debian 包验证以及签名 APT 仓库验证(使用临时归档密钥)和跨架构构建验证 - **Container Image** - 验证容器构建、冒烟测试配置覆盖行为、验证已发布平台,发布 `main` 到默认分支,发布 `rc` 以及完整的 `v*-rc.*` 标签用于发布候选版本,并发布稳定标签和 `latest` 用于已推广的版本 - **Automated Release Candidate** - 在 `Build and Validate` 成功之后,针对 `main` 的推送计算下一个语义化稳定目标,创建 `v*-rc.*` 标签,等待预发布资产和容器发布作业通过,然后将同一提交提升为稳定的 `v*` 标签并触发稳定发布工作流 - **Promote Release Candidate** - 提供一个手动回退路径,可将特定的 `v*-rc.*` 标签提升为稳定的 `v*` 标签(如自动提升路径需要运维人员干预) - **Release Drafter** - 在 `main` 上维护一份经过整理的草案发布说明,根据 PR 的标签对发布内容进行分组,并为合并的 PR 应用最明显的标签 - **Release Assets** - 构建带标签的发行二进制文件和 Debian 二进制/源码包,生成经过整理的 GitHub Release 资产供运维人员使用,生成校验和,发布 GitHub Releases 作为预发布版本(针对 `v*-rc.*` 标签)和稳定版本(针对 `v*` 标签),并使用 Release Drafter 的输出作为直接提交到 `main` 变更的简洁提交历史回退 - **Publish Signed Debian Repository** - 构建 Debian 二进制/源码包,生成 APT 元数据,使用 APT 对仓库进行冒烟测试,构建基于 Astro 的着陆页,签名仓库并同时部署到 GitHub Pages(仅针对稳定的 `v*` 标签) - **Deploy Pages Site** - 在 `main` 上重建 Astro 着陆页,将其叠加到最新发布的 Pages 快照上并重新发布,无需新的发布标签 - **Refresh Build and Runtime Pins** - 刷新固定的 Docker Go 构建镜像版本,并更新固定的 Docker `s6-overlay` 版本及校验和 ### 自动更新 - Dependabot 每天检查 GitHub Actions、Go 模块和 Docker 基础镜像 - 定时刷新工作流会更新固定的 Docker Go 构建镜像版本以及固定的 Docker `s6-overlay` 版本和校验和 ### 公共仓库强化 - 拉取请求仅运行验证作业;不会运行签名仓库发布者或发布者 - 将 `main` 视为发布候选准备:每次合并到 `main` 都可能成为下一个自动的 `v*-rc.*` 标签,但只有当预发布发布路径通过时,稳定的 `latest` 才会发布 - 对 `main` 的推送也会刷新公共 GitHub Pages 着陆页,但会通过叠加最新的仓库快照而非重建或重新签名 APT 仓库来实现 - 自动版本提升使用 `feat` 表示次要版本,`fix`/`perf`/`revert`/`container`/`build`/`deps`/`packaging` 表示补丁版本,`BREAKING CHANGE:` 或 `type!:` 表示主要版本 - 拉取请求标签驱动分组发布说明;Release Drafter 会自动应用大部分标签,但合并前应正确设置标签 - 说明操作对运维人员的影响、打包变更、发布流程或安全态势 - 保持 README、打包和流程文档与行为一致 - 在代码路径变更时包含测试覆盖率或验证说明 - 明确说明路由、打包或升级的影响 - 不要扩大工作流权限或密钥暴露范围,除非有明确的运维理由 - 保持发布和发布工作流对公共仓库安全 ### 提交信息指南 发布说明从通过 Release Drafter 的拉取请求中提取,提交历史回退作为直接提交到 `main` 的变更。提交信息应仍作为发布输入而非临时本地笔记。 推荐格式: ``` fix(logging): standardize startup logs across Docker and systemd Emit structured logfmt-style startup lines with the release tag version. Keep Docker logs, journald, and syslog collectors aligned on the same fields. Document the operator-visible logging change in the README and man page. ``` 实用规则: - 保持主题符合常规提交形式 - 主题应描述可见结果,而不仅仅是修改的文件 - 将主题写为发布就绪的措辞;它将出现在回退发布的说明中,并驱动自动化版本提升 - 如果拉取请求标签错误,请在合并前修正标签,而不是依赖回退路径 - 使用正文说明运维影响、打包变更、发布流程或安全影响 - 保持正文段落面向运维人员;Release Drafter 会从正文中提取第一段有用的细节 - 将不同影响拆分为独立段落,使生成的说明易于阅读 - 使用 `feat`、`fix`、`perf`、`revert`、`container`、`build`、`deps` 或 `packaging` 在变更应触发自动化发布时 - 在正文中使用 `BREAKING CHANGE:` 说明发布是否应强制进行主版本提升 - 不要合并到 `main`,除非你愿意让自动化将其标记并发布为发布候选 ### 有用的贡献领域 - 额外的运维文档 - 更多 feed 示例和验证覆盖 - 路由器互操作性说明 - 打包和发布优化 - 依赖和供应链安全强化 ## 📄 许可证 本项目采用 MIT License。参见 [LICENSE](LICENSE)。
标签:API集成, APT 仓库, BGP, BGP 黑洞, DDoS 缓解, Debian, Docker 部署, EVTX分析, FTP漏洞扫描, Go, NIDS, RTBH, Ruby工具, 入侵防御, 可观测性, 威胁喂养, 威胁情报, 安全编排, 容器化, 开发者工具, 指标与监控, 操作安全, 日志审计, 流量清洗, 网络运维, 自动化响应, 请求拦截, 黑洞路由