diff --git a/.github/workflows/ci.yaml b/.github/workflows/ci.yaml index f617fab..3abde40 100644 --- a/.github/workflows/ci.yaml +++ b/.github/workflows/ci.yaml @@ -24,7 +24,7 @@ jobs: run: | git config --global user.name 'github-actions' git config --global user.email 'github-actions@github.com' - TAG="v0.0.4-$(date +'%Y%m%d%H%M%S')" + TAG="v0.0.5-$(date +'%Y%m%d%H%M%S')" git tag $TAG git push origin $TAG env: diff --git a/bk/asn.go b/bk/asn.go index 5769766..34c4504 100644 --- a/bk/asn.go +++ b/bk/asn.go @@ -72,87 +72,126 @@ func removeDuplicates(elements []string) []string { return result // 返回去重后的结果切片 } +// trace IPv4追踪函数 func trace(ch chan Result, i int) { - hops, err := Trace(net.ParseIP(ipv4s[i])) - if err != nil { - s := fmt.Sprintf("%v %-15s %v", ipv4Names[i], ipv4s[i], err) - ch <- Result{i, s} - return - } - var asns []string - for _, h := range hops { - for _, n := range h.Nodes { - asn := ipAsn(n.IP.String()) - if asn != "" { - asns = append(asns, asn) - } - } - } - // 处理CN2不同路线的区别 - if asns != nil && len(asns) > 0 { - var tempText string - asns = removeDuplicates(asns) - tempText += fmt.Sprintf("%v ", ipv4Names[i]) - hasAS4134 := false - hasAS4809 := false - for _, asn := range asns { - if asn == "AS4134" { - hasAS4134 = true - } - if asn == "AS4809" { - hasAS4809 = true - } - } - // 判断是否包含 AS4134 和 AS4809 - if hasAS4134 && hasAS4809 { - // 同时包含 AS4134 和 AS4809 属于 CN2GT - asns = append([]string{"AS4809b"}, asns...) - } else if hasAS4809 { - // 仅包含 AS4809 属于 CN2GIA - asns = append([]string{"AS4809a"}, asns...) - } - tempText += fmt.Sprintf("%-15s ", ipv4s[i]) - for _, asn := range asns { - asnDescription := m[asn] - switch asn { - case "": - continue - case "AS4809": // 被 AS4809a 和 AS4809b 替代了 - continue - case "AS9929": - if !strings.Contains(tempText, asnDescription) { - tempText += DarkGreen(asnDescription) + " " - } - case "AS4809a": - if !strings.Contains(tempText, asnDescription) { - tempText += DarkGreen(asnDescription) + " " - } - case "AS23764": - if !strings.Contains(tempText, asnDescription) { - tempText += DarkGreen(asnDescription) + " " - } - case "AS4809b": - if !strings.Contains(tempText, asnDescription) { - tempText += Green(asnDescription) + " " - } - case "AS58807": - if !strings.Contains(tempText, asnDescription) { - tempText += Green(asnDescription) + " " - } - default: - if !strings.Contains(tempText, asnDescription) { - tempText += White(asnDescription) + " " - } - } - } - if tempText == (fmt.Sprintf("%v ", ipv4Names[i]) + fmt.Sprintf("%-15s ", ipv4s[i])) { - tempText += fmt.Sprintf("%v", Red("检测不到已知线路的ASN")) - } - ch <- Result{i, tempText} - } else { - s := fmt.Sprintf("%v %-15s %v", ipv4Names[i], ipv4s[i], Red("检测不到回程路由节点的IP地址")) - ch <- Result{i, s} - } + if EnableLoger { + InitLogger() + defer Logger.Sync() + Logger.Info(fmt.Sprintf("开始追踪 %s (%s)", ipv4Names[i], ipv4s[i])) + } + hops, err := Trace(net.ParseIP(ipv4s[i])) + if err != nil { + s := fmt.Sprintf("%v %-15s %v", ipv4Names[i], ipv4s[i], err) + + if EnableLoger { + Logger.Error(fmt.Sprintf("追踪 %s (%s) 失败: %v", ipv4Names[i], ipv4s[i], err)) + } + ch <- Result{i, s} + return + } + // 记录每个hop的信息 + if EnableLoger { + for hopNum, hop := range hops { + for nodeNum, node := range hop.Nodes { + Logger.Info(fmt.Sprintf("追踪 %s (%s) - Hop %d, Node %d: %s (RTT: %v)", + ipv4Names[i], ipv4s[i], hopNum+1, nodeNum+1, node.IP.String(), node.RTT)) + } + } + } + var asns []string + for _, h := range hops { + for _, n := range h.Nodes { + asn := ipAsn(n.IP.String()) + if asn != "" { + asns = append(asns, asn) + if EnableLoger { + Logger.Info(fmt.Sprintf("IP %s 对应的ASN: %s", n.IP.String(), asn)) + } + } + } + } + // 处理CN2不同路线的区别 + if asns != nil && len(asns) > 0 { + var tempText string + asns = removeDuplicates(asns) + tempText += fmt.Sprintf("%v ", ipv4Names[i]) + hasAS4134 := false + hasAS4809 := false + for _, asn := range asns { + if asn == "AS4134" { + hasAS4134 = true + } + if asn == "AS4809" { + hasAS4809 = true + } + } + // 判断是否包含 AS4134 和 AS4809 + if hasAS4134 && hasAS4809 { + // 同时包含 AS4134 和 AS4809 属于 CN2GT + asns = append([]string{"AS4809b"}, asns...) + if EnableLoger { + Logger.Info(fmt.Sprintf("%s (%s) 线路识别为: CN2GT", ipv4Names[i], ipv4s[i])) + } + } else if hasAS4809 { + // 仅包含 AS4809 属于 CN2GIA + asns = append([]string{"AS4809a"}, asns...) + if EnableLoger { + Logger.Info(fmt.Sprintf("%s (%s) 线路识别为: CN2GIA", ipv4Names[i], ipv4s[i])) + } + } + tempText += fmt.Sprintf("%-15s ", ipv4s[i]) + for _, asn := range asns { + asnDescription := m[asn] + switch asn { + case "": + continue + case "AS4809": // 被 AS4809a 和 AS4809b 替代了 + continue + case "AS9929": + if !strings.Contains(tempText, asnDescription) { + tempText += DarkGreen(asnDescription) + " " + } + case "AS4809a": + if !strings.Contains(tempText, asnDescription) { + tempText += DarkGreen(asnDescription) + " " + } + case "AS23764": + if !strings.Contains(tempText, asnDescription) { + tempText += DarkGreen(asnDescription) + " " + } + case "AS4809b": + if !strings.Contains(tempText, asnDescription) { + tempText += Green(asnDescription) + " " + } + case "AS58807": + if !strings.Contains(tempText, asnDescription) { + tempText += Green(asnDescription) + " " + } + default: + if !strings.Contains(tempText, asnDescription) { + tempText += White(asnDescription) + " " + } + } + } + if tempText == (fmt.Sprintf("%v ", ipv4Names[i]) + fmt.Sprintf("%-15s ", ipv4s[i])) { + tempText += fmt.Sprintf("%v", Red("检测不到已知线路的ASN")) + + if EnableLoger { + Logger.Warn(fmt.Sprintf("%s (%s) 检测不到已知线路的ASN", ipv4Names[i], ipv4s[i])) + } + } + if EnableLoger { + Logger.Info(fmt.Sprintf("%s (%s) 追踪完成,结果: %s", ipv4Names[i], ipv4s[i], tempText)) + } + ch <- Result{i, tempText} + } else { + s := fmt.Sprintf("%v %-15s %v", ipv4Names[i], ipv4s[i], Red("检测不到回程路由节点的IP地址")) + + if EnableLoger { + Logger.Warn(fmt.Sprintf("%s (%s) 检测不到回程路由节点的IP地址", ipv4Names[i], ipv4s[i])) + } + ch <- Result{i, s} + } } func ipAsn(ip string) string { diff --git a/bk/listen_common.go b/bk/listen_common.go index 184dd44..1ed3370 100644 --- a/bk/listen_common.go +++ b/bk/listen_common.go @@ -11,46 +11,30 @@ import ( ) func (t *Tracer) listen(network string, laddr *net.IPAddr) (*net.IPConn, error) { - if EnableLoger { - InitLogger() - defer Logger.Sync() - conn, err := net.ListenIP(network, laddr) - if err != nil { - Logger.Info(err.Error()) - return nil, err - } - raw, err := conn.SyscallConn() - if err != nil { - Logger.Info(err.Error()) - conn.Close() - return nil, err - } - _ = raw.Control(func(fd uintptr) { - err = syscall.SetsockoptInt(int(fd), syscall.IPPROTO_IP, syscall.IP_HDRINCL, 1) - }) - if err != nil { - Logger.Info(err.Error()) - conn.Close() - return nil, err - } - return conn, nil - } else { - conn, err := net.ListenIP(network, laddr) - if err != nil { - return nil, err - } - raw, err := conn.SyscallConn() - if err != nil { - conn.Close() - return nil, err - } - _ = raw.Control(func(fd uintptr) { - err = syscall.SetsockoptInt(int(fd), syscall.IPPROTO_IP, syscall.IP_HDRINCL, 1) - }) - if err != nil { - conn.Close() - return nil, err - } - return conn, nil - } -} + conn, err := net.ListenIP(network, laddr) + if err != nil { + if EnableLoger { + Logger.Info(err.Error()) + } + return nil, err + } + raw, err := conn.SyscallConn() + if err != nil { + if EnableLoger { + Logger.Info(err.Error()) + } + conn.Close() + return nil, err + } + _ = raw.Control(func(fd uintptr) { + err = syscall.SetsockoptInt(int(fd), syscall.IPPROTO_IP, syscall.IP_HDRINCL, 1) + }) + if err != nil { + if EnableLoger { + Logger.Info(err.Error()) + } + conn.Close() + return nil, err + } + return conn, nil +} \ No newline at end of file diff --git a/bk/listen_unknown.go b/bk/listen_unknown.go index d8dc1a8..bb3fde5 100644 --- a/bk/listen_unknown.go +++ b/bk/listen_unknown.go @@ -14,43 +14,31 @@ func (t *Tracer) listen(network string, laddr *net.IPAddr) (*net.IPConn, error) if EnableLoger { InitLogger() defer Logger.Sync() - conn, err := net.ListenIP(network, laddr) - if err != nil { - Logger.Info(err.Error()) - return nil, err - } - raw, err := conn.SyscallConn() - if err != nil { - Logger.Info(err.Error()) - conn.Close() - return nil, err - } - _ = raw.Control(func(fd uintptr) { - err = syscall.SetsockoptInt(int(fd), syscall.IPPROTO_IP, syscall.IP_HDRINCL, 1) - }) - if err != nil { - Logger.Info(err.Error()) - conn.Close() - return nil, err - } - return conn, nil - } else { - conn, err := net.ListenIP(network, laddr) - if err != nil { - return nil, err - } - raw, err := conn.SyscallConn() - if err != nil { - conn.Close() - return nil, err - } - _ = raw.Control(func(fd uintptr) { - err = syscall.SetsockoptInt(int(fd), syscall.IPPROTO_IP, syscall.IP_HDRINCL, 1) - }) - if err != nil { - conn.Close() - return nil, err - } - return conn, nil } + conn, err := net.ListenIP(network, laddr) + if err != nil { + if EnableLoger { + Logger.Info(err.Error()) + } + return nil, err + } + raw, err := conn.SyscallConn() + if err != nil { + if EnableLoger { + Logger.Info(err.Error()) + } + conn.Close() + return nil, err + } + _ = raw.Control(func(fd uintptr) { + err = syscall.SetsockoptInt(int(fd), syscall.IPPROTO_IP, syscall.IP_HDRINCL, 1) + }) + if err != nil { + if EnableLoger { + Logger.Info(err.Error()) + } + conn.Close() + return nil, err + } + return conn, nil } diff --git a/bk/listen_windows.go b/bk/listen_windows.go index b59c50a..5f87269 100644 --- a/bk/listen_windows.go +++ b/bk/listen_windows.go @@ -11,46 +11,34 @@ import ( ) func (t *Tracer) listen(network string, laddr *net.IPAddr) (*net.IPConn, error) { - if EnableLoger { - InitLogger() - defer Logger.Sync() - conn, err := net.ListenIP(network, laddr) - if err != nil { - Logger.Info(err.Error()) - return nil, err - } - raw, err := conn.SyscallConn() - if err != nil { - Logger.Info(err.Error()) - conn.Close() - return nil, err - } - _ = raw.Control(func(fd uintptr) { - err = windows.SetsockoptInt(windows.Handle(fd), windows.IPPROTO_IP, windows.IP_HDRINCL, 1) - }) - if err != nil { - Logger.Info(err.Error()) - conn.Close() - return nil, err - } - return conn, nil - } else { - conn, err := net.ListenIP(network, laddr) - if err != nil { - return nil, err - } - raw, err := conn.SyscallConn() - if err != nil { - conn.Close() - return nil, err - } - _ = raw.Control(func(fd uintptr) { - err = windows.SetsockoptInt(windows.Handle(fd), windows.IPPROTO_IP, windows.IP_HDRINCL, 1) - }) - if err != nil { - conn.Close() - return nil, err - } - return conn, nil - } -} + if EnableLoger { + InitLogger() + defer Logger.Sync() + } + conn, err := net.ListenIP(network, laddr) + if err != nil { + if EnableLoger { + Logger.Info(err.Error()) + } + return nil, err + } + raw, err := conn.SyscallConn() + if err != nil { + if EnableLoger { + Logger.Info(err.Error()) + } + conn.Close() + return nil, err + } + _ = raw.Control(func(fd uintptr) { + err = windows.SetsockoptInt(windows.Handle(fd), windows.IPPROTO_IP, windows.IP_HDRINCL, 1) + }) + if err != nil { + if EnableLoger { + Logger.Info(err.Error()) + } + conn.Close() + return nil, err + } + return conn, nil +} \ No newline at end of file diff --git a/bk/trace_ipv6.go b/bk/trace_ipv6.go index 13369b4..5aa6b46 100644 --- a/bk/trace_ipv6.go +++ b/bk/trace_ipv6.go @@ -54,20 +54,40 @@ func (t *Tracer) serveIPv6(conn *ipv6.PacketConn) error { } } -// IPv6追踪函数 +// traceIPv6 IPv6追踪函数 func traceIPv6(ch chan Result, i int, offset int) { + if EnableLoger { + InitLogger() + defer Logger.Sync() + Logger.Info(fmt.Sprintf("开始追踪 %s (%s)", ipv6Names[i], ipv6s[i])) + } hops, err := Trace(net.ParseIP(ipv6s[i])) if err != nil { s := fmt.Sprintf("%v %-40s %v", ipv6Names[i], ipv6s[i], err) + if EnableLoger { + Logger.Error(fmt.Sprintf("追踪 %s (%s) 失败: %v", ipv6Names[i], ipv6s[i], err)) + } ch <- Result{i + offset, s} return } + // 记录每个hop的信息 + if EnableLoger { + for hopNum, hop := range hops { + for nodeNum, node := range hop.Nodes { + Logger.Info(fmt.Sprintf("追踪 %s (%s) - Hop %d, Node %d: %s (RTT: %v)", + ipv6Names[i], ipv6s[i], hopNum+1, nodeNum+1, node.IP.String(), node.RTT)) + } + } + } var asns []string for _, h := range hops { for _, n := range h.Nodes { asn := ipAsn(n.IP.String()) if asn != "" { asns = append(asns, asn) + if EnableLoger { + Logger.Info(fmt.Sprintf("IP %s 对应的ASN: %s", n.IP.String(), asn)) + } } } } @@ -90,9 +110,15 @@ func traceIPv6(ch chan Result, i int, offset int) { if hasAS4134 && hasAS4809 { // 同时包含 AS4134 和 AS4809 属于 CN2GT asns = append([]string{"AS4809b"}, asns...) + if EnableLoger { + Logger.Info(fmt.Sprintf("%s (%s) 线路识别为: CN2GT", ipv6Names[i], ipv6s[i])) + } } else if hasAS4809 { // 仅包含 AS4809 属于 CN2GIA asns = append([]string{"AS4809a"}, asns...) + if EnableLoger { + Logger.Info(fmt.Sprintf("%s (%s) 线路识别为: CN2GIA", ipv6Names[i], ipv6s[i])) + } } tempText += fmt.Sprintf("%-40s ", ipv6s[i]) for _, asn := range asns { @@ -130,10 +156,20 @@ func traceIPv6(ch chan Result, i int, offset int) { } if tempText == (fmt.Sprintf("%v ", ipv6Names[i]) + fmt.Sprintf("%-40s ", ipv6s[i])) { tempText += fmt.Sprintf("%v", Red("检测不到已知线路的ASN")) + + if EnableLoger { + Logger.Warn(fmt.Sprintf("%s (%s) 检测不到已知线路的ASN", ipv6Names[i], ipv6s[i])) + } + } + if EnableLoger { + Logger.Info(fmt.Sprintf("%s (%s) 追踪完成,结果: %s", ipv6Names[i], ipv6s[i], tempText)) } ch <- Result{i + offset, tempText} } else { s := fmt.Sprintf("%v %-40s %v", ipv6Names[i], ipv6s[i], Red("检测不到回程路由节点的IP地址")) + if EnableLoger { + Logger.Warn(fmt.Sprintf("%s (%s) 检测不到回程路由节点的IP地址", ipv6Names[i], ipv6s[i])) + } ch <- Result{i + offset, s} } } diff --git a/bk/version.go b/bk/version.go index acf1705..903ae5d 100644 --- a/bk/version.go +++ b/bk/version.go @@ -1,5 +1,5 @@ package backtrace -const BackTraceVersion = "v0.0.4" +const BackTraceVersion = "v0.0.5" var EnableLoger = false