区分公有地址和私有地址, golang实现

 
区分公有地址(Public IP Addresses)和私有地址(Private IP Addresses)主要依据它们的分配、使用范围以及是否能在全球互联网上直接路由。
 
以下是一些关键区别:
 
 
分配和管理:
 
  公有地址:由互联网地址分配机构(Internet Assigned Numbers Authority, IANA)管理和分配,确保全球唯一性。组织或个人需要向互联网服务提供商(ISP)申请获得公有地址,以便设备能够直接接入互联网并被全球其他设备识别和通信。
 
  私有地址:由IANA预留的一系列地址,专门用于组织内部网络,无需向ISP申请,也不需全球唯一。这些地址不能直接在互联网上路由。
 
 
地址范围:
 
  私有地址范围:
  Class A: 10.0.0.0 到 10.255.255.255
  Class B: 172.16.0.0 到 172.31.255.255
  Class C: 192.168.0.0 到 192.168.255.255
 
  公有地址则涵盖了除上述私有地址范围之外的所有IPv4地址空间。
 
 
使用场景:
 
  公有地址:通常分配给需要直接访问互联网的服务器、路由器出口等,或者任何需要从全球互联网上可直接访问的设备。
 
  私有地址:用于企业内部网络、家庭网络等封闭环境,旨在节省公有IP地址资源,增加网络配置的灵活性,并提升安全性。
 
 
路由:
 
  公有地址:可以直接在互联网上路由,全球唯一,可以被任何互联网上的设备直接访问。
 
  私有地址:在互联网上不可路由,要使私有地址的设备能够访问互联网,通常需要通过网络地址转换(Network Address Translation, NAT)技术,将私有地址转换为一个或多个公有地址。
 
 
因此,判断一个IP地址是公有还是私有,最直接的方法是检查其是否落在上述私有地址的范围内。如果不在私有地址范围内,则该地址是公有地址。
 
 
以下是 golang 的检测是否是私有地址的实现: 
$GOROOT/src/net/ip.go
func (ip IP) IsPrivate() bool {
    if ip4 := ip.To4(); ip4 != nil {
        // Following RFC 1918, Section 3. Private Address Space which says:
        //   The Internet Assigned Numbers Authority (IANA) has reserved the
        //   following three blocks of the IP address space for private internets:
        //     10.0.0.0        -   10.255.255.255  (10/8 prefix)
        //     172.16.0.0      -   172.31.255.255  (172.16/12 prefix)
        //     192.168.0.0     -   192.168.255.255 (192.168/16 prefix)
        return ip4[0] == 10 ||
            (ip4[0] == 172 && ip4[1]&0xf0 == 16) ||
            (ip4[0] == 192 && ip4[1] == 168)
    }
    // Following RFC 4193, Section 8. IANA Considerations which says:
    //   The IANA has assigned the FC00::/7 prefix to "Unique Local Unicast".
    return len(ip) == IPv6len && ip[0]&0xfe == 0xfc
}

使用:

ipv4Private1 := net.ParseIP("10.255.0.0")
fmt.Println(ipv4Private1.IsPrivate()) // true

 

posted on 2024-07-02 22:05  ercom  阅读(50)  评论(0编辑  收藏  举报