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          # 监控间隔(秒)
max_concurrent = 100    # 最大并发数
timeout = 5             # Ping 超时时间(秒)

状态统计

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

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探针被禁用

探针配置

toml
[probe]
enabled = true
scan_interval = 600     # 扫描间隔(秒)
report_interval = 60    # 上报间隔(秒)

监控告警

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

告警规则

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 接口

监控接口

方法路径说明
GET/api/monitoring/status获取监控状态
GET/api/monitoring/stats获取监控统计
POST/api/monitoring/scan手动触发扫描

探针接口

方法路径说明
GET/api/probes获取探针列表
POST/api/probes注册探针
POST/api/probe/report-mac-results上报扫描结果
POST/api/probe/validate-api-key验证API密钥

最佳实践

监控策略

  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 许可发布