ip.go 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. package ip
  2. import (
  3. "net"
  4. "strings"
  5. )
  6. func ExternalIP() (res []string) {
  7. inters, err := net.Interfaces()
  8. if err != nil {
  9. return
  10. }
  11. for _, inter := range inters {
  12. if !strings.HasPrefix(inter.Name, "lo") {
  13. addrs, err := inter.Addrs()
  14. if err != nil {
  15. continue
  16. }
  17. for _, addr := range addrs {
  18. if ipnet, ok := addr.(*net.IPNet); ok {
  19. if ipnet.IP.IsLoopback() || ipnet.IP.IsLinkLocalMulticast() || ipnet.IP.IsLinkLocalUnicast() {
  20. continue
  21. }
  22. if ip4 := ipnet.IP.To4(); ip4 != nil {
  23. switch true {
  24. case ip4[0] == 10:
  25. continue
  26. case ip4[0] == 172 && ip4[1] >= 16 && ip4[1] <= 31:
  27. continue
  28. case ip4[0] == 192 && ip4[1] == 168:
  29. continue
  30. default:
  31. res = append(res, ipnet.IP.String())
  32. }
  33. }
  34. }
  35. }
  36. }
  37. }
  38. return
  39. }
  40. // InternalIP get internal ip.
  41. func InternalIP() string {
  42. inters, err := net.Interfaces()
  43. if err != nil {
  44. return ""
  45. }
  46. for _, inter := range inters {
  47. if !isUp(inter.Flags) {
  48. continue
  49. }
  50. if !strings.HasPrefix(inter.Name, "lo") {
  51. addrs, err := inter.Addrs()
  52. if err != nil {
  53. continue
  54. }
  55. for _, addr := range addrs {
  56. if ipnet, ok := addr.(*net.IPNet); ok && !ipnet.IP.IsLoopback() {
  57. if ipnet.IP.To4() != nil {
  58. return ipnet.IP.String()
  59. }
  60. }
  61. }
  62. }
  63. }
  64. return ""
  65. }
  66. // isUp Interface is up
  67. func isUp(v net.Flags) bool {
  68. return v&net.FlagUp == net.FlagUp
  69. }