mirror of
				https://github.com/oneclickvirt/backtrace.git
				synced 2025-11-04 07:42:37 +08:00 
			
		
		
		
	fix: 添加hop日志记录
This commit is contained in:
		
							parent
							
								
									16484ea6ca
								
							
						
					
					
						commit
						466c8dbe5d
					
				
							
								
								
									
										2
									
								
								.github/workflows/ci.yaml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/ci.yaml
									
									
									
									
										vendored
									
									
								
							@ -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:
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										199
									
								
								bk/asn.go
									
									
									
									
									
								
							
							
						
						
									
										199
									
								
								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 {
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
}
 | 
			
		||||
@ -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
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -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
 | 
			
		||||
}
 | 
			
		||||
@ -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}
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,5 @@
 | 
			
		||||
package backtrace
 | 
			
		||||
 | 
			
		||||
const BackTraceVersion = "v0.0.4"
 | 
			
		||||
const BackTraceVersion = "v0.0.5"
 | 
			
		||||
 | 
			
		||||
var EnableLoger = false
 | 
			
		||||
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user