Check if IP address is in private network space

前端 未结 2 1203
臣服心动
臣服心动 2021-02-15 00:43

I have a program in go which accepts URLs from clients and gets them using the net/http package. Before doing further processing, I would like to check if the URL maps to privat

2条回答
  •  被撕碎了的回忆
    2021-02-15 01:10

    You might also want to include checks for loopback (IPv4 or IPv6) and/or IPv6 link-local or unique-local addresses. Here is an example with a list of RFC1918 address plus these others and a simple check against them as 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
      }
    

提交回复
热议问题