package ip import ( "net" "strings" ) func ExternalIP() (res []string) { inters, err := net.Interfaces() if err != nil { return } for _, inter := range inters { if !strings.HasPrefix(inter.Name, "lo") { addrs, err := inter.Addrs() if err != nil { continue } for _, addr := range addrs { if ipnet, ok := addr.(*net.IPNet); ok { if ipnet.IP.IsLoopback() || ipnet.IP.IsLinkLocalMulticast() || ipnet.IP.IsLinkLocalUnicast() { continue } if ip4 := ipnet.IP.To4(); ip4 != nil { switch true { case ip4[0] == 10: continue case ip4[0] == 172 && ip4[1] >= 16 && ip4[1] <= 31: continue case ip4[0] == 192 && ip4[1] == 168: continue default: res = append(res, ipnet.IP.String()) } } } } } } return } // InternalIP get internal ip. func InternalIP() string { inters, err := net.Interfaces() if err != nil { return "" } for _, inter := range inters { if !isUp(inter.Flags) { continue } if !strings.HasPrefix(inter.Name, "lo") { addrs, err := inter.Addrs() if err != nil { continue } for _, addr := range addrs { if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { if ipnet.IP.To4() != nil { return ipnet.IP.String() } } } } } return "" } // isUp Interface is up func isUp(v net.Flags) bool { return v&net.FlagUp == net.FlagUp }