lanCheck.go 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110
  1. package prouter
  2. import (
  3. "bytes"
  4. "net"
  5. "net/http"
  6. "strings"
  7. )
  8. type ipRange struct {
  9. start net.IP
  10. end net.IP
  11. }
  12. var privateRanges = []ipRange{
  13. ipRange{
  14. start: net.ParseIP("10.0.0.0"),
  15. end: net.ParseIP("10.255.255.255"),
  16. },
  17. ipRange{
  18. start: net.ParseIP("100.64.0.0"),
  19. end: net.ParseIP("100.127.255.255"),
  20. },
  21. ipRange{
  22. start: net.ParseIP("172.16.0.0"),
  23. end: net.ParseIP("172.31.255.255"),
  24. },
  25. ipRange{
  26. start: net.ParseIP("192.0.0.0"),
  27. end: net.ParseIP("192.0.0.255"),
  28. },
  29. ipRange{
  30. start: net.ParseIP("192.168.0.0"),
  31. end: net.ParseIP("192.168.255.255"),
  32. },
  33. ipRange{
  34. start: net.ParseIP("198.18.0.0"),
  35. end: net.ParseIP("198.19.255.255"),
  36. },
  37. ipRange{
  38. start: net.ParseIP("198.18.0.0"),
  39. end: net.ParseIP("198.19.255.255"),
  40. },
  41. }
  42. func checkIfLAN(r *http.Request) bool {
  43. PredictedClientIP := []net.IP{}
  44. forwarded := r.Header.Get("X-FORWARDED-FOR")
  45. rip := r.Header.Get("X-Real-Ip") //Not that kind of RIP
  46. if forwarded != "" {
  47. ips := strings.Split(forwarded, ", ")
  48. for _, ip := range ips {
  49. PredictedClientIP = append(PredictedClientIP, net.ParseIP(strings.TrimSpace(ip)))
  50. }
  51. } else if rip != "" {
  52. PredictedClientIP = append(PredictedClientIP, net.ParseIP(strings.TrimSpace(rip)))
  53. } else {
  54. ip, _, err := net.SplitHostPort(r.RemoteAddr)
  55. if err != nil {
  56. } else {
  57. userIP := net.ParseIP(ip)
  58. PredictedClientIP = append(PredictedClientIP, userIP)
  59. }
  60. }
  61. //Check if localhost loopback
  62. if len(PredictedClientIP) == 1 {
  63. onlyAddr := PredictedClientIP[0].String()
  64. if onlyAddr == "127.0.0.1" {
  65. return true
  66. } else if onlyAddr == "::1" {
  67. return true
  68. } else if onlyAddr == "localhost" {
  69. return true
  70. }
  71. }
  72. IsLocal := true
  73. for _, thisIP := range PredictedClientIP {
  74. thisIpIsPrivate := isPrivateSubnet(thisIP)
  75. if thisIpIsPrivate == false {
  76. IsLocal = false
  77. }
  78. }
  79. return IsLocal
  80. }
  81. func isPrivateSubnet(ipAddress net.IP) bool {
  82. // my use case is only concerned with ipv4 atm
  83. if ipCheck := ipAddress.To4(); ipCheck != nil {
  84. // iterate over all our ranges
  85. for _, r := range privateRanges {
  86. // check if this ip is in a private range
  87. if inRange(r, ipAddress) {
  88. return true
  89. }
  90. }
  91. }
  92. return false
  93. }
  94. func inRange(r ipRange, ipAddress net.IP) bool {
  95. // strcmp type byte comparison
  96. if bytes.Compare(ipAddress, r.start) >= 0 && bytes.Compare(ipAddress, r.end) < 0 {
  97. return true
  98. }
  99. return false
  100. }