# DDI 管理系统
**Repository Path**: leichuanxing/DDI
## Basic Information
- **Project Name**: DDI 管理系统
- **Description**: 合力数据 DDI 管理系统是一个基于 Python + Django 开发的轻量级网络资源管理平台,统一管理企业内部的 IP 地址(IPAM)、DHCP 地址分配 和 DNS 解析记录。系统采用中文本土化设计,内置服务模拟引擎与网络探测功能,适合中小型企业的网络运维场景。
- **Primary Language**: Python
- **License**: Apache-2.0
- **Default Branch**: main
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 5
- **Forks**: 3
- **Created**: 2026-04-19
- **Last Updated**: 2026-05-08
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 合力数据 DDI 管理系统 v2.0
DDI (DNS + IPAM) 网络资源统一管理平台 — 集成 BIND9
---
## 一、项目简介
**合力数据 DDI 管理系统** 是一套基于 **Python / Django** 开发的轻量级 Web 网络基础设施管理平台,统一管理企业内部的 **IP 地址(IPAM)** 和 **DNS 域名解析**。系统深度集成 **BIND9**,支持从 Web 界面直接配置、校验、发布和回滚 BIND9 配置,适合中小型企业的网络运维场景。

### 核心亮点
| 特性 | 说明 |
|------|------|
| **BIND9 深度集成** | Web 端编辑 → `named-checkconf/checkzone` 校验 → 备份 → 一键发布 → 失败自动回滚 |
| **完整配置渲染器** | 从数据库模型自动生成标准 `named.conf`,含 options/acl/view/zone/logging |
| **ACL + View 视图** | 支持 BIND9 的 ACL 定义与 View 分视图解析,按客户端来源返回不同结果 |
| **发布中心** | 版本化发布管理:草稿 → 校验 → 备份 → 发布 → 回滚,全链路审计 |
| **IPAM 四级层级** | 区域(Region) → VLAN → 子网(Subnet) → IP地址,CIDR 自动计算 |
| **网络探测子系统** | 内置 Ping / 端口扫描 / 拓扑发现引擎,后台异步执行 |
| **交换机设备管理** | 支持通过 SSH 登录交换机获取 ARP/MAC 表,联动 IP 地址分配 |
| **双轨审计日志** | 全局操作日志 + DNS 专用审计日志(27 种操作类型) |
| **轻量依赖** | Django + gunicorn + paramiko + dnspython + Pillow |
---
## 二、功能模块总览
### 各模块详细说明
| 模块 | 路由前缀 | 核心功能 |
|------|----------|----------|
| **仪表盘** | `/dns/` 或 `/dashboard/` | DNS 运行状态卡片、Zone/记录统计图表、最近操作日志 |
| **DNS 管理** | `/dns/` | **47 条路由** — 见下方详表 |
| **IPAM** | `/ipam/` | **37 条路由** — 区域/VLAN/子网/IP四级管理 + 网络探测 |
| **设备管理** | `/devices/` | 设备 CRUD(11 种类型)、IP 关联绑定 |
| **用户认证** | `/accounts/` | 登录/登出、用户 CRUD、4 种角色、登录日志 |
| **审计日志** | `/logs/` | 全量操作记录追溯 |
### DNS 管理模块详解(核心模块)
| 功能分类 | 路由 | 说明 |
|---------|------|------|
| **DNS 仪表盘** | `dns/` | 服务运行状态、Zone/记录/Acl 统计、最近变更 |
| **服务管理** | `dns/service/` | 启动/停止/重启/重载/刷新缓存/清理缓存/状态检查 |
| **全局配置** | `dns/options/` | options{} 全部参数编辑(监听/查询控制/转发/DNSSEC/性能),实时预览渲染结果 |
| **配置同步** | `dns/sync-config/` | 数据库 → 文件同步,对比 diff 展示 |
| **ACL 管理** | `dns/acl/*` | CRUD + 9 种条目类型(ip/cidr/key/acl_ref/any/none/localhost/localnets) |
| **View 视图** | `dns/views/*` | match-clients/match-destinations/allow-query/recursion 关联,预览渲染 |
| **Zone 区域** | `dns/zones/*` | 正向/反向/主从/转发区 CRUD,SOA 参数编辑,named-checkzone 校验 |
| **资源记录** | `dns/records/*` | SOA/NS/A/AAAA/CNAME/MX/PTR/TXT/SRV 共 9 种记录,批量导入导出 CSV |
| **转发规则** | `dns/forwards/*` | 全局转发 / 条件转发(关联 Zone),在线测试转发器连通性 |
| **主从同步** | `dns/sync-status/` | Zone 级别主从 Serial 对比、手动触发通知 |
| **日志中心** | `dns/log-center/` | BIND9 query.log 解析展示 |
| **发布中心** | `dns/publish/*` | 一键发布(校验→备份→写入→reload)、版本历史、失败回滚 |
| **备份回滚** | `dns/backups/*` | 发布前自动备份、手动备份、一键回滚到任意历史版本 |
| **DNS 审计** | `dns/audit/*` | 27 种操作的专用审计日志,变更前后值对比 |
---
## 三、技术栈
| 层面 | 技术 | 版本 |
|------|------|------|
| **后端框架** | Python / Django | >=4.2, <6.0 |
| **前端 UI** | Django Template / Bootstrap 5 / Chart.js / Bootstrap Icons | 5.3 / 4.x / 1.x |
| **前端增强** | Select2 (jQuery插件) | CDN 引入 |
| **DNS 服务端** | ISC BIND9(源码编译安装) | **9.16.23** |
| **数据库** | SQLite 3(默认)/ 可迁移 MySQL/PostgreSQL | — |
| **WSGI 服务器** | Gunicorn (生产) / Django Dev Server (开发) | >=21.0 |
| **语言/时区** | 简体中文 (zh-hans) / Asia/Shanghai | — |
| **认证方式** | Django Session Auth (扩展 User 模型 + Role RBAC) | — |
| **辅助库** | paramiko (SSH)、dnspython (DNS查询)、Pillow (图片) | — |
---
## 四、快速开始
### 前置要求
- Python 3.11+
- pip 包管理器
- (可选)BIND9 9.16.23(用于 DNS 服务集成)
### 安装步骤
```bash
# 克隆项目
git clone
cd ddi_system
# 1. 安装依赖
pip install -r requirements.txt
# 2. 数据库迁移
python manage.py makemigrations
python manage.py migrate
# 3. 初始化数据(推荐首次运行)
python manage.py init # 完整初始化(含示例数据)
# python manage.py init --minimal # 仅基础配置(角色+管理员+DNS)
# 4. 启动开发服务器
python manage.py dev # 或: python manage.py runserver 0.0.0.0:8000
```
### 访问系统
打开浏览器访问:`http://127.0.0.1:8000/`
| 项目 | 值 |
|------|-----|
| 默认账号 | `admin` |
| 默认密码 | `Admin@123` |
### 安装 BIND9(必须安装)
```bash
# 源码编译安装指定版本 9.16.23
sudo ./install_bind9.sh
# 卸载(如需要)
sudo ./uninstall_bind9.sh
```
`install_bind9.sh` 特性:
- 从 ISC 官方源码下载并编译安装 BIND **9.16.23**
- 自动检测 OS 类型(CentOS/RHEL/Rocky/Ubuntu/Debian)
- 生成完整 systemd 服务文件(含安全加固)
- 创建 rndc 密钥、localhost zone、根提示文件
- 配置独立查询日志通道 (`query_log`)
- 自动清理编译临时文件
### 快捷脚本启动/停止
```bash
# 开发模式启动(Django runserver,前台运行)
./start.sh dev # http://0.0.0.0:8000
# 生产模式启动(Gunicorn 后台守护进程,4 workers)
./start.sh prod # http://0.0.0.0:8000
# 停止服务(优雅停止 / 强制停止)
./stop.sh # SIGTERM 优雅停止
./stop.sh -k # SIGKILL 强制停止
```
### 生产环境部署
```bash
# 收集静态文件
python manage.py collectstatic
# 使用 Gunicorn 启动
gunicorn ddi_system.wsgi --bind 0.0.0.0:8000 --workers 4
```
---
## 五、项目结构
```
ddi_system/
├── manage.py # Django 入口 (增强版: init/dev 快捷命令)
├── __main__.py # 包入口 (python -m ddi_system)
├── init_data.py # 初始化数据脚本 (角色/管理员/DNS/IPAM 示例)
├── requirements.txt # 依赖: Django/gunicorn/paramiko/dnspython/Pillow
├── install_bind9.sh # BIND9 9.16.23 源码编译安装脚本
├── uninstall_bind9.sh # BIND9 卸载脚本
├── start.sh # 启动脚本 (dev/prod 模式)
├── stop.sh # 停止脚本 (优雅/强制)
├── README.md # 本文档
│
├── ddi_system/ # Django 项目配置包
│ ├── settings.py # 全局配置 (7 个业务应用注册)
│ ├── urls.py # 主路由分发 (7 个模块)
│ ├── wsgi.py # WSGI 部署入口
│ └── asgi.py # ASGI 异步入口
│
├── accounts/ # 用户认证与角色管理
│ ├── models.py # Role, User(AbstractUser), LoginLog
│ ├── views.py # 登录/登出/CRUD/重置密码
│ ├── forms.py # 登录/用户创建/编辑表单
│ └── urls.py # 9 条路由
│
├── dashboard/ # 首页仪表盘
│ ├── views.py # index() 统计聚合视图
│ └── templates/index.html # 仪表盘页面 (卡片+图表)
│
├── ipam/ # IP 地址管理 + 网络探测 (最大模块之一)
│ ├── models.py # Region, VLAN, Subnet, IPAddress
│ ├── views.py # CRUD + 分配/释放/批量操作
│ ├── forms.py # CIDR/MAC 校验表单
│ ├── scan_models.py # ScanTask/DiscoveryRule/ProbeResult/TopologyNode/SwitchDevice
│ ├── scan_views.py # 探测/交换机 视图
│ ├── scanner.py # Ping/端口扫描/TCP 引擎 (~6KB)
│ └── urls.py # 37 条路由 (含探测 API + 交换机)
│
├── dns/ # DNS 管理 (最大模块, 47 条路由)
│ ├── models.py # 13 个模型 (见下方数据模型)
│ ├── views.py # 全部业务视图 (~70KB)
│ ├── forms.py # DNS 记录/Zone/ACL/View/Options 表单 (~26KB)
│ ├── services/
│ │ ├── bind9_service.py # BIND9 操作封装 (~22KB): checkconf/checkzone/reload/status
│ │ ├── config_renderer.py # named.conf 渲染引擎 (~20KB): options/acl/view/zone/logging
│ │ └── publish_service.py # 发布流程编排 (~26KB): 校验→备份→写入→reload→回滚
│ ├── utils/
│ │ └── helpers.py # DNS 工具函数 (~11KB): zone 序列号/FQDN/PTR 等
│ └── urls.py # 47 条路由 (14 个功能分组)
│
├── devices/ # 设备/主机管理
│ ├── models.py # Device, DeviceInterface (多网卡)
│ ├── views.py # 设备 CRUD + IP 关联
│ ├── forms.py # 设备表单 (含 IP 地址 Select2 搜索)
│ └── urls.py # 6 条路由
│
├── logs/ # 审计日志
│ ├── models.py # OperationLog
│ ├── views.py # 操作日志列表与筛选
│ └── urls.py # 1 条路由
│
├── common/ # 公共工具包
│ ├── ip_utils.py # IP 工具 (CIDR 验证/PTR 生成/网段计算)
│ └── logger.py # 操作日志统一记录器
│
├── static/ # 静态资源 (本地副本)
│ ├── css/ # Bootstrap 5 / Select2 / Bootstrap Icons
│ ├── js/ # jQuery / Bootstrap / Chart.js / Select2
│ └── fonts/ # Bootstrap Icons 字体文件
│
└── templates/ # HTML 模板 (55 个文件)
├── base.html # 布局基座 (固定侧边栏 + 顶栏 + 响应式)
├── pagination.html # 通用分页组件
├── accounts/ # 登录页/用户列表/表单/登录日志 (5 个)
├── dashboard/ # 仪表盘 (1 个)
├── ipam/ # 区域/VLAN/子网/IP/探测全套页面 (17 个)
├── dns/ # DNS 全套页面 (21 个):
│ ├── dashboard.html # DNS 仪表盘
│ ├── service.html # 服务管理 (启停/状态/缓存)
│ ├── options.html # 全局配置编辑
│ ├── acl_form.html / acl_list.html # ACL 管理
│ ├── view_form.html / view_list.html # View 视图
│ ├── zone_*.html # Zone 列表/详情/表单/删除/预览
│ ├── record_*.html # 记录列表/表单/删除
│ ├── forward.html # 转发规则
│ ├── publish.html # 发布中心 (一键发布)
│ ├── backup.html # 备份列表/回滚
│ ├── audit.html # DNS 审计日志
│ ├── config_sync.html # 配置同步
│ ├── logs.html # 日志中心
│ └── sync.html # 主从同步状态
├── devices/ # 设备列表/详情/表单/删除/IP关联 (5 个)
└── logs/ # 操作日志 (1 个)
```
---
## 六、URL 路由一览
| 前缀 | 模块 | 主要路径 | 数量 |
|------|------|----------|------|
| `/admin/` | Django Admin | 后台管理 | — |
| `/accounts/` | 用户认证 | login, logout, users/*, roles/*, login-log/* | **9** |
| `/dashboard/` | 仪表盘 | index (首页) | **1** |
| `/dns/` | DNS 管理 | service, options, acl/*, views/*, zones/*, records/*, forwards/*, sync-status, log-center, publish/*, backups/*, audit/*, sync-config | **47** |
| `/ipam/` | IPAM | regions/*, vlans/*, subnets/*, ips/*, scan/*, api/*, scan/switches/* | **37** |
| `/devices/` | 设备 | list, create, `/edit`, `/delete`, `/link-ip/` | **6** |
| `/logs/` | 日志 | operation_log | **1** |
**总计**: **101+** 条 URL 路由
---
## 七、数据模型概览
```
accounts (3 个模型)
├── Role (id, name, code, description)
├── User (AbstractUser + role→FK[Role], real_name, phone,
│ department, is_active, last_login_ip)
└── LoginLog (user→FK, username, ip_address, user_agent, status)
ipam (4 个模型)
├── Region (id, name, code, description) [subnet_count, vlan_count]
├── VLAN (id, vlan_id, name, region→FK, purpose, gateway)
├── Subnet (id, name, cidr, gateway, prefix_len, region→FK,
│ vlan→FK, purpose)
│ [total_ips, allocated_ips, available_ips, usage_percent]
└── IPAddress (id, ip_address, subnet→FK, status, hostname,
mac_address, device_name, owner, department,
device_type, binding_type, notes, created_by→FK)
dns (13 个模型 — 核心模块)
├── DnsServer (id, hostname, ip_address, bind_version,
│ named_conf_path, zone_dir, log_file, is_local, enabled)
│ [get_local_server() 类方法]
│
├── DnsGlobalOption (server→OneToOne[DnsServer], directory, listen_on_v4/v6,
│ allow_query, allow_recursion, recursion, dnssec_validation,
│ forward_policy, forwarders, querylog_enable, max_cache_size,
│ version_hide, raw_config, is_draft)
│
├── DnsAcl (id, name, description, built_in) [item_count, can_delete()]
│ └── DnsAclItem (acl→FK, item_type{9种}, value, order_index) [render()]
│
├── DnsView (id, name, match_clients→M2M[Acl], match_destinations→M2M[Acl],
│ recursion, allow_query_acl→FK[Acl], allow_recursion_acl→FK[Acl],
│ order_index) [zone_count]
│
├── DnsZone (id, name, zone_type{4种}, direction_type{2种}, view→FK,
│ default_ttl, primary_ns, admin_mail, serial_no, refresh/retry/expire/minimum,
│ master_ips, slave_ips, forwarders, forward_policy,
│ allow_transfer_acl→FK, allow_update_acl→FK, dynamic_update, enabled)
│ [record_count, generate_filename(), bump_serial(), get_soa_record()]
│
├── DnsRecord (zone→FK, record_type{9种}, name, ttl, value,
│ priority, weight, port, enabled) [clean() 校验规则]
│
├── DnsForwardRule (rule_type{global/conditional}, zone→FK, forwarders,
│ policy{first/only}, description, enabled)
│
├── DnsSyncStatus (zone→OneToOne, local_serial, remote_serial,
│ last_sync_time/result/message, also_notify) [in_sync]
│
├── DnsPublishVersion(id, version_number, status{5种}, publisher→FK,
│ publish_time, notes, checkconf_passed, checkzone_results,
│ object_count)
│ └── DnsPublishObject(version→FK, object_type{7种}, object_id, object_name,
│ action{create/update/delete}, diff_content, check_result, publish_status)
│
├── DnsBackup (version→FK, backup_type{3种}, config_content, file_size,
│ storage_path, backup_time, backup_user→FK, notes)
│
└── DnsAuditLog (user→FK, action{27种}, category{10种}, object_name,
detail, old_value, new_value, result, client_ip, operation_time)
[indexes: (category,action), (object_name), (operation_time)]
devices (2 个模型)
├── Device (id, hostname, device_name, device_type{11种}, manager,
│ department, mac_address, os, region→FK, ip_address→FK)
│ [linked_dns_records]
└── DeviceInterface (device→FK, name, mac_address, ip_address→FK, is_primary)
logs (1 个模型)
└── OperationLog (user→FK, module, action, object_type,
old_value, new_value, ip_address, operation_time)
```
**总计**: **25 个业务数据模型**(其中 DNS 占 13 个)
---
## 八、初始化数据说明
执行 `python manage.py init` 将按顺序创建以下数据:
| 步骤 | 函数 | 创建内容 |
|------|------|----------|
| **1/7** | `create_roles()` | 4 种角色: 系统管理员 / 网络管理员 / 运维人员 / 审计用户 |
| **2/7** | `create_admin_user()` | 管理员账户: `admin` / `Admin@123` |
| **3/7** | `init_dns_server()` | 本地 DNS 服务器实例 (hostname=ns.devnets.net, BIND 9.16.23) |
| **4/7** | `init_dns_global_option()` | 全局配置: recursion=yes, forward=first, dnssec=no, querylog=on |
| **5/7** | `init_dns_acls()` | 3 个 ACL: ID(内网全段) / Trusted(管理网) / SlaveServers(预留空) |
| **6/7** | `init_dns_view()` + `init_dns_zone()` + `init_dns_reverse_zone()` | IDC_View 视图 + devnets.net 正向区域 (11 条记录) + 反向区域 |
| **7/7** | IPAM + Devices (仅完整模式) | 4 区域 / 5 VLAN / 5 子网 / 5 设备 + 交换机 |
> **注意**: 必须先完成 `migrate` 再运行此脚本。使用 `--minimal` 参数跳过第 7 步。
---
## 九、用户角色体系
| 角色 | 编码 | 权限范围 |
|------|------|----------|
| **系统管理员** | `admin` | 全部权限:用户管理、系统配置、所有模块读写 |
| **网络管理员** | `network_admin` | IPAM / DNS / 设备全部资源管理 |
| **运维人员** | `operator` | 资源查询、IP 申请/释放/保留、主机信息维护 |
| **审计用户** | `auditor` | 只读访问:可查看所有资源和变更记录日志 |
---
## 十、DNS 核心工作流
### 发布流程
```
Web 编辑配置 → 保存到数据库(草稿状态)
↓
点击「一键发布」
↓
┌─ Step 1: 渲染 named.conf 完整配置 (ConfigRenderer)
├─ Step 2: named-checkconf 语法校验 (Bind9Service.check_conf)
├─ Step 3: named-checkzone 逐区域校验 (Bind9Service.check_zone)
├─ Step 4: 通过? → 备份当前配置 (DnsBackup, type=pre_publish)
├─ Step 5: 写入新配置到 /etc/named.conf + 各 zone 文件
├─ Step 6: rndc reload / named 重读配置
├─ Step 7: 更新发布版本状态为 success
└─ 任一步骤失败? → 自动回滚备份 → 状态标记 rolled_back
```
### 配置生成层次
```
named.conf (完整文件)
├── logging {} ← 查询日志通道 + 通用日志
├── options {} ← DnsGlobalOption 模型驱动
├── acl "name" {} ← DnsAcl + DnsAclItem 模型驱动 (可多个)
├── view "name" { ← DnsView 模型驱动 (可多个)
│ ├── match-clients / match-destinations → 关联 ACL
│ ├── allow-query / allow-recursion → 关联 ACL
│ └── zone "..." { ← DnsZone 模型驱动
│ └── (zone 文件内容由 DnsRecord 模型渲染)
└── zone "." { ... } ← 根提示区域
```
---
## 十一、manage.py 增强命令
| 命令 | 说明 |
|------|------|
| `python manage.py init` | 完整初始化(角色+管理员+DNS+IPAM示例) |
| `python manage.py init --minimal` | 最小化初始化(仅基础配置) |
| `python manage.py dev` | 启动开发服务器 (0.0.0.0:8000) |
| `python manage.py dev -p 9000` | 自定义端口启动 |
| `python manage.py <标准命令>` | migrate / shell / createsuperuser / collectstatic 等 |
---
## 十二、核心业务规则
1. **CIDR 校验**: 子网必须符合标准 CIDR 格式,创建时自动计算掩码位数
2. **IP 唯一性**: 同一子网内每个 IP 只能有一条记录 (`unique_together`)
3. **IP 状态约束**: available / allocated / reserved / conflict / disabled 五态互斥
4. **DNS Zone 校验**: 保存/发布时自动执行 `named-checkzone` 语法验证
5. **DNS 配置校验**: 发布前执行 `named-checkconf` 验证完整配置合法性
6. **CNAME 互斥**: CNAME 不能与同名其他记录共存(RFC 1034 规范)
7. **A/AAAA 格式**: A 记录值必须为合法 IPv4,AAAA 为合法 IPv6
8. **MX 优先级**: MX 记录必须指定 priority
9. **SOA 序列号**: 修改 Zone 记录后自动递增(日期格式 YYYYMMDDNN)
10. **Zone 类型约束**: Slave 区必须填 master_ips;Forward/Stub 区必须填 forwarders
11. **发布原子性**: 发布过程中任何步骤失败均自动回滚到备份版本
12. **ACL 引用保护**: 被 View/Zone 引用的 ACL 不可删除
13. **网关保留**: 子网创建时网关地址自动标记为 reserved
14. **删除确认**: 所有删除操作均需二次确认弹窗
15. **密码强度**: 编辑用户修改密码时需 >=8 位且包含字母和数字
---
## 十三、扩展建议
本系统的 DNS 模块已完成 BIND9 深度集成,后续可扩展的方向:
- [x] ~~RESTful API 接口层~~
- [x] ~~BIND 配置文件自动生成~~
- [x] ~~对接真实 DNS (BIND9) 服务~~
- [ ] RESTful API 接口层 (Django REST Framework / DRF)
- [ ] Excel 批量导入导出(当前已支持 CSV)
- [ ] IPv6 地址全链路管理
- [ ] IP 地址审批工作流与告警通知 (邮件/钉钉/企微/Webhook)
- [ ] 多租户 / 多组织隔离
- [ ] RBAC 细粒度权限 (对象级别/行级别权限控制)
- [ ] 前后端分离 (Vue.js / React 前端)
- [ ] Docker 容器化部署与 Compose 编排
- [ ] TSIG 密钥管理与动态更新 (DDNS)
- [ ] DNSSEC 签名管理
- [ ] 多 DNS 服务器集群管理
- [ ] Prometheus/Grafana 监控指标对接
---
## 许可证
Apache License 2.0
Copyright (c) 2026 合力数据 (HeliData). All rights reserved.