ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

NetBox 中的 ASN(自治系统号)建模:字段体系、ASN Range 分配与源码实现解析

2026/9/21 18:10:31 拓冰建站 浏览量
NetBox 中的 ASN(自治系统号)建模:字段体系、ASN Range 分配与源码实现解析 后端网络数据建模【免费下载链接】netboxThe premier source of truth powering network automation. Open source under Apache 2. Try NetBox Cloud free: https://netboxlabs.com/products/free-netbox-cloud/项目地址https://gitcode.com/gh_mirrors/ne/netbox点击查看免费下载ASNAutonomous System Number自治系统号是 BGP边界网关协议中标识一个自治系统的全局唯一数字标识。NetBox 将 ASN 作为一等公民对象建模支持 16 位与 32 位两种规格并内置ASN RangeASN 范围机制实现编号的自动分配与统计。本文以官方模型文档docs/models/ipam/asn.md为主线结合 netbox/ipam/models/asns.py、netbox/ipam/fields.py、netbox/ipam/filtersets.py 与 netbox/ipam/api/views.py 等源码系统讲解 ASN 模型的字段语义、唯一性约束、与 RIR / Role / Site 的关联关系以及通过 UI 与 REST API 进行分配和查询的完整实践。读完本文你将能够独立规划 ASN 编号体系、配置 ASN Range 并基于 NetBox 实现 ASN 的全生命周期管理。一、ASN 在 NetBox 中的定位与基本规则在 BGP 语境中ASN 用于标识某个前缀prefix源自或穿越的自治系统。NetBox 将其建模为 IPAM 模块下的核心对象并遵循三条基本规则同时支持 16 位与 32 位 ASN16 位 ASN 取值范围为 1~65535ASN 1 被保留用于 BGP 特殊用途NetBox 实际允许的最小值为 132 位 ASN 可扩展到 42949672952^32 - 1。ASN 在 NetBox 内必须全局唯一底层通过数据库uniqueTrue约束强制保证见 netbox/ipam/models/asns.py 第 135-139 行任何两个 ASN 记录不得重复。ASN 可从预定义的 ASN Range 中分配范围ASN Range 模型文档将 ASN 按数值分段组织并支持自动获取可用编号Available ASNs。此外同一个 ASN 可被分配给多个 Site站点。从源码结构看ASN继承自ContactsMixin, PrimaryModelnetbox/ipam/models/asns.py 第 123 行这意味着它天然具备 NetBox 主模型Primary Model的通用能力变更日志Change Logging、标签Tags、自定义字段Custom Fields、评论Comments等并额外支持联系人Contacts绑定。同时它的前置依赖模型prerequisite是ipam.RIR——即创建 ASN 之前必须先存在至少一个 RIR 记录。二、ASN 字段体系详解依据官方模型文档ASN 对象包含四个核心字段。下表汇总了字段语义与底层实现要点字段类型源码是否必填约束 / 说明AS Number (asn)ASNFieldBigIntegerField 子类是16 或 32 位 AS 号uniqueTrue全局唯一取值范围 1 ~ 4294967295RIR (rir)外键 →ipam.RIR是on_deletemodels.PROTECT负责该 ASN 分配的权威机构Role (role)外键 →ipam.RIR同文件的ipam.Role否on_deletemodels.SET_NULL可为空标识该 ASN 的主要功能Sites (sites)多对多 →dcim.Site否一个 ASN 可绑定一个或多个站点2.1 AS Number16 位与 32 位与 ASDOT 记法AS Number 字段存储真实的数字值。NetBox 对其定义了严格的边界常量见 netbox/ipam/fields.py 第 16-19 行# BGP ASN bounds BGP_ASN_MIN 1 BGP_ASN_MAX 2**32 - 1 BGP_ASN_ASDOT_BASE 2**16BGP_ASN_MIN 1最小值 1BGP_ASN_MAX 4294967295最大值即 32 位 ASN 上界BGP_ASN_ASDOT_BASE 65536ASDOT 记法的基数2^16。ASNField是 DjangoBigIntegerField的子类netbox/ipam/fields.py 第 120-146 行并挂载了MinValueValidator(BGP_ASN_MIN)与MaxValueValidator(BGP_ASN_MAX)两个默认校验器同时在表单层formfield同样注入min_value/max_value从而在数据库、模型校验与 UI 表单三个层面统一限制取值。对于大于 16 位的 ASN即asn 65536NetBox 会自动生成ASDOT 记法如 65536 显示为1.0131076 显示为2.4。ASNField.to_asdot()的实现为staticmethod def to_asdot(value) - str: if value is None: return if value BGP_ASN_ASDOT_BASE: hi, lo divmod(value, BGP_ASN_ASDOT_BASE) return f{hi}.{lo} return str(value)即高 16 位与低 16 位以.分隔。模型层面通过三个属性暴露该能力netbox/ipam/models/asns.py 第 169-190 行asn_asdot仅返回 ASDOT 记法asn_with_asdot当asn 65536时返回数字 (ASDOT)组合形式如131076 (2.4)否则返回纯数字prefixed_name在asn_with_asdot前加AS前缀如AS131076 (2.4)。模型的__str__方法直接返回fAS{self.asn_with_asdot}因此无论 UI 列表还是 API 的display字段32 位 ASN 都会同时呈现十进制与 ASDOT 两种形式方便与设备配置如 Cisco 的asdot风格对照。2.2 RIR分配管理机构RIRRegional Internet Registry区域互联网注册机构是 ASN 分配权的归属方。NetBox 在创建 ASN 时要求必须指定一个 RIR其外键使用on_deletemodels.PROTECT保护删除即只要存在关联的 ASN该 RIR 记录就无法被删除。RIR 并不局限于五大官方注册机构ARIN、RIPE、APNIC、LACNIC、AFRINICNetBox 允许用户自定义例如将 RFC 1918 私有地址空间也建模为一个RIR。具体说明见 RIR 模型文档。2.3 Role功能角色Role角色用于描述 ASN 的主要用途属于用户自定义对象。它与前缀 / VLAN 共用ipam.Role模型Role 模型文档例如可以定义 Customer、Upstream、Transit 等角色。角色是可选项on_deletemodels.SET_NULL意味着删除角色时关联 ASN 的 role 会被置空而非级联删除。2.4 Sites多站点归属一个 ASN 可以同时分配给多个站点反映同一 AS 号横跨多个物理/逻辑站点的常见组网现实例如同一自治系统在多个数据中心出口运行 BGP。此关系通过多对多字段sites实现并由此衍生出site_count统计见下文 API 部分。注意除上述四个字段外ASN模型还包含tenant租户on_deletemodels.PROTECT、description描述、owner归属方以及主模型通用字段tags、custom_fields、comments 等完整字段清单见 API 序列化器 netbox/ipam/api/serializers_/asns.py 第 76-82 行。三、ASN 唯一性与自动分配ASN Range 联动机制官方文档明确指出 ASNs must be globally unique within NetBox, and may be allocated from within a defined range。这一设计由ASNRangeASN 范围模型支撑二者虽无数据库外键关联但通过数值区间逻辑联动。3.1 ASNRange 模型要点ASNRange继承自OrganizationalModelnetbox/ipam/models/asns.py 第 16-120 行字段包括name/slug唯一的人类可读名称与 URL 友好标识rir负责该段编号空间的 RIRPROTECTstart/end范围的起止 ASN闭区间含端点tenant可选的租户归属。其clean()方法强制校验end start否则抛出校验错误 Starting ASN ({start}) must be lower than ending ASN ({end}).。范围还提供了一系列实用属性与方法rangePythonrange(start, end 1)整数序列start_asdot/end_asdot边界 ASN 的 ASDOT 记法range_as_string()/range_as_string_with_asdot()范围字符串表示32 位边界自动附加 ASDOTget_child_asns()查询落在区间内的全部 ASNasn__gtestart, asn__lteendget_available_asns()计算区间内尚未被占用的可用 ASN 列表——实现为set(range) - set(已存在ASN)后排序。def get_available_asns(self): range set(self.range) existing_asns set(self.get_child_asns().values_list(asn, flatTrue)) available_asns sorted(range - existing_asns) return available_asns在列表场景中ASNRangeQuerySet.annotate_asn_counts()netbox/ipam/querysets.py 第 50-65 行通过子查询统计每个范围内已分配的 ASN 数量asn_count——由于 ASN 与 ASNRange 没有外键该实现以OuterRef(start)/OuterRef(end)做数值区间关联并统一标注_虚拟列计数UI 与 API 中的范围使用量即来源于此。3.2 分配工作流典型的 ASN 分配流程为在 IPAM 中先创建RIR如 ARIN、RIPE NCC创建ASN Range指定 RIR 与起止编号如 64512~65534从该 Range 中挑选可用编号创建ASN可借助 UI 的 Available ASNs 视图或 REST API 自动分配为 ASN 绑定 Role、Tenant、Sites 等元数据。四、REST API 实践创建、查询与自动分配NetBox 为 ASN 提供了完整的 REST API路由注册于 netbox/ipam/api/urls.py端点说明/api/ipam/asns/ASN 对象 CRUD/api/ipam/asn-ranges/ASN 范围 CRUD/api/ipam/asn-ranges/{id}/available-asns/获取 / 创建范围内可用 ASN4.1 创建 ASNcurl -X POST https://netbox.example.com/api/ipam/asns/ \ -H Authorization: Token API_TOKEN \ -H Content-Type: application/json \ -d { asn: 64512, rir: 1, role: 3, tenant: null, description: BGP peering with transit provider, sites: [2, 5] }ASNSerializernetbox/ipam/api/serializers_/asns.py 第 60-82 行暴露的字段包括asn、rir、role、tenant、description、owner、comments、tags、custom_fields、sites以及只读统计字段site_count、provider_count。其中sites通过SerializedPKRelatedField以嵌套对象形式返回。4.2 从范围自动分配可用 ASN这是 ASN Range 机制最核心的 API 能力由AvailableASNsViewnetbox/ipam/api/views.py 第 316-353 行实现并配合advisory_lock_key available-asns的数据库咨询锁防止并发分配冲突查询可用 ASNGETcurl https://netbox.example.com/api/ipam/asn-ranges/1/available-asns/ \ -H Authorization: Token API_TOKEN返回形如[ {rir: {id: 1, name: ARIN, slug: arin}, asn: 64512}, {rir: {id: 1, name: ARIN, slug: arin}, asn: 64513} ]批量创建POST向同一端点提交一组仅含description或其他业务字段的对象数组服务端会自动为每条记录填充rir取自父 Range、range与下一个可用asnnetbox/ipam/api/views.py 第 333-341 行的prep_object_data。若请求数量超过剩余可用编号将返回409 CONFLICT该行为在 netbox/ipam/tests/test_api.py 的test_create_multiple_available_asns中验证对一个 101~110 的范围同时提交 11 条记录会得到 409而提交恰好 10 条则全部创建成功。五、筛选与搜索按 RIR、Site、Role 等维度检索ASNFilterSetnetbox/ipam/filtersets.py 第 243-295 行及后续为 ASN 提供了丰富的过滤维度UI 列表与 REST API 通用rir_id/rir按 RIR 主键或 slug 过滤site_id/site按站点主键或 slug 过滤多值site_group_id/site_group按站点组树形TreeNodeMultipleChoiceFilter支持父组含子孙过滤provider_id/provider按运营商Provider过滤role_id/role按角色过滤继承自TenancyFilterSet的tenant/tenant_id等租户过滤。例如通过 API 查询绑定在站点cn-north-1上的全部 ASNcurl https://netbox.example.com/api/ipam/asns/?sitecn-north-1 \ -H Authorization: Token API_TOKENASNRangeFilterSetnetbox/ipam/filtersets.py 第 216-240 行则支持按id、name、slug、rir、start、end、description过滤其中slug字段可直接用于过滤官方模型文档对 slug 的说明同样适用于此处。六、扩展关联Tenant、Contacts 与下游引用ASN模型的关联设计体现了 NetBox 数据建模的一贯风格值得在实际规划中关注Tenant租户tenant外键指向tenancy.TenantPROTECT可将 ASN 纳入租户资源视图Contacts联系人通过ContactsMixin混合类netbox/ipam/models/asns.py 第 8、123 行ASN 可关联联系人及联系组适合记录 RIR 对接人、运营商技术接口等运维信息下游引用从ASNFilterSet可以看到 ASN 与dcim.Site、circuits.Provider存在关联sites、providers字段及对应过滤结合 dcim 的 Site 模型文档 与 circuits 的 Provider 模型文档 可构建ASN → 站点/运营商的完整 BGP 拓扑视图这一点也印证了官方文档each ASN may be assigned to multiple sites的描述在查询层的能力延伸。七、小结ASN 建模的最佳实践编号规划先行先用 ASN Range 将 16 位私有 ASN64512~65534与 32 位 ASN4200000000~4294967294等常用段预先划分再按段自动分配保证全局唯一且可审计RIR 与 Role 必配/宜配RIR 是必填字段且受保护删除Role 建议定义统一的功能角色词汇表便于后续按角色检索与统计利用自动分配 API将GET/POST /api/ipam/asn-ranges/{id}/available-asns/接入自动化流程如网络配置下发前的 ASN 自助申请其咨询锁机制可支撑并发场景善用过滤与扩展字段Site、Site Group、Provider、Tenant、Contacts 等多维关联使 ASN 不仅是编号记录更成为 BGP 网络资产治理的数据源。如需进一步了解范围对象的建模细节可阅读 ASN Range 模型文档涉及 RIR 与角色语义可参考 RIR 模型文档 与 Role 模型文档。相关实现代码位于 netbox/ipam/models/asns.py、netbox/ipam/fields.py、netbox/ipam/api/views.py 与 netbox/ipam/tests/test_api.py可作为二次开发与测试参考。赞分享后端网络数据建模【免费下载链接】netboxThe premier source of truth powering network automation. Open source under Apache 2. Try NetBox Cloud free: https://netboxlabs.com/products/free-netbox-cloud/项目地址https://gitcode.com/gh_mirrors/ne/netbox点击查看免费下载相关推荐NetBox Provider 模型完全指南连接性服务商的建模、字段体系与源码级实现NetBox Provider 模型完全指南连接性服务商的建模、字段体系与源码级实现 本文以 NetBox 官方模型文档 docs/models/circui后端网络数据建模Paperless-ngx 怎么用条形码自动分配档案序列号 ASNPaperless ngx 怎么用条形码自动分配档案序列号 ASN 在 paperless ngx 的推荐工作流里档案序列号archive serial n后端前端全文检索OCR知识管理NocoBase 手机号Phone字段创建、配置与源码实现解析NocoBase 手机号Phone字段创建、配置与源码实现解析 本篇技术指南围绕 NocoBase 数据建模中的手机号Phone字段展开从「Conf低代码后端前端人工智能AI 应用工作流自动化上一篇为什么选择Tess-4-27B-bf16揭秘MLX社区优化版模型的核心竞争力下一篇【亲测免费】 《BAAI bge-reranker-large模型使用技巧分享》创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考