Skip to content

Repository files navigation

🧮 cidrkit

本地优先的 CIDR / 子网计算器 · IPv4 + IPv6 双栈 · 零依赖单文件 CLI

🌐 语言: 简体中文繁體中文English

Go Version License: MIT Release Platforms

cidrkit terminal demo

🎉 项目介绍

cidrkit 是一款运行在终端里的 CIDR / 子网计算工具:输入一个网段,就能立刻得到网络地址、广播地址、子网掩码与反掩码、首尾可用主机、主机数量、地址类型、反向解析区域、二进制位布局等完整信息;同时支持 VLSM 等分子网划分、超网聚合(CIDR aggregation)、网段包含判定、重叠检测,并提供 JSON / CSV 结构化输出与标准退出码,可以直接嵌入脚本与 CI/CD 流水线。

😮‍💨 它解决了什么痛点

  • 在线子网计算器 广告多、要联网、输入繁琐,一次只能算一个网段,无法批量处理;
  • 运维与开发场景中,网段规划属于内网敏感信息,把 10.x / 172.16.x 的拓扑贴进第三方网页,本身就存在信息泄露风险;
  • 现有命令行工具要么只支持 IPv4,要么需要 Python/Node 运行时,无法做到"下载一个二进制到处运行"
  • 自动化流水线需要机器可读输出可判断成败的退出码,网页工具完全无法满足。

🪞 灵感来源与自研声明

本项目的产品灵感来自当前 GitHub 上"本地优先(local-first)、零服务器、单文件替代云服务"的开源浪潮——用一个离线、保护隐私、可自动化的小工具替代有泄露风险的在线网页。cidrkit 的全部代码均为独立自研,未复制任何项目的源码,仅借鉴"本地优先"这一产品理念,并在双栈支持、精确 128 位运算、VLSM 规划、CI 友好度等方面做了差异化设计。

🌟 自研差异化亮点

  • IPv4 / IPv6 双栈一等公民:IPv6 地址空间使用 math/big 做精确的 128 位整数运算,不丢精度、不溢出;
  • 严格遵循 RFC 标准/31 点对点链路按 RFC 3021 计 2 个可用主机,地址分类覆盖 RFC 1918 / 6598(CGNAT)/ 3927 / 4291 / 4193 / 3849 等;
  • 真正的最小超网聚合:自动合并相邻网段,并剔除被包含的冗余网段;
  • 零第三方依赖:仅使用 Go 标准库,审计友好,编译产物为静态单二进制
  • CI 原生设计--json / --csv / stdin 批量输入 / 语义化退出码一应俱全。

✨ 核心特性

  • 🔍 info 网段全景体检:网络/广播地址、掩码与反掩码(wildcard)、首尾主机、地址总数与可用主机数、位级布局图、反向 DNS 区域、IANA 特殊地址分类;
  • ✂️ split VLSM 等分子网划分:指定目标前缀(--prefix 26)或直接给出需要的子网数量--count 6,自动计算最省地址的前缀);
  • 🧩 aggregate 超网聚合:把零散网段合并为最小等价 CIDR 集合,自动去重、自动剔除被包含网段,IPv4/IPv6 混合输入自动分族处理;
  • 📦 contains 包含判定:判断 IP / 网段是否落在外网段内,全部包含退出码为 0,否则为 1,适合做准入校验;
  • ♻️ overlap 重叠检测:找出网段清单中所有互相重叠的对,无重叠退出 0、有重叠退出 1;
  • 🧾 三种输入形式:标准 CIDR(10.0.0.0/24)、点分掩码10.0.0.0/255.255.255.0)、裸 IP(自动按 /32/128 主机路由处理);
  • 📟 三种输出形态:终端彩色表格(自动识别 TTY,尊重 NO_COLOR 约定)、--json--csv
  • 📥 stdin 批量模式:支持管道、文件重定向,# 开头的注释行与空行自动忽略;
  • 🛡️ 安全护栏:划分结果超过 65 536 块时直接拒绝,防止笔误(如 /0 → /128)打爆内存;
  • 🧪 16 项 RFC 已知向量单元测试,核心计算包语句覆盖率 94%+,跨平台 CI 全绿;
  • 📦 全平台静态编译:Linux / macOS / Windows × amd64 / arm64,开箱即用,无运行时依赖。

🚀 快速开始

🧰 环境要求

  • 直接使用:无需任何运行时,到 Release 页面下载对应平台二进制即可;
  • 从源码构建:Go 1.24 或更高版本(本项目不依赖任何第三方 Go 模块)。

📥 方式一:下载预编译二进制(推荐)

# Linux amd64 示例
curl -L -o cidrkit.tar.gz https://github.com/gitstq/cidrkit/releases/latest/download/cidrkit_1.0.0_linux_amd64.tar.gz
tar -xzf cidrkit.tar.gz
./cidrkit version

Windows 用户下载 cidrkit_1.0.0_windows_amd64.zip,解压后在 PowerShell 运行 .\cidrkit.exe version

🛠️ 方式二:Go 安装 / 源码构建

# 通过 go install
go install github.com/gitstq/cidrkit@latest

# 或克隆源码后本地构建
git clone https://github.com/gitstq/cidrkit.git
cd cidrkit
make build         # 产物在 bin/cidrkit

⚡ 30 秒上手

# 1. 查看一个网段的完整信息(输入 IP 不必是网络地址,主机位会自动清零)
cidrkit info 192.168.1.55/24

# 2. 把 /24 划分为至少 6 个子网(自动选择 /27)
cidrkit split 10.0.0.0/24 --count 6

# 3. 把 4 个 /24 聚合成最小超网
cidrkit aggregate 192.168.0.0/24 192.168.1.0/24 192.168.2.0/24 192.168.3.0/24

# 4. 判断地址是否属于 10/8(流水线可根据退出码判断)
cidrkit contains 10.0.0.0/8 10.20.30.40

📖 详细使用指南

命令总览

命令 作用 关键参数 / 退出码
info <cidr...> 网段详情体检 支持多个网段;--json / --csv
split <cidr> 等分子网 --prefix N--count N(二选一)
aggregate <cidr...>(别名 agg 最小超网聚合 --json
contains <outer> <target...> 包含判定 全部包含 exit 0,否则 exit 1
overlap <cidr...> 重叠检测 无重叠 exit 0,有重叠 exit 1
version / help 版本与帮助

所有命令通用输出参数:--json(结构化 JSON)、--csv(表格 CSV,仅 info/split)、--no-color(关闭颜色)。

1️⃣ info:网段详情

cidrkit info 10.0.0.0/31              # /31 按 RFC 3021 计 2 个可用主机
cidrkit info 172.16.5.9/255.255.0.0   # 支持点分掩码写法
cidrkit info 8.8.8.8                  # 裸 IP 自动按 /32 处理
cidrkit info 2001:db8::/32            # IPv6 同样适用
cidrkit info 10.0.0.0/8 --json        # 机器可读输出

输出字段说明:

  • Network address:主机位清零后的规范网络地址;
  • Host address:当你输入的 IP 带有非零主机位时,原样保留展示;
  • Netmask / Wildcard mask:子网掩码与反掩码(ACL/反掩码配置直接抄);
  • First/Last host:首末可用主机地址(/31/32 按 RFC 特殊处理);
  • Broadcast:广播地址(仅 IPv4;/31/32 不保留广播位);
  • Total / Usable:地址总数与可用主机数,IPv6 使用大数精确显示;
  • Address type:地址类型,标注私网、CGNAT、环回、链路本地、文档保留段等及对应 RFC;
  • Reverse DNS:反向解析区域(非字节/半字节边界时给出 RFC 2317 无类委派提示);
  • Bit layout:32 位二进制布局,| 标记网络位与主机位分界。

2️⃣ split:VLSM 等分子网划分

# 把 10.10.0.0/22 等分为 /24
cidrkit split 10.10.0.0/22 --prefix 24

# 我需要 6 个业务子网,工具自动算出 /27 并给出前 6 块
cidrkit split 10.0.0.0/24 --count 6

# JSON 输出,方便二次开发
cidrkit split 192.168.1.0/29 --prefix 31 --json

📌 --count 模式会选择"能容纳 N 个子网的最小前缀";当 N 不是 2 的幂时,会在结果末尾提示等分情况下的总块数。

3️⃣ aggregate(别名 agg):超网聚合

# 相邻同前缀网段自动合并;被包含的冗余网段自动剔除
cidrkit agg 192.168.0.0/24 192.168.1.0/24 192.168.2.0/24 192.168.3.0/24
# -> 192.168.0.0/22

# IPv4 / IPv6 混合输入会自动分族处理
cidrkit agg 10.0.0.0/24 2001:db8::/33 2001:db8:8000::/33

4️⃣ contains:包含判定(CI 准入校验)

# 所有目标都在 10/8 内 -> exit 0;出现外部地址 -> exit 1
cidrkit contains 10.0.0.0/8 10.2.3.4 10.99.0.0/16
echo $?

典型场景:Terraform/Ansible 下发前校验内网地址是否落在规划段内、安全组变更前做防呆检查。

5️⃣ overlap:网段重叠检测

# 输出所有重叠对;规划无冲突时退出码为 0
cidrkit overlap 192.168.0.0/24 192.168.1.0/24 192.168.0.128/25

📥 stdin 批量处理与管道组合

参数可以来自标准输入(空白分隔,支持换行;# 注释自动忽略):

# 批量体检并导出 CSV
cidrkit info --csv < examples/networks.txt > inventory.csv

# 与 grep / xargs 组合
cat route-table.txt | cidrkit aggregate
cidrkit info --csv < examples/networks.txt | grep -i private

🚦 退出码约定(CI 友好)

退出码 含义
0 执行成功(contains/overlap 表示校验通过)
1 逻辑不满足(存在外部地址 / 存在重叠)
2 参数或输入错误(非法网段、缺少参数等)

💡 设计思路与迭代规划

🧠 设计理念与技术选型

  • 为什么选 Go? 标准库 net 提供了成熟的 IP/IPMask 原语,配合 math/big 可以用同一套代码精确处理 IPv4 与 128 位的 IPv6;交叉编译只需指定 GOOS/GOARCH,天然产出无依赖静态二进制,契合"下载即用"的目标。
  • 为什么坚持零第三方依赖? 网络工具常用于生产跳板机与 CI Runner,依赖越少,供应链与审计成本越低;同时保证在离线环境中可完整构建。
  • 为什么把输出当 API 设计? --json 字段名与 --csv 列头是稳定契约,配合退出码,让 cidrkit 既能给人看,也能给程序调用。
  • 正确性从哪来? 核心计算全部以 RFC 已知向量驱动单元测试(RFC 3021、RFC 1918、RFC 6598、RFC 4291、RFC 4193 等),关键路径覆盖率 94%+。

🗺️ 迭代路线图(Roadmap)

  • v1.1:range 子命令——受控枚举网段内全部地址,支持 --limit 与格式化模板;
  • v1.1:支持从文本中抽取所有 CIDR(类似 grep 的网络感知模式);
  • v1.2:VLSM 多需求排序分配(给定一组主机数自动出最优地址分配方案);
  • v1.2:超网差异对比(两份网段清单的增删改 diff);
  • v1.3:MCP / 语言 SDK 模式,输出稳定 JSON 供 AI Agent 与自动化平台调用;
  • 持续补充 RFC 特殊地址注册表与多语言文档。

🙋 社区贡献方向

欢迎认领 Roadmap、补充测试向量、完善多语言文档,规范见 CONTRIBUTING.md


📦 打包与部署指南

🏗️ 本地交叉编译

# 一键产出全部平台产物到 dist/(含 SHA256SUMS.txt)
make dist
# 等价于
VERSION=1.0.0 bash scripts/build.sh

🎯 发布产物矩阵

目标平台 架构 产物
Linux amd64 / arm64 cidrkit_1.0.0_linux_amd64.tar.gzcidrkit_1.0.0_linux_arm64.tar.gz
macOS amd64(Intel)/ arm64(Apple Silicon) cidrkit_1.0.0_darwin_amd64.tar.gzcidrkit_1.0.0_darwin_arm64.tar.gz
Windows amd64 / arm64 cidrkit_1.0.0_windows_amd64.zipcidrkit_1.0.0_windows_arm64.zip

所有产物均为 CGO_ENABLED=0 静态编译,每个压缩包内置 LICENSEREADME

🔐 校验下载完整性

sha256sum -c SHA256SUMS.txt          # Linux
shasum -a 256 -c SHA256SUMS.txt      # macOS

🚃 在 CI/CD 中使用(GitHub Actions 示例)

- name: Validate planned network
  run: |
    curl -L https://github.com/gitstq/cidrkit/releases/latest/download/cidrkit_1.0.0_linux_amd64.tar.gz | tar xz
    ./cidrkit contains 10.0.0.0/8 ${{ env.PLANNED_IP }}

🐳 部署说明

cidrkit 是单二进制无状态 CLI,无需服务端、数据库或常驻进程;放入镜像/Runner 镜像层即可,基础镜像可使用 scratchdistroless 直接携带。


🤝 贡献指南

我们欢迎 Issue、PR 与测试向量贡献!开始之前请阅读 CONTRIBUTING.md

  1. 非平凡改动建议先开 Issue 讨论设计;
  2. 提交信息遵循 Angular 规范feat: / fix: / docs: / test: / refactor: / chore:
  3. 新计算规则必须附带 RFC 已知答案的单元测试;
  4. 提交前执行 gofmt -s -w . && go vet ./... && go test ./...,保证三平台 CI 全绿。

📄 开源协议说明

本项目基于 MIT License 开源,允许自由使用、修改、分发与商用,保留版权声明即可。

If cidrkit saves you time, consider giving it a ⭐ — it helps a lot!

About

🧮 Local-first CIDR/subnet calculator CLI for IPv4 & IPv6 — zero-dependency static single binary, VLSM split, supernet aggregation, CI-friendly JSON/CSV output

Topics

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages