# IPAM
**Repository Path**: NetAxeClub/ipam
## Basic Information
- **Project Name**: IPAM
- **Description**: # 地址管理组件
- 地址分配
- 树结构展示子网
- 地址回收
- 子网段地址使用详情
- EXCEL导出
- IPAM操作日志记录
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: http://47.99.86.164:32092
- **GVP Project**: No
## Statistics
- **Stars**: 4
- **Forks**: 2
- **Created**: 2023-05-30
- **Last Updated**: 2025-12-30
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
IPAM官方文档 | 在线预览
## 📖 项目介绍
**NetAxe Micro IPAM** 是一个专业的IP地址管理系统,专注于网络自动化领域的整体架构解决方案。
[NetAxe] 是一个网络自动化领域解决方案框架,通过微服务和微前端的方式构建的应用集合,主要有资源管理、配置管理、自动化、网络拓扑、地址定位、地址管理等等功能集合,同时各个微应用支持插件形式的能力集成,方便用户自行扩展。
### 🎯 核心特性
- **智能IP地址分配** - 自动化的IP地址分配和回收机制
- **树形子网管理** - 直观的树形结构展示和管理子网
- **实时状态监控** - 实时监控IP地址使用情况和子网状态
- **自动化任务** - 支持定时任务和自动化操作
- **多租户支持** - 支持多用户和多组织管理
- **API接口** - 提供完整的RESTful API接口
- **操作审计** - 完整的操作日志和审计功能
## 🏗️ 技术架构
### 后端技术栈
- **Python 3.x** - 主要开发语言
- **Django 3.2.19** - Web框架
- **Django REST Framework** - API框架
- **Celery** - 异步任务队列
- **MySQL** - 主数据库
- **Redis** - 缓存和消息队列
- **MongoDB** - 日志和审计数据存储
- **RabbitMQ** - 消息中间件
- **Gunicorn** - WSGI服务器
- **APScheduler** - 任务调度器
- **Django Auditlog** - 审计日志系统
### 前端技术栈
- **Vue 3** - 前端框架
- **TypeScript** - 类型安全
- **Vite** - 构建工具
- **Naive UI** - UI组件库
- **Pinia** - 状态管理
- **Vue Router** - 路由管理
- **ECharts** - 数据可视化
### 部署架构
- **Docker** - 容器化部署
- **Nginx** - 反向代理
- **Docker Compose** - 容器编排
## 🚀 功能特性
### 地址管理组件

#### 核心功能
- ✅ **智能地址分配** - 自动分配可用IP地址
- ✅ **树形子网展示** - 直观的树形结构管理子网
- ✅ **地址回收机制** - 自动回收过期或未使用的IP地址
- ✅ **使用详情统计** - 详细的子网段地址使用情况
- ✅ **Excel导出** - 支持数据导出为Excel格式
- ✅ **操作日志记录** - 完整的IPAM操作审计日志
- ✅ **超网管理** - 支持超网和子网的层级管理
- ✅ **网段同步** - 支持从设备网关、云平台等外部系统同步网段信息
- ✅ **规则引擎** - 灵活的规则配置和条件匹配系统
- ✅ **定时任务** - 支持Crontab和固定间隔的定时同步任务
#### IPAM Admin 后台
- 🔧 **后台树形结构** - 管理员友好的树形界面
- 📊 **矩阵展示** - 直观的使用状况矩阵展示
- 👥 **用户权限管理** - 细粒度的权限控制
- 📈 **数据统计报表** - 详细的使用统计和报表
#### 自动化任务
- 🤖 **自动地址回收** - 定时回收过期IP地址
- 🔄 **自动信息更新** - 自动修改特定描述信息
- 🔍 **地址探活检测** - 实时检测IP地址活跃状态
- 📡 **ARP记录同步** - 结合CMDB应用,根据设备信息采集ARP记录进行地址更新
- 🔄 **网段自动同步** - 支持从设备网关、云平台、公有云等外部系统自动同步网段信息
- ⚙️ **规则引擎执行** - 基于配置的规则自动过滤和处理同步的网段数据
- 📊 **定时任务调度** - 支持Crontab表达式和固定间隔的定时任务调度
- 🔗 **父子网段继承** - 子网自动继承超网的网络类型、标签等信息
## 📦 安装部署
### 环境要求
- Docker & Docker Compose
- MySQL 5.7+
- Redis 6.0+
- Python 3.8+ (开发环境)
### 快速部署
#### 1. 克隆项目
```bash
git clone https://gitee.com/NetAxeClub/IPAM.git
cd netaxe-micro-ipam
```
#### 2. 配置环境
```bash
# 复制配置文件
cp config/defaults.json config/config.json
# 修改配置文件
# 将 local_dev 设置为 true
# 将 mysql_host 设置为 "single-mysql-server"
# 将 mysql_port 设置为 38306
```
#### 3. 启动服务
```bash
# 使用单机模式启动容器
docker compose --file single-docker-compose.yml build
docker compose --file single-docker-compose.yml down -v
docker compose --file single-docker-compose.yml up -d
```
### 开发环境部署
#### 后端开发环境
```bash
cd backend
pip install -r requirements.txt
# 数据库迁移
python manage.py migrate
# 创建超级用户
python manage.py createsuperuser
# 启动开发服务器
python manage.py runserver
```
#### 前端开发环境
```bash
cd web
npm install
npm run dev
```
#### Celery 任务队列
```bash
# 启动 Celery Worker
celery -A IpamV1 worker -c 20 -l info
# 启动 Celery Beat (定时任务)
celery -A IpamV1 beat -l info
```
#### 初始化超网数据
```bash
# 初始化超网网段数据
python manage.py init_supernets
# 启动调度器服务
python manage.py start_scheduler
```
## 🔧 配置说明
### 主要配置项
- `mysql_host` - MySQL数据库地址
- `mysql_port` - MySQL数据库端口
- `redis_host` - Redis缓存地址
- `mq_host` - RabbitMQ消息队列地址
- `backend_port` - 后端服务端口
- `web_url` - 前端访问地址
## 🏢 网段管理模块
### 核心功能特性
#### 网段层级管理
- **超网管理** - 支持超网(Supernet)和子网(Subnet)的层级结构
- **父子关系** - 自动建立和维护网段之间的父子关系
- **信息继承** - 子网可继承超网的网络类型、标签等信息
- **状态管理** - 支持多种网段状态:已分配已使用、已分配未使用、未分配已使用、空闲、废弃
#### 网段同步系统
- **多源同步** - 支持从设备网关、云平台、公有云、手动新增等多种来源同步
- **规则引擎** - 灵活的规则配置系统,支持条件匹配和过滤
- **定时调度** - 支持Crontab表达式和固定间隔的定时同步
- **执行监控** - 完整的任务执行日志和状态监控
#### 规则配置系统
- **条件配置** - 支持前缀匹配、掩码匹配等多种条件类型
- **操作符支持** - 等于、不等于、大于、小于、包含、正则匹配等
- **子规则管理** - 支持多个子规则的组合配置
- **规则继承** - 支持规则的继承和合并功能
### 数据模型
#### 主要模型
- **SubnetManageModel** - 网段管理主模型
- **SegmentSyncRule** - 同步规则模型
- **SyncStrategy** - 同步策略模型
- **CrontabSchedule** - Crontab定时配置
- **IntervalSchedule** - 固定间隔配置
- **TaskExecutionLog** - 任务执行日志
#### 网段分类
- **网络类型** - 生产网、研发网、研测网、管理网
- **网段分类** - IPv4公网、IPv4内网、IPv6公网、IPv6内网
- **同步来源** - 设备网关、云平台、公有云、手动新增、手动编辑
### 管理命令
#### 初始化命令
```bash
# 初始化超网网段数据
python manage.py init_supernets
# 启动调度器服务
python manage.py start_scheduler
# 下载Excel数据
python manage.py download_excel
```
### 环境变量
支持通过环境变量覆盖配置文件中的设置,主要环境变量包括:
- `MYSQL_HOST` - MySQL主机地址
- `MYSQL_PORT` - MySQL端口
- `REDIS_HOST` - Redis主机地址
- `RABBITMQ_HOST` - RabbitMQ主机地址
## 📚 API文档
项目提供完整的RESTful API接口,支持:
### 核心管理接口
- **IP地址管理** - 完整的CRUD操作
- **子网管理** - 超网和子网的层级管理
- **用户权限管理** - 细粒度的权限控制
- **操作日志查询** - 完整的审计日志
- **数据统计接口** - 使用情况和状态统计
### 网段同步接口
- **同步规则管理** - 规则配置和条件设置
- **同步策略管理** - 定时任务和调度策略
- **任务执行日志** - 同步任务执行状态和结果
- **网段标签管理** - 标签分类和管理
### 系统管理接口
- **定时任务配置** - Crontab和Interval调度配置
- **系统状态监控** - 调度器状态和任务状态
- **数据导出接口** - Excel格式数据导出
API文档访问地址:`http://your-domain:port/api/docs/`
## 🤝 贡献指南
1. Fork 本仓库
2. 创建特性分支 (`git checkout -b feature/AmazingFeature`)
3. 提交更改 (`git commit -m 'Add some AmazingFeature'`)
4. 推送到分支 (`git push origin feature/AmazingFeature`)
5. 打开 Pull Request
## 📄 许可证
本项目采用 Apache License 2.0 许可证 - 查看 [LICENSE](LICENSE) 文件了解详情
## 👥 组织信息
[NetAxeClub](https://gitee.com/NetAxeClub)
致力于网络自动化工具和平台开发
联系邮箱: netaxe@qun.mail.163.com
## 🔗 相关链接
- [官方文档](https://netaxe.github.io)
- [在线演示](http://47.99.86.164:32092)
- [问题反馈](https://gitee.com/NetAxeClub/IPAM/issues)
- [更新日志](web/CHANGELOG.md)
---
```python
from open_ipam.models import *
from django.db.models import Q
empty_or_null = Subnet.objects.filter(Q(network_type__isnull=True) | Q(network_type=''))
for i in empty_or_null:
# 更新名称
i.name = str(i.subnet)
# 查询归属父级的网段类型
i.network_type = Subnet.objcet.get(id=i.master_subnet_id).network_type
i.save()
from open_ipam.models import *
old_subnets = Subnet.objects.all()
old_subnet_names = [i.name for i in old_subnets]
from subnet_manage.models import *
network_type_map = {
"生产网": "prod",
"研发网": "dev",
"研测网": "test",
"管理网": "mgmt",
"企信办":"work"
}
for old in old_subnets:
if not old.master_subnet_id:
try:
print("父级网段不存在,执行写入一级超网")
sub_man_ins = SubnetManageModel.objects.filter(name=old.name)
if sub_man_ins:
sub_man_ins.update(network_type=network_type_map[old.network_type],)
else:
SubnetManageModel.objects.create(id=old.id, segment_type="supernet", cidr=old.subnet, status='active',
name=old.name, network_type=network_type_map[old.network_type],
category="ipv4_lan", sync_source='manual_sync', operator="admin",
inherit_parent=True,unique_id=f"{old.name}_manual_sync",use_type="ipv4_bus")
print("写入成功",old.name)
except Exception as e:
print("写入失败",old.name,str(e))
for old in old_subnets:
if old.master_subnet_id:
try:
print("父级网段存在,执行写入子网")
SubnetManageModel.objects.create(id=old.id, segment_type="subnet", cidr=old.subnet, status='active',
name=old.name, network_type=network_type_map[old.network_type],
category="ipv4_lan", sync_source='manual_sync', operator="admin",
inherit_parent=True,unique_id=f"{old.name}_manual_sync",use_type="ipv4_bus",parent_id=old.master_subnet_id)
print("写入成功",old.name)
except Exception as e:
print("写入失败",old.name,str(e))
from open_ipam.models import *
ip_subnets = [
"192.168.0.0/16",
"10.1.0.0/16",
"10.10.0.0/16",
"172.16.0.0/16",
"172.17.0.0/16",
"172.18.0.0/16",
"172.19.0.0/16",
"172.20.0.0/16",
"172.21.0.0/16",
"172.22.0.0/16",
"172.23.0.0/16",
"172.24.0.0/16",
"172.25.0.0/16",
"172.26.0.0/16",
"172.27.0.0/16",
"172.28.0.0/16",
"172.29.0.0/16",
"172.30.0.0/16",
"172.31.0.0/16",
"10.100.0.0/16",
"10.101.0.0/16",
"10.103.0.0/16",
"10.104.0.0/16",
"10.105.0.0/16",
"10.106.0.0/16",
"10.107.0.0/16",
"10.108.0.0/16",
"10.109.0.0/16",
"10.112.0.0/16",
"10.113.0.0/16",
"10.114.0.0/16",
"10.115.0.0/16",
"10.110.0.0/16",
"10.250.0.0/16",
"10.254.0.0/16",
"10.255.0.0/16",
"100.118.0.0/16",
"100.125.0.0/16"
]
for i in ip_subnets:
subnet_ins = Subnet.objects.filter(name=i)
if not subnet_ins:
Subnet.objects.create(name=i, subnet=i, network_type="", master_subnet_id=None,mask=16)
def find_16bit_subnet(ip_with_mask):
"""
根据给定掩码的网段查询其归属的16位掩码网段,同时支持IPv4和IPv6
"""
try:
# 尝试直接解析网络
network = ipaddress.ip_network(ip_with_mask, strict=False)
except ValueError as e:
# 尝试修复可能的IPv6格式问题
if ':' in ip_with_mask:
# 检查是否包含掩码
if '/' not in ip_with_mask:
ip_with_mask += '/128' # 默认为单个IPv6地址
# 尝试简化的IPv6解析
try:
ip_part, mask_part = ip_with_mask.split('/')
# 确保掩码有效
if not (0 <= int(mask_part) <= 128):
raise ValueError(f"无效的IPv6掩码: {mask_part}")
# 处理IPv6地址
segments = ip_part.split(':')
# 确保至少有两个段(简化检查)
if len(segments) < 2:
raise ValueError("无效的IPv6地址格式")
# 提取前16位(第一个段)
first_segment = segments[0]
return f"{first_segment}::/16"
except Exception as inner_e:
raise ValueError(f"处理IPv6网段 {ip_with_mask} 时出错: {str(inner_e)}")
else:
# 处理IPv4错误
raise ValueError(f"处理网段 {ip_with_mask} 时出错: {str(e)}")
# 正常解析后的处理逻辑
if isinstance(network, ipaddress.IPv4Network):
# 保留原IPv4处理逻辑
octets = list(map(int, str(network.network_address).split('.')))
ip_integer = (octets[0] << 24) | (octets[1] << 16) | (octets[2] << 8) | octets[3]
mask_16 = 0xFFFF0000
network_16bit = ip_integer & mask_16
octet1 = (network_16bit >> 24) & 0xFF
octet2 = (network_16bit >> 16) & 0xFF
octet3 = (network_16bit >> 8) & 0xFF
octet4 = network_16bit & 0xFF
return f"{octet1}.{octet2}.{octet3}.{octet4}/16"
elif isinstance(network, ipaddress.IPv6Network):
# 正常解析的IPv6处理
segments = list(network.network_address.exploded.split(':'))
first_segment = segments[0]
return f"{first_segment}::/16"
```
⭐ 如果这个项目对您有帮助,请给我们一个星标!