external.go 885 B

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. package ip
  2. import (
  3. "net"
  4. "strings"
  5. )
  6. func External() (res []string) {
  7. var (
  8. err error
  9. addrs []net.Addr
  10. inters []net.Interface
  11. )
  12. if inters, err = net.Interfaces(); err != nil {
  13. return
  14. }
  15. for _, inter := range inters {
  16. if !strings.HasPrefix(inter.Name, "lo") {
  17. if addrs, err = inter.Addrs(); err != nil {
  18. continue
  19. }
  20. for _, addr := range addrs {
  21. if ipNet, ok := addr.(*net.IPNet); ok {
  22. if ipNet.IP.IsLoopback() || ipNet.IP.IsLinkLocalMulticast() || ipNet.IP.IsLinkLocalUnicast() {
  23. continue
  24. }
  25. if ip4 := ipNet.IP.To4(); ip4 != nil {
  26. switch true {
  27. case ip4[0] == 10:
  28. continue
  29. case ip4[0] == 172 && ip4[1] >= 16 && ip4[1] <= 31:
  30. continue
  31. case ip4[0] == 192 && ip4[1] == 168:
  32. continue
  33. default:
  34. res = append(res, ipNet.IP.String())
  35. }
  36. }
  37. }
  38. }
  39. }
  40. }
  41. return
  42. }