Skip to content

网络扫描与监控

网络扫描与监控功能自动发现网络设备,实时监控网络状态,帮助管理员及时掌握网络情况。

在线状态监控

系统实时监控 IP 地址和网关的在线状态。

监控机制

Ping 检测

系统通过 ICMP Ping 检测设备的在线状态:

go
// 监控配置
type MonitoringConfig struct {
    Enabled       bool   // 是否启用监控
    Interval      int    // 监控间隔(秒)
    MaxConcurrent int    // 最大并发数
    Timeout       int    // 超时时间(秒)
}

监控流程:

  1. 收集目标:获取所有需要监控的 IP 和网关
  2. 并发检测:使用协程池并发执行 Ping 检测
  3. 状态更新:根据检测结果更新在线状态
  4. 数据持久化:将状态变更保存到数据库

状态管理

go
type IPState struct {
    IPAddress  string    // IP地址
    IsOnline   bool      // 在线状态
    MACAddress string    // MAC地址
    LastSeen   time.Time // 最后在线时间
    UpdatedAt  time.Time // 更新时间
    Changed    bool      // 是否有变更
}

监控配置

config.toml 中配置监控参数:

toml
[monitoring]
enabled = true              # 启用监控(必须启用才能接收探针数据)
interval = 300              # 监控间隔(秒)
gateway_timeout = 5         # 网关 Ping 超时时间(秒)
ip_timeout = 3              # IP 地址 Ping 超时时间(秒)
max_concurrent = 100        # 最大并发数
enable_host_scanning = false  # 是否启用主程序全量 ARP/MAC 扫描

enable_host_scanning 参数说明

  • false(默认):主程序不执行 ARP 扫描,仅通过 API 接收独立探针客户端上报的 MAC 地址数据
  • true:主程序主动执行 ARP 扫描获取 MAC 地址(适合小型单网段环境)

推荐使用方式

  • 小型网络(单网段):设置为 true,主程序直接扫描
  • 中大型网络(多网段):保持 false,部署独立探针客户端分布式扫描

状态统计

系统提供在线状态的实时统计:

json
{
  "total_ips": 254,
  "online": 120,
  "offline": 134,
  "online_rate": "47.2%",
  "last_scan": "2024-01-15 10:30:00"
}

ARP 扫描

ARP 扫描通过发送 ARP 请求发现网络中的设备,获取 MAC 地址信息。

扫描原理

┌─────────────┐      ARP Request       ┌─────────────┐
│   Scanner   │ ────────────────────> │   Target    │
│  192.168.1.2│  "Who has 192.168.1.5?"│  192.168.1.5│
└─────────────┘                        └─────────────┘
       ^                                      │
       │      ARP Reply                       │
       │ <────────────────────────────────────┘
       │   "192.168.1.5 is at 00:11:22:33:44:55"

   记录 MAC 地址

扫描器实现

go
type Scanner struct {
    config         *config.Config
    scanInterval   time.Duration
    macTimeout     time.Duration
    maxConcurrent  int
    ipCache        map[string]*IPState
    cacheManager   *monitoring.CacheManager
}

// 启动扫描服务
func (s *Scanner) Start() {
    // 等待 monitoring 服务初始化
    // 定期执行 ARP 扫描
    // 更新 IP 的 MAC 地址信息
}

扫描流程

  1. 获取目标:从数据库获取所有子网的 IP 范围
  2. ARP 扫描:向每个 IP 发送 ARP 请求
  3. 收集响应:记录响应的 MAC 地址
  4. 更新数据:更新 IP 地址的扫描 MAC 地址字段
  5. 对比分析:对比手动记录和扫描结果的差异

MAC 地址管理

系统维护两个 MAC 地址字段:

go
type IPAddress struct {
    MacAddress        string    // 手动记录的 MAC 地址
    ScannedMacAddress string    // 扫描获取的 MAC 地址
}

差异检测

当手动记录和扫描结果不一致时:

  • 记录差异日志
  • 标记 IP 地址需要关注
  • 可选:发送告警通知

探针系统

探针系统支持分布式扫描,适用于大型网络环境。

架构设计

┌─────────────────────────────────────────┐
│              主服务器                    │
│  ┌──────────────┐  ┌──────────────┐    │
│  │  API Server  │  │  数据聚合     │    │
│  └──────────────┘  └──────────────┘    │
└──────────┬──────────────────────────────┘
           │ HTTP API

┌─────────────────────────────────────────┐
│              探针节点 1                  │
│  ┌──────────────┐  ┌──────────────┐    │
│  │  本地扫描    │  │  数据上报     │    │
│  │  ·ARP扫描   │  │              │    │
│  │  ·Ping检测  │  │              │    │
│  └──────────────┘  └──────────────┘    │
└─────────────────────────────────────────┘


┌─────────────────────────────────────────┐
│              探针节点 2                  │
│  ┌──────────────┐  ┌──────────────┐    │
│  │  本地扫描    │  │  数据上报     │    │
│  └──────────────┘  └──────────────┘    │
└─────────────────────────────────────────┘

探针注册

探针通过 API 密钥向主服务器注册:

go
// 探针注册请求
type ProbeRegisterRequest struct {
    Name      string `json:"name"`       // 探针名称
    IPAddress string `json:"ip_address"` // 探针IP
    Location  string `json:"location"`   // 部署位置
}

// 探针注册响应
type ProbeRegisterResponse struct {
    ProbeID string `json:"probe_id"`    // 探针ID
    APIKey  string `json:"api_key"`     // API密钥
}

数据上报

探针扫描完成后上报数据:

go
// MAC扫描结果上报
type ProbeReportRequest struct {
    APIKey  string       `json:"api_key"`
    Results []MACResult  `json:"results"`
}

type MACResult struct {
    IP         string    `json:"ip"`
    MACAddress string    `json:"mac_address"`
    Timestamp  time.Time `json:"timestamp"`
}

探针管理

探针状态

状态说明
online探针在线,正常工作
offline探针离线,可能网络故障
disabled探针被禁用

探针配置

服务端配置config.toml):

toml
[monitoring]
enabled = true              # 必须启用以接收探针数据
enable_host_scanning = false  # 禁用主程序扫描,由探针客户端执行

探针客户端配置(命令行参数):

bash
./ipam-probe \
  -server http://ipam-server:8080 \
  -apikey your-api-key \
  -subnet 192.168.1.0/24 \
  -interval 60 \
  -scan-mac=true

探针客户端参数说明

参数说明默认值
-serverAPI 服务器地址必填
-apikeyAPI 密钥必填
-subnet扫描子网(CIDR格式)自动检测
-interval扫描间隔(秒)60
-scan-mac是否执行 MAC 扫描true
-sync-ip是否同步 IP 在线状态false

监控告警

系统支持配置监控告警规则。

告警规则

go
type AlertRule struct {
    ID          int       // 规则ID
    Name        string    // 规则名称
    TargetType  string    // 目标类型(ip/gateway/subnet)
    TargetID    int       // 目标ID
    Condition   string    // 条件(offline/online_change)
    Threshold   int       // 阈值
    Enabled     bool      // 是否启用
}

告警类型

告警类型说明触发条件
设备离线IP/网关离线连续检测失败
MAC变更MAC地址变化扫描结果与记录不符
状态变更在线状态变化在线/离线切换
扫描失败扫描任务失败探针上报失败

告警通知

支持多种通知方式:

  • 邮件通知:发送告警邮件
  • Webhook:调用外部接口
  • 系统消息:在系统内显示告警

API 接口

探针客户端接口(无需认证)

方法路径说明
POST/probe/register注册探针客户端
POST/probe/heartbeat探针心跳
POST/probe/report上报扫描结果

探针管理接口(需要认证)

方法路径说明
GET/api/probe/clients获取探针客户端列表
GET/api/probe/clients/stats获取探针统计
GET/api/probe/clients/count获取探针数量
PATCH/api/probe/clients更新探针客户端
DELETE/api/probe/clients删除探针客户端
GET/api/probe/reports获取上报记录列表
GET/api/probe/reports/stats获取上报记录统计
GET/api/probe/reports/count获取上报记录数量
DELETE/api/probe/reports删除上报记录

最佳实践

监控策略

  1. 合理设置间隔

    • 小型网络(<1000 IP):300秒
    • 中型网络(1000-5000 IP):600秒
    • 大型网络(>5000 IP):900秒
  2. 控制并发数

    • 根据服务器性能设置
    • 避免网络拥塞
    • 建议:100-500
  3. 关注关键设备

    • 网关设置告警
    • 服务器设置高优先级
    • 普通终端可降低监控频率

扫描优化

  1. 子网划分

    • 按物理位置划分子网
    • 便于探针分布式扫描
  2. 探针部署

    • 每个物理位置部署探针
    • 减少跨网段扫描
  3. 时间规划

    • 避开业务高峰期
    • 夜间执行深度扫描

故障排查

扫描不到 MAC 地址

  1. 检查网络连通性
  2. 确认 ARP 协议未被阻断
  3. 检查防火墙设置
  4. 验证扫描权限

在线状态不准确

  1. 检查 ICMP 是否被禁用
  2. 调整超时时间
  3. 增加重试次数
  4. 检查网络延迟

探针离线

  1. 检查探针网络连接
  2. 验证 API 密钥有效性
  3. 检查主服务器可达性
  4. 查看探针日志

基于 MIT 许可发布