function Test-ReservedIP {
param(
[Parameter(Mandatory=$true)]
[string]$IPAddress
)
# 正则匹配 IPv4 格式
$ipv4Pattern = '^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$'
if ($IPAddress -notMatch $ipv4Pattern) {
Write-Error "无效的IPv4地址: $IPAddress"
return $false
}
# 提取并转换为整数数组
$octets = $IPAddress.Split('.') | ForEach-Object { [int]$_ }
# 验证每个八位组范围
foreach ($o in $octets) {
if ($o -lt 0 -or $o -gt 255) {
Write-Error "IP段超出范围 (0-255): $o"
return $false
}
}
# 将IPv4转换为32位无符号整数(大端序)
$ipInt = ($octets[0] -shl 24) + ($octets[1] -shl 16) + ($octets[2] -shl 8) + $octets[3]
# 定义保留IP范围(起始和结束整数)
$reservedRanges = @(
# 127.0.0.0/8 - Loopback
@{ Start = 127 -shl 24; End = (127 -shl 24) + 0x00FFFFFF },
# 10.0.0.0/8 - Private
@{ Start = 10 -shl 24; End = (10 -shl 24) + 0x00FFFFFF },
# 172.16.0.0/12 - Private (172.16.0.0 ~ 172.31.255.255)
@{ Start = (172 -shl 24) + (16 -shl 16); End = (172 -shl 24) + (31 -shl 16) + 0xFFFF },
# 192.168.0.0/16 - Private
@{ Start = (192 -shl 24) + (168 -shl 16); End = (192 -shl 24) + (168 -shl 16) + 0xFFFF },
# 169.254.0.0/16 - Link-local
@{ Start = (169 -shl 24) + (254 -shl 16); End = (169 -shl 24) + (254 -shl 16) + 0xFFFF },
# 224.0.0.0/4 - Multicast (224.0.0.0 ~ 239.255.255.255)
@{ Start = 224 -shl 24; End = (239 -shl 24) + 0x00FFFFFF },
# 192.0.2.0/24 - TEST-NET-1 (examples and tutorials)
@{ Start = (192 -shl 24) + (0 -shl 16) + (2 -shl 8); End = (192 -shl 24) + (0 -shl 16) + (2 -shl 8) + 0xFF },
# 198.51.100.0/24 - TEST-NET-2
@{ Start = (198 -shl 24) + (51 -shl 16) + (100 -shl 8); End = (198 -shl 24) + (51 -shl 16) + (100 -shl 8) + 0xFF },
# 203.0.113.0/24 - TEST-NET-3
@{ Start = (203 -shl 24) + (0 -shl 16) + (113 -shl 8); End = (203 -shl 24) + (0 -shl 16) + (113 -shl 8) + 0xFF },
# 0.0.0.0/8 - This network
@{ Start = 0; End = 0x00FFFFFF }
)
# 判断是否在任一保留范围内
foreach ($range in $reservedRanges) {
if ($ipInt -ge $range.Start -and $ipInt -le $range.End) {
return $true
}
}
return $false
}
$ip = "127.0.1.1"
$isReserved = Test-ReservedIP -IPAddress $ip
if ($isReserved)
{"是保留IP"}
else {"不是保留IP"}