From fd7a083139508650cb5235c85543230be0d9c9ef Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=A6=86=E6=9C=A8?= <43062104+yumusb@users.noreply.github.com> Date: Sun, 11 Jan 2026 17:55:49 +0800 Subject: [PATCH] =?UTF-8?q?=E7=BD=91=E5=8D=A1IP=E9=87=87=E9=9B=86=E8=BF=87?= =?UTF-8?q?=E6=BB=A4=E6=9C=AC=E5=9C=B0=E5=8D=95=E6=92=AD=E5=9C=B0=E5=9D=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 网卡IP采集过滤本地单播地址,例如 fe80::f816:3eff:fe68:fb57/64、fe80::5054:ff:fe74:1d69/64 等 --- pkg/agent/audit/asset_network.go | 11 +++++++++++ pkg/agent/collector/network.go | 22 +++++++++++++++++----- 2 files changed, 28 insertions(+), 5 deletions(-) diff --git a/pkg/agent/audit/asset_network.go b/pkg/agent/audit/asset_network.go index 90706dd..0e3b36c 100644 --- a/pkg/agent/audit/asset_network.go +++ b/pkg/agent/audit/asset_network.go @@ -3,6 +3,7 @@ package audit import ( "bufio" "fmt" + "net" "os" "os/exec" "strings" @@ -177,6 +178,16 @@ func (nac *NetworkAssetsCollector) collectInterfaces() []protocol.NetworkInterfa // 提取IP地址 for _, addr := range iface.Addrs { + // 过滤 fe80::/10 (Link-Local) 地址 + ip := net.ParseIP(addr.Addr) + if ip == nil { + if parsedIP, _, err := net.ParseCIDR(addr.Addr); err == nil { + ip = parsedIP + } + } + if ip != nil && ip.IsLinkLocalUnicast() { + continue + } netInterface.Addresses = append(netInterface.Addresses, addr.Addr) } diff --git a/pkg/agent/collector/network.go b/pkg/agent/collector/network.go index b012a0f..e5d3f31 100644 --- a/pkg/agent/collector/network.go +++ b/pkg/agent/collector/network.go @@ -1,11 +1,12 @@ package collector import ( + "net" "time" "github.com/dushixiang/pika/internal/protocol" "github.com/dushixiang/pika/pkg/agent/config" - "github.com/shirou/gopsutil/v4/net" + gopsutilNet "github.com/shirou/gopsutil/v4/net" ) // NetworkCollector 网络监控采集器 @@ -57,6 +58,17 @@ func (n *NetworkCollector) Collect() ([]protocol.NetworkData, error) { // 获取 IP 地址列表 var addrs []string for _, addr := range iface.Addrs { + // 过滤 fe80::/10 (Link-Local) 地址 + ip := net.ParseIP(addr.Addr) + if ip == nil { + // 尝试处理带有 CIDR 的字符串 + if parsedIP, _, err := net.ParseCIDR(addr.Addr); err == nil { + ip = parsedIP + } + } + if ip != nil && ip.IsLinkLocalUnicast() { + continue + } addrs = append(addrs, addr.Addr) } @@ -68,7 +80,7 @@ func (n *NetworkCollector) Collect() ([]protocol.NetworkData, error) { } // 创建第一次采集的统计数据映射 - firstStatsMap := make(map[string]net.IOCountersStat) + firstStatsMap := make(map[string]gopsutilNet.IOCountersStat) for _, counter := range firstCounters { firstStatsMap[counter.Name] = counter } @@ -113,15 +125,15 @@ func (n *NetworkCollector) Collect() ([]protocol.NetworkData, error) { } // collectOnce 执行一次网络数据采集 -func (n *NetworkCollector) collectOnce() ([]net.IOCountersStat, []net.InterfaceStat, error) { +func (n *NetworkCollector) collectOnce() ([]gopsutilNet.IOCountersStat, []gopsutilNet.InterfaceStat, error) { // 获取网络接口信息 - interfaces, err := net.Interfaces() + interfaces, err := gopsutilNet.Interfaces() if err != nil { return nil, nil, err } // 获取网络 IO 统计 - ioCounters, err := net.IOCounters(true) + ioCounters, err := gopsutilNet.IOCounters(true) if err != nil { return nil, nil, err }