PowerShell: Сгенерировать список доступных внешних (белых) IP адресов
        
        
		Пришла в голову задачка, без явного практического применения, скорее как разминка для ума, и воссоздание в памяти и практических навыков в стэке используемых технологий. Задача формулируется следующим образом: написать скрипт, который бы сгенерировал все белые IP адреса. С одной стороны все просто, берем 4 цикла и методом перебора генерируем адреса. Да, в целом почти все так, если не смотреть в документацию. А в документации, есть не мало ньюансов на этот счет, про какие-то знал, но забыл, а о каких-то даже не слышал.
 
 
В итоге, получается, что из общего пула всех возможных IPv4 адресов (256^4=4294967296), 592708864 IPv4 адресов относятся к зарезервированным блокам, остается всего 3702258432 IPv4 адресов, которые различные компании и провайдеры могут использовать по своему усмотрению.
С учетом всех ограничений из RFC, скрипт для генерации всех белых ip адресов, может выглядеть следующим образом:
Написание, этого скрипта, явилось лишь первым шагом пришедшей в голову задачке, но позволило освежить знания в области зарезервированных IP диапазонах.
	 
    
	
	
	
    Список зарезервированных адресных диапазонов ipv4
Итак, если посмотреть на документацию, то можно увидеть большой список выделенных адресных блоков, которые не могут быть публичными адресами, а имеют специальное предназначение:| Блок адресов | Диапазон адресов | Количество адресов | Назначение | RFC | Описание | 
| 0.0.0.0/8 | 0.0.0.0–0.255.255.255 | 16777216 | Software | RFC 6890 | Может использоваться только как исходный адрес | 
| 10.0.0.0/8 | 10.0.0.0–10.255.255.255 | 16777216 | Private network | RFC 1918 | Частная сеть | 
| 100.64.0.0/10 | 100.64.0.0–100.127.255.255 | 4194304 | Private network | RFC 6598 | Сеть сервис провайдера | 
| 127.0.0.0/8 | 127.0.0.0–127.255.255.255 | 16777216 | Host | RFC 6890 | Cсылка на себя (loopback) | 
| 169.254.0.0/16 | 169.254.0.0–169.254.255.255 | 65536 | Subnet | RFC 3927 | Немаршрутизируемая сеть | 
| 172.16.0.0/12 | 172.16.0.0–172.31.255.255 | 1048576 | Private network | RFC 1918 | Частная сеть | 
| 192.0.0.0/24 | 192.0.0.0–192.0.0.255 | 256 | Private network | RFC 6890 | для протокола IETF | 
| 192.0.2.0/24 | 192.0.2.0–192.0.2.255 | 256 | Documentation | RFC 5737 | Для документации и примеров | 
| 192.88.99.0/24 | 192.88.99.0–192.88.99.255 | 256 | Internet | RFC 3068 | сеть трансляции IPv6 в IPv4 | 
| 192.168.0.0/16 | 192.168.0.0–192.168.255.255 | 65536 | Private network | RFC 1918 | Частная сеть | 
| 198.18.0.0/15 | 198.18.0.0–198.19.255.255 | 131072 | Private network | RFC 2544 | Сеть тестирования между подсетями | 
| 198.51.100.0/24 | 198.51.100.0–198.51.100.255 | 256 | Documentation | RFC 5737 | Для документации и примеров | 
| 203.0.113.0/24 | 203.0.113.0–203.0.113.255 | 256 | Documentation | RFC 5737 | Для документации и примеров | 
| 224.0.0.0/4 | 224.0.0.0–239.255.255.255 | 268435456 | Internet | RFC 5771 | Сеть для Многоаресной рассылки (MultiCast) | 
| 240.0.0.0/4 | 240.0.0.0–255.255.255.254 | 268435455 | Internet | RFC 1700 | Зарезервировано | 
| 255.255.255.255/32 | 255.255.255.255 | 1 | Subnet | RFC 919 | Широковещательная рассылка (Broadcast) | 
В итоге, получается, что из общего пула всех возможных IPv4 адресов (256^4=4294967296), 592708864 IPv4 адресов относятся к зарезервированным блокам, остается всего 3702258432 IPv4 адресов, которые различные компании и провайдеры могут использовать по своему усмотрению.
| Количество адресов | |
| Всего адресов | 4294967296 | 
| Исключаемые из внешних | 592708864 | 
| Остается адресов | 3702258432 | 
С учетом всех ограничений из RFC, скрипт для генерации всех белых ip адресов, может выглядеть следующим образом:
$StartIP=0 # С какого адреса начинать
$MaxIP=255 # Максимальное число в октете в IP адреса
$cnt=0 # Счетчик IP адресов
for ($a=$StartIP; $a -le $MaxIP; $a++) { 
    if (!(
        ($a -eq 0) -or #! 0.0.0.0/8  Current network (only valid as source address)  RFC 6890
        ($a -eq 10) -or #! 10.0.0.0/8 Private network RFC 1918
        ($a -eq 127) -or #! 127.0.0.0/8    Loopback    RFC 6890
        ($a -ge 224)
                    #! 224.0.0.0/4    IP multicast (former Class D network)   RFC 5771
                    #! 240.0.0.0/4    Reserved (former Class E network)   RFC 1700
                    #! 255.255.255.255    Broadcast   RFC 919
       )) 
    {
        for ($b=0; $b -le $MaxIP; $b++) {
            if (!(
                ((($a -eq 100) -and ($b -ge 64)) -and (($a -eq 100) -and ($b -le 127))) -or    #! 100.64.0.0/10  Shared Address Space    RFC 6598
                (($a -eq 169) -and ($b -eq 254)) -or                                          #! 169.254.0.0/16 Link-local  RFC 3927
                ((($a -eq 172) -and ($b -ge 16)) -and (($a -eq 172) -and  ($b -le 31))) -or     #! 172.16.0.0/12  Private network RFC 1918
                (($a -eq 192) -and ($b -eq 168)) -or                                          #! 192.168.0.0/16 Private network RFC 1918
                ((($a -eq 198) -and ($b -ge 18)) -and (($a -eq 198) -and ($b -le 19)))          #! 198.18.0.0/15  Network benchmark tests RFC 2544
               )) 
             {
                for ($c=0; $c -le $MaxIP; $c++) {
                    if  (!(
                           (($a -eq 192) -and ($b -eq 0) -and ($c -eq 0)) -or #! 192.0.0.0/24   IETF Protocol Assignments   RFC 6890
                           (($a -eq 192) -and ($b -eq 0) -and ($c -eq 2)) -or #! 192.0.2.0/24   TEST-eqT-1, documentation and examples  RFC 5737
                           (($a -eq 192) -and ($b -eq 88) -and ($c -eq 99)) -or #! 192.88.99.0/24 IPv6 to IPv4 relay (includes 2002::/16) RFC 3068
                           (($a -eq 198) -and ($b -eq 51) -and ($c -eq 100)) -or # 198.51.100.0/24    TEST-eqT-2, documentation and examples  RFC 5737
                           (($a -eq 203) -and ($b -eq 0) -and ($c -eq 113)) # 203.0.113.0/24 TEST-eqT-3, documentation and examples  RFC 5737
                        ))
                    {
 
                            for ($d=0; $d -le $MaxIP; $d++) {
             
                                $ip = $a.ToString() + "." + $b.ToString() + "." + $c.ToString() + "." + $d.ToString()
                                $ip
                               $cnt++
                            }
                        }
                    }
            }
        }
    }
}
Write-host "всего адресов: " $cntНаписание, этого скрипта, явилось лишь первым шагом пришедшей в голову задачке, но позволило освежить знания в области зарезервированных IP диапазонах.
Похожие статьи:
			04 декабрь 2020, Пятница
	PowerShell: Получить список DNS имен по списку IP адресов (и наоборот)
01 март 2020, Воскресенье
	Настройка поведения системы при аварии и создание аварийного дампа памяти
01 июль 2020, Среда
	Управление службой времени Windows (W32tm)
01 сентябрь 2018, Суббота
	PowerShell: Разрешить список IP адресов в DNS имена
25 декабрь 2017, Понедельник
	Рекомендации перед использование VMware vCenter Converter Standalone
Комментарии: