检查IP地址是否在私网空间

2023-12-28

我有一个 go 程序,它接受来自客户端的 URL 并使用 net/http 包获取它们。在进行进一步处理之前,我想检查 URL 是否映射到私有(不可路由/RFC1918 网络)地址空间。

直接的方法是执行显式 DNS 请求并检查已知私有范围的地址。之后,对 URL 执行 HTTP GET 请求。

有更好的方法来实现这一点吗?最好与 http.Client 集成,以便它可以作为 GET 请求的一部分执行。


您可能还希望包括对环回(IPv4 或 IPv6)和/或 IPv6 链路本地或唯一本地地址的检查。下面是一个示例,其中包含 RFC1918 地址以及其他地址的列表,并对它们进行简单检查:isPrivateIP(ip net.IP):

var privateIPBlocks []*net.IPNet

func init() {
    for _, cidr := range []string{
        "127.0.0.0/8",    // IPv4 loopback
        "10.0.0.0/8",     // RFC1918
        "172.16.0.0/12",  // RFC1918
        "192.168.0.0/16", // RFC1918
        "169.254.0.0/16", // RFC3927 link-local
        "::1/128",        // IPv6 loopback
        "fe80::/10",      // IPv6 link-local
        "fc00::/7",       // IPv6 unique local addr
    } {
        _, block, err := net.ParseCIDR(cidr)
        if err != nil {
            panic(fmt.Errorf("parse error on %q: %v", cidr, err))
        }
        privateIPBlocks = append(privateIPBlocks, block)
    }
}

func isPrivateIP(ip net.IP) bool {
    if ip.IsLoopback() || ip.IsLinkLocalUnicast() || ip.IsLinkLocalMulticast() {
        return true
    }

    for _, block := range privateIPBlocks {
        if block.Contains(ip) {
            return true
        }
    }
    return false
  }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

检查IP地址是否在私网空间 的相关文章

随机推荐