摘要

  • 这篇文章把 IP 发现 -> NetBox 纳管 -> 审计告警 串成第一条可运行的自动化闭环。
  • 重点不在单一脚本,而在如何把 Orb、Diode、Python 和钉钉组合成长期可维护的资产治理流程。
  • 如果你已经完成基础部署,建议从这篇开始进入 NetBox 的工程化使用阶段。

本文基于已完成的 NetBox 部署,讲解如何实现 IP 地址自动发现 + 自动审计 + 自动告警 的完整闭环体系。


一、整体方案说明

本方案包含两大核心能力:

  1. 自动发现 IP 地址

    • 使用 Orb-agent 扫描网络
    • 通过 Diode 自动同步至 NetBox
  2. 自动化审计与告警

    • Python 脚本定期审计 IP 活跃状态
    • 钉钉自动推送异常

二、系统架构设计

同步架构

整个系统采用四层架构,实现从“发现 → 管理 → 审计”的闭环:

text
扫描层(Orb-agent)
        ↓
传输层(Diode)
        ↓
核心管理层(NetBox)
        ↓
审计告警层(Python + 钉钉)

各层职责

  • 扫描层(Orb-agent)

    • 执行网络扫描
    • 通过 gRPC 上报数据
  • 传输层(Diode)

    • 数据清洗与标准化
    • 统一数据入口
  • 核心层(NetBox)

    • 作为 Source of Truth
    • 存储所有 IP 资产
  • 审计层(Python)

    • 监控 IP 活跃状态
    • 自动告警

三、基础环境配置

3.1 软件版本

  • 操作系统:Ubuntu 22.04
  • NetBox:4.4.7
  • Python:3.10.12

3.2 Docker 镜像源

json
{
  "registry-mirrors": [
    "https://docker.m.daocloud.io",
    "https://docker.1panel.live",
    "https://hub.rat.dev"
  ]
}

3.3 Docker 安装

bash
## 安装依赖

sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg jq

# 添加 Docker 密钥
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

# 添加仓库
echo "deb [arch=$(dpkg --print-architecture) \
signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

## 安装 Docker
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io \
docker-buildx-plugin docker-compose-plugin

四、NetBox 与 Diode 集成部署

NetBox Diode 部署与插件配置闭环

配置闭环

4.1 获取密钥

bash
## 密钥 A(插件)
echo $(jq -r '.[] | select(.client_id == "netbox-to-diode") | .client_secret' /opt/diode/oauth2/client/client-credentials.json)

## 密钥 B(Agent)
echo $(jq -r '.[] | select(.client_id == "diode-ingest") | .client_secret' /opt/diode/oauth2/client/client-credentials.json)

4.2 部署 Diode Server

bash
mkdir -p /opt/diode && cd /opt/diode

curl -sSfLo quickstart.sh \
https://raw.githubusercontent.com/netboxlabs/diode/release/diode-server/docker/scripts/quickstart.sh

chmod +x quickstart.sh

./quickstart.sh http://10.10.10.10

docker compose up -d

4.3 NetBox 插件安装

bash
cd /opt/netbox
source venv/bin/activate

pip install netboxlabs-diode-netbox-plugin

4.4 插件配置

python
PLUGINS = [
    "netbox_diode_plugin",
]

PLUGINS_CONFIG = {
    "netbox_diode_plugin": {
        "diode_target_override": "grpc://10.10.10.10:8080/diode",
        "netbox_to_diode_client_secret": "密钥A",
    }
}

4.5 数据库迁移

bash
cd /opt/netbox/netbox
./manage.py migrate netbox_diode_plugin

sudo systemctl restart netbox netbox-rq

五、Orb-Agent 部署

5.1 创建目录

bash
mkdir /opt/orb
cd /opt/orb

5.2 配置 agent.yaml

yaml
orb:
  backends:
    common:
      diode:
        target: grpc://10.10.10.10:8080/diode
        client_id: "diode-ingest"
        client_secret: ${DIODE_INGEST_SECRET}

  policies:
    network_discovery:
      discovery_main:
        config:
          schedule: "0 0 * * *"
          concurrency: 50
          defaults:
          tags: [net-discovery, orb-agent]
          scope:
            targets:
              - 10.10.10.0/24
            exclude:
              - 10.10.10.0/28
          fast_mode: True

5.3 Docker Compose

yaml
services:
  orb-agent:
    image: netboxlabs/orb-agent:latest
    container_name: orb-agent
    environment:
      DIODE_CLIENT_ID: "diode-ingest"
      DIODE_CLIENT_SECRET: "密钥B"
    volumes:
      - /opt/orb:/opt/orb
    command: ["run", "-c", "/opt/orb/agent.yaml"]
    restart: unless-stopped

5.4 启动 Agent

bash
docker compose up -d
docker compose logs

六、自动化审计与钉钉推送

6.1 逻辑设计

  • 7天未更新 → 告警
  • 30天未更新 → 标记为 Deprecated
  • 每日推送状态报告

6.2 环境准备

bash
source /opt/netbox/venv/bin/activate
pip install pynetbox requests

6.3 定时任务

bash
crontab -e
bash
0 9 * * * /opt/netbox/venv/bin/python3 /opt/orb/check_ips.py >> /var/log/netbox_ip_audit.log 2>&1

6.4 Python 示例代码

python
import pynetbox
import requests
import json
from datetime import datetime, timedelta, timezone

NB_URL = "http://10.10.10.10"
NB_TOKEN = "你的API_TOKEN"

DAYS_STALE = 7
DAYS_OFFLINE = 30

DINGTALK_WEBHOOK = "https://oapi.dingtalk.com/robot/send?access_token=你的TOKEN"
AT_MOBILES = ["你的手机号"]

nb = pynetbox.api(NB_URL, token=NB_TOKEN)
now = datetime.now(timezone.utc)

def send_msg(content):
    data = {
        "msgtype": "markdown",
        "markdown": {
            "title": "IP资产自动化审计",
            "text": content
        }
    }
    requests.post(DINGTALK_WEBHOOK, data=json.dumps(data),
                  headers={"Content-Type": "application/json"})

def main():
    ips = nb.ipam.ip_addresses.filter(tag='orb-agent')

    stale = []
    offline = []

    for ip in ips:
        last_seen = datetime.fromisoformat(ip.last_updated.replace('Z', '+00:00'))

        if last_seen < now - timedelta(days=DAYS_OFFLINE):
            ip.status = 'deprecated'
            ip.save()
            offline.append(ip.address)

        elif last_seen < now - timedelta(days=DAYS_STALE):
            stale.append(ip.address)

    msg = "审计结果:\n"
    msg += f"异常IP:{stale}\n"
    msg += f"弃用IP:{offline}"

    send_msg(msg)

if __name__ == "__main__":
    main()

七、排错指南

7.1 Agent 无法同步

  • 查看日志:
bash
docker logs orb-agent

问题定位:

  • Unauthenticated → 密钥错误
  • Connection Refused → Diode 未启动

7.2 插件未生效

检查:


7.3 Python 报错

确认:

bash
source /opt/netbox/venv/bin/activate
pip install pynetbox requests

八、总结

本方案实现了:

  • 自动发现 IP(Orb)
  • 自动入库(Diode + NetBox)
  • 自动审计(Python)
  • 自动告警(钉钉)

最终形成:

IP 资产自动化管理闭环体系


九、延伸建议

可进一步扩展:

  • 对接 Zabbix / ELK
  • 接入多站点统一管理
  • 构建自动化运维平台