ip.go 792 B

12345678910111213141516171819202122232425262728293031
  1. package util
  2. import "net"
  3. // IsLANAddr 检测 IP 地址字符串是否是内网地址
  4. func IsLANAddr(ip string) (bool, string) {
  5. return IsLANIp(net.ParseIP(ip))
  6. }
  7. // IsLANIp 检测 IP 地址是否是内网地址
  8. // 通过直接对比ip段范围效率更高
  9. func IsLANIp(ip net.IP) (bool, string) {
  10. if ip.IsLoopback() {
  11. return true, "127.0.0.0/24"
  12. }
  13. ip4 := ip.To4()
  14. if ip4 == nil {
  15. return false, ""
  16. }
  17. if ip4[0] == 10 { // 10.0.0.0/8
  18. return true, "10.0.0.0/8"
  19. } else if ip4[0] == 172 && ip4[1] >= 16 && ip4[1] <= 31 { // 172.16.0.0/12
  20. return true, "172.16.0.0/12"
  21. } else if ip4[0] == 169 && ip4[1] == 254 { // 169.254.0.0/16
  22. return true, "169.254.0.0/16"
  23. } else if ip4[0] == 192 && ip4[1] == 168 { //192.168.0.0/16
  24. return true, "192.168.0.0/16"
  25. }
  26. return false, ""
  27. }