在Golang获取公共IP

Shu*_*hra 1 go

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

Sar*_*lai 7

以下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
Run Code Online (Sandbox Code Playgroud)

您可以编写一个函数来检查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
}
Run Code Online (Sandbox Code Playgroud)

这是播放链接


小智 7

使用 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
}
Run Code Online (Sandbox Code Playgroud)