From 6f0fc98154d5f5ff226dd449916da86febb394f7 Mon Sep 17 00:00:00 2001 From: spiritlhl <103393591+spiritLHLS@users.noreply.github.com> Date: Fri, 11 Apr 2025 14:34:13 +0000 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E5=A4=87=E7=94=A8?= =?UTF-8?q?=E5=9C=B0=E5=9D=80=E5=90=AF=E7=94=A8=E7=9A=84=E9=80=BB=E8=BE=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bk/trace_ipv4.go | 69 +++++++++++++++++++++++++++-------------------- bk/trace_ipv6.go | 70 ++++++++++++++++++++++++++++-------------------- bk/utils.go | 19 ++++++------- 3 files changed, 91 insertions(+), 67 deletions(-) diff --git a/bk/trace_ipv4.go b/bk/trace_ipv4.go index e0b9ef0..36a1b49 100644 --- a/bk/trace_ipv4.go +++ b/bk/trace_ipv4.go @@ -38,6 +38,23 @@ func newPacketV4(id uint16, dst net.IP, ttl int) []byte { return append(buf, p...) } +// extractIpv4ASNsFromHops 从跃点中提取ASN列表 +func extractIpv4ASNsFromHops(hops []*Hop, enableLogger bool) []string { + var asns []string + for _, h := range hops { + for _, n := range h.Nodes { + asn := ipv4Asn(n.IP.String()) + if asn != "" { + asns = append(asns, asn) + if enableLogger { + Logger.Info(fmt.Sprintf("IP %s 对应的ASN: %s", n.IP.String(), asn)) + } + } + } + } + return asns +} + // trace IPv4追踪函数 func trace(ch chan Result, i int) { if model.EnableLoger { @@ -47,21 +64,6 @@ func trace(ch chan Result, i int) { } // 先尝试原始IP地址 hops, err := Trace(net.ParseIP(model.Ipv4s[i])) - if err != nil || len(hops) == 0 { - // 如果失败,尝试从IcmpTargets获取备选IP - if tryAltIPs := tryAlternativeIPs(model.Ipv4Names[i], "v4"); len(tryAltIPs) > 0 { - for _, altIP := range tryAltIPs { - if model.EnableLoger { - Logger.Info(fmt.Sprintf("尝试备选IP %s 追踪 %s", altIP, model.Ipv4Names[i])) - } - hops, err = Trace(net.ParseIP(altIP)) - if err == nil && len(hops) > 0 { - break // 成功找到可用IP - } - } - } - } - // 如果所有尝试都失败 if err != nil { s := fmt.Sprintf("%v %-15s %v", model.Ipv4Names[i], model.Ipv4s[i], Red("检测不到回程路由节点的IP地址")) if model.EnableLoger { @@ -69,6 +71,27 @@ func trace(ch chan Result, i int) { } ch <- Result{i, s} } + asns := extractIpv4ASNsFromHops(hops, model.EnableLoger) + // 如果没有找到ASN,尝试备选IP + if len(asns) == 0 { + // 尝试从IcmpTargets获取备选IP + if tryAltIPs := tryAlternativeIPs(model.Ipv4Names[i], "v4"); len(tryAltIPs) > 0 { + for _, altIP := range tryAltIPs { + if model.EnableLoger { + Logger.Info(fmt.Sprintf("尝试备选IP %s 追踪 %s", altIP, model.Ipv4Names[i])) + } + hops, err = Trace(net.ParseIP(altIP)) + if err == nil && len(hops) > 0 { + newAsns := extractIpv4ASNsFromHops(hops, model.EnableLoger) + asns = append(asns, newAsns...) + if len(newAsns) > 0 { + break // 成功找到可用IP + } + } + } + } + } + asns = removeDuplicates(asns) // 记录每个hop的信息 if model.EnableLoger { for hopNum, hop := range hops { @@ -78,20 +101,8 @@ func trace(ch chan Result, i int) { } } } - var asns []string - for _, h := range hops { - for _, n := range h.Nodes { - asn := ipv4Asn(n.IP.String()) - if asn != "" { - asns = append(asns, asn) - if model.EnableLoger { - Logger.Info(fmt.Sprintf("IP %s 对应的ASN: %s", n.IP.String(), asn)) - } - } - } - } - // 处理CN2不同路线的区别 - if asns != nil && len(asns) > 0 { + // 处理不同线路 + if len(asns) > 0 { var tempText string asns = removeDuplicates(asns) tempText += fmt.Sprintf("%v ", model.Ipv4Names[i]) diff --git a/bk/trace_ipv6.go b/bk/trace_ipv6.go index b06e6ce..bc59a0e 100644 --- a/bk/trace_ipv6.go +++ b/bk/trace_ipv6.go @@ -53,6 +53,24 @@ func (t *Tracer) serveIPv6(conn *ipv6.PacketConn) error { } } +// extractIpv6ASNsFromHops 从跃点中提取ASN列表 +func extractIpv6ASNsFromHops(hops []*Hop, enableLogger bool) []string { + var asns []string + for _, h := range hops { + for _, n := range h.Nodes { + asn := ipv6Asn(n.IP.String()) + if asn != "" { + asns = append(asns, asn) + if enableLogger { + Logger.Info(fmt.Sprintf("IP %s 对应的ASN: %s", n.IP.String(), asn)) + } + } + } + } + return asns +} + + // traceIPv6 IPv6追踪函数 func traceIPv6(ch chan Result, i int, offset int) { if model.EnableLoger { @@ -62,21 +80,6 @@ func traceIPv6(ch chan Result, i int, offset int) { } // 先尝试原始IP地址 hops, err := Trace(net.ParseIP(model.Ipv6s[i])) - if err != nil || len(hops) == 0 { - // 如果失败,尝试从IcmpTargets获取备选IP - if tryAltIPs := tryAlternativeIPs(model.Ipv6Names[i], "v6"); len(tryAltIPs) > 0 { - for _, altIP := range tryAltIPs { - if model.EnableLoger { - Logger.Info(fmt.Sprintf("尝试备选IP %s 追踪 %s", altIP, model.Ipv6Names[i])) - } - hops, err = Trace(net.ParseIP(altIP)) - if err == nil && len(hops) > 0 { - break // 成功找到可用IP - } - } - } - } - // 如果所有尝试都失败 if err != nil { s := fmt.Sprintf("%v %-24s %v", model.Ipv6Names[i], model.Ipv6s[i], Red("检测不到回程路由节点的IP地址")) if model.EnableLoger { @@ -84,6 +87,27 @@ func traceIPv6(ch chan Result, i int, offset int) { } ch <- Result{i + offset, s} } + asns := extractIpv6ASNsFromHops(hops, model.EnableLoger) + // 如果没有找到ASN,尝试备选IP + if len(asns) == 0 { + // 尝试从IcmpTargets获取备选IP + if tryAltIPs := tryAlternativeIPs(model.Ipv4Names[i], "v4"); len(tryAltIPs) > 0 { + for _, altIP := range tryAltIPs { + if model.EnableLoger { + Logger.Info(fmt.Sprintf("尝试备选IP %s 追踪 %s", altIP, model.Ipv4Names[i])) + } + hops, err = Trace(net.ParseIP(altIP)) + if err == nil && len(hops) > 0 { + newAsns := extractIpv6ASNsFromHops(hops, model.EnableLoger) + asns = append(asns, newAsns...) + if len(newAsns) > 0 { + break // 成功找到可用IP + } + } + } + } + } + asns = removeDuplicates(asns) // 记录每个hop的信息 if model.EnableLoger { for hopNum, hop := range hops { @@ -93,20 +117,8 @@ func traceIPv6(ch chan Result, i int, offset int) { } } } - var asns []string - for _, h := range hops { - for _, n := range h.Nodes { - asn := ipv6Asn(n.IP.String()) - if asn != "" { - asns = append(asns, asn) - if model.EnableLoger { - Logger.Info(fmt.Sprintf("IP %s 对应的ASN: %s", n.IP.String(), asn)) - } - } - } - } - // 处理路由信息 - if asns != nil && len(asns) > 0 { + // 处理不同线路 + if len(asns) > 0 { var tempText string asns = removeDuplicates(asns) tempText += fmt.Sprintf("%v ", model.Ipv6Names[i]) diff --git a/bk/utils.go b/bk/utils.go index 2247feb..0509cff 100644 --- a/bk/utils.go +++ b/bk/utils.go @@ -17,16 +17,17 @@ type Result struct { s string } -// removeDuplicates 切片元素去重 +// removeDuplicates 切片去重 func removeDuplicates(elements []string) []string { - encountered := map[string]bool{} - result := []string{} - for v := range elements { - if encountered[elements[v]] { - // 存在过就不加入了 - } else { - encountered[elements[v]] = true - result = append(result, elements[v]) + if elements == nil { + return nil + } + seen := make(map[string]struct{}) + var result []string + for _, v := range elements { + if _, ok := seen[v]; !ok { + seen[v] = struct{}{} + result = append(result, v) } } return result