ip.go 992 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051
  1. package common
  2. import "net"
  3. func IsIP(s string) bool {
  4. ip := net.ParseIP(s)
  5. return ip != nil
  6. }
  7. func ParseIP(s string) net.IP {
  8. return net.ParseIP(s)
  9. }
  10. func IsPrivateIP(ip net.IP) bool {
  11. if ip.IsLoopback() || ip.IsLinkLocalUnicast() || ip.IsLinkLocalMulticast() {
  12. return true
  13. }
  14. private := []net.IPNet{
  15. {IP: net.IPv4(10, 0, 0, 0), Mask: net.CIDRMask(8, 32)},
  16. {IP: net.IPv4(172, 16, 0, 0), Mask: net.CIDRMask(12, 32)},
  17. {IP: net.IPv4(192, 168, 0, 0), Mask: net.CIDRMask(16, 32)},
  18. }
  19. for _, privateNet := range private {
  20. if privateNet.Contains(ip) {
  21. return true
  22. }
  23. }
  24. return false
  25. }
  26. func IsIpInCIDRList(ip net.IP, cidrList []string) bool {
  27. for _, cidr := range cidrList {
  28. _, network, err := net.ParseCIDR(cidr)
  29. if err != nil {
  30. // 尝试作为单个IP处理
  31. if whitelistIP := net.ParseIP(cidr); whitelistIP != nil {
  32. if ip.Equal(whitelistIP) {
  33. return true
  34. }
  35. }
  36. continue
  37. }
  38. if network.Contains(ip) {
  39. return true
  40. }
  41. }
  42. return false
  43. }