package network import ( "errors" "net" "net/http" "strconv" "strings" ) /** * 取本地IP */ func GetLocalIps() []string { addrs, err := net.InterfaceAddrs() var list []string if err != nil { return list } for _, address := range addrs { // 检查ip地址判断是否回环地址 if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { if ipnet.IP.To4() != nil && !ipnet.IP.IsLinkLocalUnicast() { if IsPrivateIp(ipnet.IP.String()) { list = append(list, ipnet.IP.String()) } } } } return list } /** * 取外网IP */ func GetInternetIps() []string { addrs, err := net.InterfaceAddrs() var list []string if err != nil { return list } for _, address := range addrs { // 检查ip地址判断是否回环地址 if ipnet, ok := address.(*net.IPNet); ok && !ipnet.IP.IsLoopback() { if ipnet.IP.To4() != nil && !ipnet.IP.IsLinkLocalUnicast() { if !IsPrivateIp(ipnet.IP.String()) { list = append(list, ipnet.IP.String()) } } } } return list } /** * 是否本地(局域网)IP */ func IsPrivateIp(ip string) bool { process_ip := getIpNumber(ip) /** * 私有IP:A类 10.0.0.0 -10.255.255.255 * B类 172.16.0.0 -172.31.255.255 * C类 192.168.0.0 -192.168.255.255 * D类 127.0.0.0 -127.255.255.255(环回地址) */ a_begin := getIpNumber("10.0.0.0") a_end := getIpNumber("10.255.255.255") if process_ip >= a_begin && process_ip <= a_end { return true } b_begin := getIpNumber("172.16.0.0") b_end := getIpNumber("172.31.255.255") if process_ip >= b_begin && process_ip <= b_end { return true } c_begin := getIpNumber("192.168.0.0") c_end := getIpNumber("192.168.255.255") if process_ip >= c_begin && process_ip <= c_end { return true } d_begin := getIpNumber("127.0.0.0") d_end := getIpNumber("127.255.255.255") if process_ip >= d_begin && process_ip <= d_end { return true } return false } func getIpNumber(ip string) int64 { ip_segment := strings.Split(ip, ".") if len(ip_segment) != 4 { return -1 } segment_1, _ := strconv.ParseInt(ip_segment[0], 10, 64) segment_2, _ := strconv.ParseInt(ip_segment[1], 10, 64) segment_3, _ := strconv.ParseInt(ip_segment[2], 10, 64) segment_4, _ := strconv.ParseInt(ip_segment[3], 10, 64) ip_num := segment_1*256*256*256 + segment_2*256*256 + segment_3*256 + segment_4 return ip_num } /** * 取来源地址 */ func GetRemoteIp(req *http.Request) string { forward_ip := req.Header.Get("X-Forwarded-For") //使用代理 if forward_ip != "" { forward_ips := strings.Split(forward_ip, ",") if len(forward_ips) > 0 && forward_ips[0] != "" { remoteIp, _, err := net.SplitHostPort(forward_ips[0]) if err != nil { remoteIp = forward_ips[0] } return remoteIp } } if remoteIp, _, err := net.SplitHostPort(req.RemoteAddr); err == nil { return remoteIp } return req.RemoteAddr } /** * ip是否正确 */ func GetNumber(ip, mask string) (string, error) { a := net.ParseIP(ip) if a == nil { return "", errors.New("150057") } b := net.ParseIP(mask) if b == nil { return "", errors.New("150058") } ips := strings.Split(ip, ".") a1, _ := strconv.Atoi(ips[0]) a2, _ := strconv.Atoi(ips[1]) a3, _ := strconv.Atoi(ips[2]) a4, _ := strconv.Atoi(ips[3]) masks := strings.Split(mask, ".") m1, _ := strconv.Atoi(masks[0]) m2, _ := strconv.Atoi(masks[1]) m3, _ := strconv.Atoi(masks[2]) m4, _ := strconv.Atoi(masks[3]) n1 := a1 & m1 n2 := a2 & m2 n3 := a3 & m3 n4 := a4 & m4 return strconv.Itoa(n1) + "." + strconv.Itoa(n2) + "." + strconv.Itoa(n3) + "." + strconv.Itoa(n4), nil } /* * CIDR取IP mask * 2019/03/07 */ func GetIpMaskFromCIDR(ip string) (string, string, error) { ips, ipNet, err := net.ParseCIDR(ip) if err != nil { return "", "", err } val := make([]byte, len(ipNet.Mask)) copy(val, ipNet.Mask) var s []string for _, i := range val[:] { s = append(s, strconv.Itoa(int(i))) } return ips.String(), strings.Join(s, "."), nil } /* * net mask转换, 255.255.255.0 -> 24 * 2019/03/07 */ func ChangeMask(mask string) string { s := strings.Split(mask, ".") s1, _ := strconv.Atoi(s[0]) s2, _ := strconv.Atoi(s[1]) s3, _ := strconv.Atoi(s[2]) s4, _ := strconv.Atoi(s[3]) ipmask := net.IPv4Mask(byte(s1), byte(s2), byte(s3), byte(s4)) ones, _ := ipmask.Size() return strconv.Itoa(ones) }