Использование cidrsubnet
требует знакомства с некоторыми концепциями сетевой адресации.
Самая важная идея заключается в том, что IP-адрес (будь то IPv4 или IPv6) в основном построен из двоичных цифр, даже если мы традиционно представляем его как четыре десятичных октета (для IPv4) или последовательность 16-битных шестнадцатеричных чисел ( для IPv6).
Используя приведенный выше пример cidrsubnet("10.1.2.0/24", 4, 15)
, функция сначала преобразует данную строку IP-адреса в эквивалентное двоичное представление:
10 . 1 . 2 . 0
00001010 00000001 00000010 | 00000000
network | host
/24
в конце строки префикса указывает, что первые 24
биты - или первые три октета - адреса идентифицируют сеть
в то время как оставшиеся биты (в данном случае 32 - 24 = 8 бит) идентифицируют хосты
внутри сети.
Инструмент CLI ipcalc
полезен для
визуализация префиксов CIDR в виде двоичных чисел. Мы можем подтвердить конверсию
выше, предоставив ту же строку префикса для ipcalc
:
$ ipcalc 10.1.2.0/24
Address: 10.1.2.0 00001010.00000001.00000010. 00000000
Netmask: 255.255.255.0 = 24 11111111.11111111.11111111. 00000000
Wildcard: 0.0.0.255 00000000.00000000.00000000. 11111111
=>
Network: 10.1.2.0/24 00001010.00000001.00000010. 00000000
HostMin: 10.1.2.1 00001010.00000001.00000010. 00000001
HostMax: 10.1.2.254 00001010.00000001.00000010. 11111110
Broadcast: 10.1.2.255 00001010.00000001.00000010. 11111111
Hosts/Net: 254 Class A, Private Internet
Это дает нам некоторую дополнительную информацию, но также подтверждает (используя слегка
разные обозначения) преобразование из десятичной в двоичную и показывает диапазон
возможных адресов хостов в этой сети.
Хотя cidrhost
позволяет вычислять IP-адреса одного хоста,
cidrsubnet
, с другой стороны, создает новый сетевой префикс в пределах данного
сетевой префикс. Другими словами, он создает подсеть.
Когда мы вызываем cidrsubnet
, мы также передаем два дополнительных аргумента: newbits
и
netnum
. newbits
решает, как долго будет длиться префикс
бит; в нашем примере мы указали 4
, что означает, что
Подсеть будет иметь длину префикса 24 + 4 = 28 бит. Мы можем представить эти
биты разбиваются следующим образом:
10 . 1 . 2 . ? 0
00001010 00000001 00000010 | XXXX | 0000
parent network | netnum | host
Четыре из восьми битов, которые изначально были "номером хоста", сейчас
переназначается как номер подсети. Префикс сети больше не падает на
точная граница октета, так что теперь мы разбиваем последнее десятичное число
в IP-адресе на две части, используя половину его для представления подсети
номер, а другая половина представляет номер хоста.
Затем аргумент netnum
решает, какое числовое значение следует кодировать в эти
четыре новых бита подсети. В нашем текущем примере мы передали 15
, что
представлен в двоичном виде как 1111
, что позволяет заполнить сегмент XXXX
выше:
10 . 1 . 2 . 15 0
00001010 00000001 00000010 | 1111 | 0000
parent network | netnum | host
Чтобы преобразовать это обратно в нормальное десятичное представление, нам нужно рекомбинировать
две части последнего октета. Преобразование 11110000
из двоичного в десятичное
дает 240, который затем может быть объединен с нашим новым длиной префикса от 28 до
выдайте результат 10.1.2.240/28
. Опять же, мы можем передать эту строку префикса
ipcalc
чтобы визуализировать это:
$ ipcalc 10.1.2.240/28
Address: 10.1.2.240 00001010.00000001.00000010.1111 0000
Netmask: 255.255.255.240 = 28 11111111.11111111.11111111.1111 0000
Wildcard: 0.0.0.15 00000000.00000000.00000000.0000 1111
=>
Network: 10.1.2.240/28 00001010.00000001.00000010.1111 0000
HostMin: 10.1.2.241 00001010.00000001.00000010.1111 0001
HostMax: 10.1.2.254 00001010.00000001.00000010.1111 1110
Broadcast: 10.1.2.255 00001010.00000001.00000010.1111 1111
Hosts/Net: 14 Class A, Private Internet
В новой подсети доступно четыре бита для нумерации хостов, что означает
что есть 14 адресов хоста, доступных для назначения, как только мы вычтем
собственный адрес сети и широковещательный адрес. Вы можете таким образом использовать
cidrhost
функция для расчета этих адресов хоста по
при значении от 1 до 14:
> cidrhost("10.1.2.240/28", 1)
10.1.2.241
> cidrhost("10.1.2.240/28", 14)
10.1.2.254
Для получения дополнительной информации о нотации CIDR и подсетях см.
Бесклассовая междоменная маршрутизация .
(я добавил вышеупомянутое в документацию Terraform для cidrsubnet
в PR # 20828 ; это должно быть отражено в основных документах Terraform после следующего выпуска Terraform.)