60 lines
1.1 KiB
Go
60 lines
1.1 KiB
Go
package tool
|
|
|
|
import (
|
|
"net"
|
|
)
|
|
|
|
var (
|
|
privateIPv4Blocks []*net.IPNet
|
|
privateIPv6Blocks []*net.IPNet
|
|
)
|
|
|
|
func init() {
|
|
// IPv4私有地址段
|
|
for _, cidr := range []string{
|
|
"10.0.0.0/8", // A类私有地址
|
|
"172.16.0.0/12", // B类私有地址
|
|
"192.168.0.0/16", // C类私有地址
|
|
"169.254.0.0/16", // 链路本地地址
|
|
"127.0.0.0/8", // 环回地址
|
|
} {
|
|
_, block, _ := net.ParseCIDR(cidr)
|
|
privateIPv4Blocks = append(privateIPv4Blocks, block)
|
|
}
|
|
|
|
// IPv6私有地址段
|
|
for _, cidr := range []string{
|
|
"fc00::/7", // 唯一本地地址
|
|
"fe80::/10", // 链路本地地址
|
|
"::1/128", // 环回地址
|
|
} {
|
|
_, block, _ := net.ParseCIDR(cidr)
|
|
privateIPv6Blocks = append(privateIPv6Blocks, block)
|
|
}
|
|
}
|
|
|
|
func IsPrivateIP(ipStr string) bool {
|
|
ip := net.ParseIP(ipStr)
|
|
if ip == nil {
|
|
return false
|
|
}
|
|
|
|
// 处理IPv4和IPv4映射的IPv6地址
|
|
if ip4 := ip.To4(); ip4 != nil {
|
|
for _, block := range privateIPv4Blocks {
|
|
if block.Contains(ip4) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// 处理IPv6地址
|
|
for _, block := range privateIPv6Blocks {
|
|
if block.Contains(ip) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|