You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure虚拟网络中查找子网间未分配地址空间的PowerShell技术问询

解决子网间未分配地址空间的PowerShell实现方案

核心思路

要找出两个子网间的未分配空间,关键是把抽象的IP地址转为可计算的数值,通过区间对比定位空闲段,再按目标掩码拆分出可分配子网:

  1. 将所有已存在子网转为网络地址+掩码长度的标准化格式,计算每个子网的起始/结束IP(整数形式,简化区间运算)。
  2. 按起始IP从小到大排序已有的子网。
  3. 遍历排序后的子网,逐个检查相邻子网的间隙,判断间隙是否能容纳目标掩码的子网。
  4. 对符合条件的间隙,拆分出所有可分配的目标掩码子网。

关键PowerShell代码实现

1. IP地址与整数互转函数

function Convert-IPToInt {
    param([string]$IP)
    $octets = $IP.Split('.')
    return [uint32]([uint32]$octets[0] -shl 24) + ([uint32]$octets[1] -shl 16) + ([uint32]$octets[2] -shl 8) + [uint32]$octets[3]
}

function Convert-IntToIP {
    param([uint32]$Int)
    return (([uint32]$Int -shr 24) -band 0xFF).ToString() + "." +
           (([uint32]$Int -shr 16) -band 0xFF).ToString() + "." +
           (([uint32]$Int -shr 8) -band 0xFF).ToString() + "." +
           ([uint32]$Int -band 0xFF).ToString()
}

2. 计算子网的完整占用区间

function Get-SubnetRange {
    param(
        [string]$SubnetCIDR
    )
    $parts = $SubnetCIDR.Split('/')
    $ip = $parts[0]
    $maskLen = [int]$parts[1]
    
    $ipInt = Convert-IPToInt -IP $ip
    $mask = [uint32]0xFFFFFFFF -shl (32 - $maskLen)
    $networkInt = $ipInt -band $mask
    $broadcastInt = $networkInt + ([uint32]0xFFFFFFFF -bxor $mask)
    
    return [PSCustomObject]@{
        NetworkIP = Convert-IntToIP -Int $networkInt
        NetworkInt = $networkInt
        BroadcastInt = $broadcastInt
        MaskLength = $maskLen
    }
}

3. 查找间隙中可分配的目标掩码子网

function Find-UnusedSubnets {
    param(
        [string[]]$ExistingSubnets,
        [int]$TargetMaskLen
    )
    
    # 校验目标掩码范围
    if ($TargetMaskLen -notin 25,26,27,28) {
        Write-Error "目标掩码仅支持/25、/26、/27、/28"
        return
    }
    
    # 处理现有子网并按起始IP排序
    $subnetRanges = $ExistingSubnets | ForEach-Object { Get-SubnetRange -SubnetCIDR $_ } | Sort-Object NetworkInt
    
    $unusedSubnets = @()
    
    # 遍历相邻子网检查间隙
    for ($i = 0; $i -lt $subnetRanges.Count - 1; $i++) {
        $current = $subnetRanges[$i]
        $next = $subnetRanges[$i+1]
        
        # 计算间隙的起始和结束整数IP
        $gapStart = $current.BroadcastInt + 1
        $gapEnd = $next.NetworkInt - 1
        
        if ($gapStart -ge $gapEnd) {
            continue # 无可用间隙
        }
        
        # 目标掩码对应的子网地址间隔(2^(32-掩码长度))
        $subnetStep = [math]::Pow(2, 32 - $TargetMaskLen)
        
        # 找到间隙内第一个符合目标掩码的子网地址
        $firstUnused = [math]::Ceiling($gapStart / $subnetStep) * $subnetStep
        
        # 遍历间隙内所有可分配的子网
        while ($firstUnused + $subnetStep - 1 -le $gapEnd) {
            $unusedSubnets += [PSCustomObject]@{
                UnusedSubnet = "$(Convert-IntToIP -Int $firstUnused)/$TargetMaskLen"
                StartIP = Convert-IntToIP -Int ($firstUnused + 1)
                EndIP = Convert-IntToIP -Int ($firstUnused + $subnetStep - 2)
            }
            $firstUnused += $subnetStep
        }
    }
    
    return $unusedSubnets
}

4. 使用示例

# 模拟存在间隙的现有子网列表
$existingSubnets = @(
    "192.168.1.0/25",
    "192.168.1.128/27",
    "192.168.1.192/26"
)

# 查找间隙中可用的/28子网
Find-UnusedSubnets -ExistingSubnets $existingSubnets -TargetMaskLen 28

代码说明

  • IP与整数互转:把IP转为无符号整数,避开字符串对比的复杂度,直接用数值计算区间。
  • 子网区间计算:通过CIDR规则得出子网的网络地址和广播地址,明确子网的实际占用范围。
  • 间隙检查:遍历排序后的子网,计算相邻子网间的空闲区间,再按目标掩码的子网大小拆分出可分配的子网。
  • 边界处理:自动跳过无间隙的情况,确保只返回有效可分配的子网。

内容的提问来源于stack exchange,提问作者Kolloju_Srinath

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 15:30:49