区分公有地址和私有地址, 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