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 адресов, заняло около 8,5 часов.Написание, этого скрипта, явилось лишь первым шагом пришедшей в голову задачке, но позволило освежить знания в области зарезервированных IP диапазонах.
Похожие статьи:
04 декабрь 2020, Пятница
PowerShell: Получить список DNS имен по списку IP адресов (и наоборот)
01 март 2020, Воскресенье
Настройка поведения системы при аварии и создание аварийного дампа памяти
01 июль 2020, Среда
Управление службой времени Windows (W32tm)
01 сентябрь 2018, Суббота
PowerShell: Разрешить список IP адресов в DNS имена
25 декабрь 2017, Понедельник
Рекомендации перед использование VMware vCenter Converter Standalone
Комментарии: