在Golang获取公共IP

时间:2017-01-16 05:47:55

标签: go

我们如何在golang中获取公共IP?方法req.Header.Get("X-Forwarded-For")返回IP数组。我们如何确定哪一个是公开的,哪个是内部的?有没有其他方法来获取公共(外部)IP?

3 个答案:

答案 0 :(得分:6)

以下IP块保留用于私有IP地址。

Class        Starting IPAddress    Ending IP Address    # of Hosts
A            10.0.0.0              10.255.255.255       16,777,216
B            172.16.0.0            172.31.255.255       1,048,576
C            192.168.0.0           192.168.255.255      65,536
Link-local-u 169.254.0.0           169.254.255.255      65,536
Link-local-m 224.0.0.0             224.0.0.255          256
Local        127.0.0.0             127.255.255.255      16777216

您可以编写一个函数来检查ip是否属于这些

这是尝试做同样的事情,下面的代码不处理ipv6请在需要时添加

func IsPublicIP(IP net.IP) bool {
    if IP.IsLoopback() || IP.IsLinkLocalMulticast() || IP.IsLinkLocalUnicast() {
        return false
    }
    if ip4 := IP.To4(); ip4 != nil {
        switch {
        case ip4[0] == 10:
            return false
        case ip4[0] == 172 && ip4[1] >= 16 && ip4[1] <= 31:
            return false
        case ip4[0] == 192 && ip4[1] == 168:
            return false
        default:
            return true
        }
    }
    return false
}

这是播放link

答案 1 :(得分:0)

我使用以下代码查找公共IP:

//function to get the public ip address
func GetOutboundIP() string {
    conn, err := net.Dial("udp", "8.8.8.8:80")
    HandleError("net.Dial: ",err)
    defer conn.Close()
    localAddr := conn.LocalAddr().String()
    idx := strings.LastIndex(localAddr, ":")
    return localAddr[0:idx]
}

答案 2 :(得分:0)

使用 IP api 将 100% 为您提供您的公共 IP :

type IP struct {
    Query string
}

func getip2() string {
    req, err := http.Get("http://ip-api.com/json/")
    if err != nil {
        return err.Error()
    }
    defer req.Body.Close()

    body, err := ioutil.ReadAll(req.Body)
    if err != nil {
        return err.Error()
    }

    var ip IP
    json.Unmarshal(body, &ip)

    return ip.Query
}