PowerShell检查IP是否为保留IP

 

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"}

 

posted on 2025-08-13 17:23  momingliu11  阅读(13)  评论(0)    收藏  举报