网络扫描与监控
网络扫描与监控功能自动发现网络设备,实时监控网络状态,帮助管理员及时掌握网络情况。
在线状态监控
系统实时监控 IP 地址和网关的在线状态。
监控机制
Ping 检测
系统通过 ICMP Ping 检测设备的在线状态:
go
// 监控配置
type MonitoringConfig struct {
Enabled bool // 是否启用监控
Interval int // 监控间隔(秒)
MaxConcurrent int // 最大并发数
Timeout int // 超时时间(秒)
}监控流程:
- 收集目标:获取所有需要监控的 IP 和网关
- 并发检测:使用协程池并发执行 Ping 检测
- 状态更新:根据检测结果更新在线状态
- 数据持久化:将状态变更保存到数据库
状态管理
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 地址信息
}扫描流程
- 获取目标:从数据库获取所有子网的 IP 范围
- ARP 扫描:向每个 IP 发送 ARP 请求
- 收集响应:记录响应的 MAC 地址
- 更新数据:更新 IP 地址的扫描 MAC 地址字段
- 对比分析:对比手动记录和扫描结果的差异
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密钥 |
最佳实践
监控策略
合理设置间隔:
- 小型网络(<1000 IP):300秒
- 中型网络(1000-5000 IP):600秒
- 大型网络(>5000 IP):900秒
控制并发数:
- 根据服务器性能设置
- 避免网络拥塞
- 建议:100-500
关注关键设备:
- 网关设置告警
- 服务器设置高优先级
- 普通终端可降低监控频率
扫描优化
子网划分:
- 按物理位置划分子网
- 便于探针分布式扫描
探针部署:
- 每个物理位置部署探针
- 减少跨网段扫描
时间规划:
- 避开业务高峰期
- 夜间执行深度扫描
故障排查
扫描不到 MAC 地址
- 检查网络连通性
- 确认 ARP 协议未被阻断
- 检查防火墙设置
- 验证扫描权限
在线状态不准确
- 检查 ICMP 是否被禁用
- 调整超时时间
- 增加重试次数
- 检查网络延迟
探针离线
- 检查探针网络连接
- 验证 API 密钥有效性
- 检查主服务器可达性
- 查看探针日志