PowerShell: Сгенерировать список доступных внешних (белых) IP адресов

01 декабрь 2020, Вторник
185
0
+ 0 -
Пришла в голову задачка, без явного практического применения, скорее как разминка для ума, и воссоздание в памяти и практических навыков в стэке используемых технологий. Задача формулируется следующим образом: написать скрипт, который бы сгенерировал все белые IP адреса. С одной стороны все просто, берем 4 цикла и методом перебора генерируем адреса. Да, в целом почти все так, если не смотреть в документацию. А в документации, есть не мало ньюансов на этот счет, про какие-то знал, но забыл, а о каких-то даже не слышал.


Список зарезервированных адресных диапазонов ipv4

Итак, если посмотреть на документацию, то можно увидеть большой список выделенных адресных блоков, которые не могут быть публичными адресами, а имеют специальное предназначение:
 
Блок адресовДиапазон адресовКоличество адресовНазначениеRFCОписание
0.0.0.0/80.0.0.0–0.255.255.25516777216SoftwareRFC 6890Может использоваться только как исходный адрес
10.0.0.0/810.0.0.0–10.255.255.25516777216Private networkRFC 1918Частная сеть
100.64.0.0/10100.64.0.0–100.127.255.2554194304Private networkRFC 6598Сеть сервис провайдера
127.0.0.0/8127.0.0.0–127.255.255.25516777216HostRFC 6890Cсылка на себя (loopback)
169.254.0.0/16169.254.0.0–169.254.255.25565536SubnetRFC 3927Немаршрутизируемая сеть
172.16.0.0/12172.16.0.0–172.31.255.2551048576Private networkRFC 1918Частная сеть
192.0.0.0/24192.0.0.0–192.0.0.255256Private networkRFC 6890для протокола IETF
192.0.2.0/24192.0.2.0–192.0.2.255256DocumentationRFC 5737Для документации и примеров
192.88.99.0/24192.88.99.0–192.88.99.255256InternetRFC 3068сеть трансляции IPv6 в IPv4
192.168.0.0/16192.168.0.0–192.168.255.25565536Private networkRFC 1918Частная сеть
198.18.0.0/15198.18.0.0–198.19.255.255131072Private networkRFC 2544Сеть тестирования между подсетями
198.51.100.0/24198.51.100.0–198.51.100.255256DocumentationRFC 5737Для документации и примеров
203.0.113.0/24203.0.113.0–203.0.113.255256DocumentationRFC 5737Для документации и примеров
224.0.0.0/4224.0.0.0–239.255.255.255268435456InternetRFC 5771Сеть для Многоаресной рассылки (MultiCast)
240.0.0.0/4240.0.0.0–255.255.255.254268435455InternetRFC 1700Зарезервировано
255.255.255.255/32255.255.255.2551SubnetRFC 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 адресов, заняло около 8,5 часов.

Написание, этого скрипта, явилось лишь первым шагом  пришедшей в голову задачке, но позволило освежить знания в области зарезервированных IP диапазонах.



Комментарии:
Прокомментировать
При использовании материалов ссылка на сайт UserMan.ru обязательна.
UserMan.ru © 2017-2021
Мы в Соцсетях: VK