ip.go 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. package utilx
  2. import (
  3. "net"
  4. "net/http"
  5. "strings"
  6. )
  7. // ClientIP 获取客户端ip
  8. func ClientIP(r *http.Request) string {
  9. xForwardedFor := r.Header.Get("X-Forwarded-For")
  10. ip := strings.TrimSpace(strings.Split(xForwardedFor, ",")[0])
  11. if ip != "" {
  12. return ip
  13. }
  14. ip = strings.TrimSpace(r.Header.Get("X-Real-Ip"))
  15. if ip != "" {
  16. return ip
  17. }
  18. if ip, _, err := net.SplitHostPort(strings.TrimSpace(r.RemoteAddr)); err == nil {
  19. return ip
  20. }
  21. return ""
  22. }
  23. func GetUserAgent(req *http.Request) string {
  24. return req.Header.Get("User-Agent")
  25. }
  26. // 检测IP地址是否为内网IP
  27. func IpIsInternal(ip string) bool {
  28. if ip == "" {
  29. return false
  30. }
  31. rip := net.ParseIP(ip)
  32. // 检查是否位于私有IP范围内
  33. privateRanges := []string{
  34. "10.0.0.0/8",
  35. "172.16.0.0/12",
  36. "192.168.0.0/16",
  37. "169.254.0.0/16", // 链路本地
  38. "127.0.0.0/8", // 本地回环
  39. "::1/128", // IPv6 本地回环
  40. "fe80::/10", // IPv6 链路本地
  41. "fc00::/7",
  42. }
  43. for _, r := range privateRanges {
  44. _, network, _ := net.ParseCIDR(r)
  45. if network.Contains(rip) {
  46. return true
  47. }
  48. }
  49. return false
  50. }
  51. // DirectClientIP 直接获取客户端ip
  52. func DirectClientIP(r *http.Request) string {
  53. if ip, _, err := net.SplitHostPort(strings.TrimSpace(r.RemoteAddr)); err == nil {
  54. return ip
  55. }
  56. return ""
  57. }