package utils import ( "net" "net/url" ) // IsIntranetURL 判断监控地址的主机是否为内网 / 本机 IP(直填 IP 的虚拟局域网站点)。 // 仅识别主机名为 IPv4/IPv6 字面量的情况;公网域名不在此列。 func IsIntranetURL(raw string) bool { u, err := url.Parse(raw) if err != nil { return false } host := u.Hostname() if host == "" { return false } ip := net.ParseIP(host) if ip == nil { return false } return isIntranetIP(ip) } func isIntranetIP(ip net.IP) bool { if ip.IsLoopback() || ip.IsPrivate() || ip.IsLinkLocalUnicast() { return true } // Go 1.17+ IsPrivate 已含 RFC1918、CGNAT 100.64/10、ULA 等;再兜底部分实现差异 if v4 := ip.To4(); v4 != nil { if v4[0] == 100 && v4[1] >= 64 && v4[1] <= 127 { return true } } return false }