# 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

netaxe

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** - 容器编排 ## 🚀 功能特性 ### 地址管理组件 ![地址管理组件](https://cdn.staticaly.com/gh/xuehaoweng/netaxe-image@master/ipam.3vspimj3jf20.webp) #### 核心功能 - ✅ **智能地址分配** - 自动分配可用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" ``` ⭐ 如果这个项目对您有帮助,请给我们一个星标!