| 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) | |
| }
 |