package setup import ( "net" "sort" "strings" ) // DetectLocalIPs returns non-loopback, non-docker IPv4 addresses. func DetectLocalIPs() []string { ifaces, err := net.Interfaces() if err != nil { return nil } var ips []string for _, iface := range ifaces { // Skip down, loopback, and Docker/container interfaces if iface.Flags&net.FlagUp == 0 || iface.Flags&net.FlagLoopback != 0 { continue } name := strings.ToLower(iface.Name) if strings.HasPrefix(name, "docker") || strings.HasPrefix(name, "br-") || strings.HasPrefix(name, "veth") || strings.HasPrefix(name, "lo") { continue } addrs, err := iface.Addrs() if err != nil { continue } for _, addr := range addrs { var ip net.IP switch v := addr.(type) { case *net.IPNet: ip = v.IP case *net.IPAddr: ip = v.IP } if ip == nil || ip.IsLoopback() || ip.To4() == nil { continue // skip non-IPv4 } ips = append(ips, ip.String()) } } sort.Strings(ips) return ips }