Public/Test-PrivateIPv4Address.ps1

<#
.SYNOPSIS

  Determines if an IPv4 Address is in a private address space.

.DESCRIPTION

  Determines if an IPv4 Address is in a private address space.

.PARAMETER IPv4Address

  The IPv4 Address

.EXAMPLE

  Test-PrivateIPv4Address -IPv4Address 192.168.1.1

  True

.EXAMPLE

  Test-PrivateIPv4Address -IPv4Address 8.8.8.8

  False

.NOTES

  The function supports RFC 1918 & RFC 6598 address space.

.LINK

  http://www.github.com/roberttoups/IPv4Toolbox

#>

function Test-PrivateIPv4Address {
  [CmdletBinding()]
  [OutputType([Boolean])]
  param (
    [Parameter(
      Mandatory = $true,
      ValueFromPipeline = $true
    )]
    [Alias('IPAddress')]
    [ValidatePattern(
      '^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$'
    )]
    [String]
    $IPv4Address
  )

  begin {}

  process {
    $FirstOctet = $IPv4Address.Split('.')[0]
    if($FirstOctet -ne '192' -and
      $FirstOctet -ne '172' -and
      $FirstOctet -ne '100' -and
      $FirstOctet -ne '10'
    ) {
      Write-Verbose -Message 'IPv4 Address is not in a private address space'
      $false
    } else {
      $PrivateAddressCollection = DATA {
        # RFC 1918
        @{
          # 10.0.0.0/8
          FirstIPv4Address = '10.0.0.0'
          LastIPv4Address  = '10.255.255.255'
        }
        @{
          # 172.16.0.0/12
          FirstIPv4Address = '172.16.0.0'
          LastIPv4Address  = '172.31.255.255'
        }
        @{
          # 192.168.0.0/16
          FirstIPv4Address = '192.168.0.0'
          LastIPv4Address  = '192.168.255.255'
        }
        # RFC 6598
        @{
          # 100.64.0.0/10
          FirstIPv4Address = '100.64.0.0'
          LastIPv4Address  = '100.127.255.255'
        }
      }
      $Found = $false
      foreach($PrivateAddress in $PrivateAddressCollection) {
        Write-Verbose -Message "Checking if $IPv4Address is between $($PrivateAddress.FirstIPv4Address) and $($PrivateAddress.LastIPv4Address)"
        if($PrivateAddress.FirstIPv4Address.Split('.')[0] -ne $FirstOctet) {
          continue
        }
        $ArgumentCollection = @{
          FirstIPv4Address = $PrivateAddress.FirstIPv4Address
          LastIPv4Address  = $PrivateAddress.LastIPv4Address
          TestIPv4Address  = $IPv4Address
        }
        $Result = Test-IPv4AddressWithinRange @ArgumentCollection
        if($Result) {
          Write-Verbose -Message 'IPv4 Address is in a private address space'
          $Found = $true
          break
        }
      }
      $Found
    }
  }

  end {}
}