Skip to content
Назад к блогу
Руководства

Расчёт маски подсети: таблица CIDR от /8 до /32

У /26 доступны 62 адреса, а не 64, а на /31 правило «минус два» не работает. Читайте любой префикс CIDR, считайте маску вручную и проверяйте онлайн бесплатно.

15 мин чтения

Нотация CIDR и маски подсети: как читать префиксы от /8 до /32

Число после слэша в 192.168.1.0/24 считает биты, а не адреса. Оно говорит, сколько из 32 битов адреса IPv4 принадлежит сети; всё остальное достаётся узлам.

У /24 остаётся 8 битов на узлы, поэтому блок вмещает 2⁸ = 256 адресов. У /26 остаётся 6 — значит, 64. Каждый бит, отданный обратно узлам, удваивает блок; каждый бит, забранный у них, удваивает число блоков. Адресов, которые реально можно раздать устройствам, обычно на два меньше общего количества: первый занят самой сетью, последний — широковещательный. Поэтому /26 даёт 62 доступных узла, а не 64.

Два префикса нарушают правило «минус два» намеренно. А обратная маска (wildcard) — это не маска подсети, хотя их постоянно вставляют в поля друг друга. Готовый ответ для одного блока напечатает калькулятор подсетей; считать вручную стоит уметь всё равно.

Что на самом деле сообщает нотация CIDR

Маска подсети — это тоже 32-битное число, записанное так же, как записывают адрес. Её биты — это череда единиц, за которой идёт череда нулей. Единицы отмечают биты сети, нули — биты узла. Распишите /26 полностью, и получится:

11111111.11111111.11111111.11000000
    255  .   255  .   255  .   192

Переведите каждый октет обратно в десятичную систему — получится 255.255.255.192. Нотация CIDR считает ведущие единицы вместо того, чтобы выписывать все тридцать две. 192.168.1.0/26 и 192.168.1.0 255.255.255.192 — одно и то же утверждение в двух синтаксисах, а какой из них нужен устройству, зависит только от команды, которую вы набираете.

/8, /16 и /24 попадают на границы октетов, поэтому в десятичной записи выглядят аккуратно: 255.0.0.0, 255.255.0.0, 255.255.255.0. Ничего обязательного в этом нет. /22 и /27 столь же законны. Они режут октет посередине и дают маски вроде 255.255.252.0, которые выглядят произвольными ровно до того момента, как вы запишете их в двоичном виде.

Почему исчезли классы. До 1993 года размер адреса определяли его старшие биты: класс A занимал /8, класс B — /16, класс C — /24, и между ними не было ничего. Организации с 300 узлами приходилось забирать класс B и разбазаривать больше 65000 адресов — или брать два блока класса C и тащить два маршрута. CIDR (RFC 1519, позже пересмотренный как RFC 4632) разорвал эту связку. Префикс путешествует вместе с адресом, поэтому блок может быть любой степенью двойки. Классы до сих пор попадаются в сертификационных экзаменах и в старой документации, но классовая маршрутизация ушла вместе с этой реформой: границу сети задаёт маска, а не первый октет.

Шпаргалка по маскам подсети, от /8 до /32

Последняя колонка здесь не для симметрии: она показывает, что выдаёт универсальная формула 2ⁿ − 2. С реальным числом доступных узлов это совпадает везде, кроме двух последних строк.

ПрефиксМаска подсетиОбратная маскаВсего адресовДоступно узловНаивная 2ⁿ − 2 даёт
/8255.0.0.00.255.255.255167772161677721416777214
/9255.128.0.00.127.255.255838860883886068388606
/10255.192.0.00.63.255.255419430441943024194302
/11255.224.0.00.31.255.255209715220971502097150
/12255.240.0.00.15.255.255104857610485741048574
/13255.248.0.00.7.255.255524288524286524286
/14255.252.0.00.3.255.255262144262142262142
/15255.254.0.00.1.255.255131072131070131070
/16255.255.0.00.0.255.255655366553465534
/17255.255.128.00.0.127.255327683276632766
/18255.255.192.00.0.63.255163841638216382
/19255.255.224.00.0.31.255819281908190
/20255.255.240.00.0.15.255409640944094
/21255.255.248.00.0.7.255204820462046
/22255.255.252.00.0.3.255102410221022
/23255.255.254.00.0.1.255512510510
/24255.255.255.00.0.0.255256254254
/25255.255.255.1280.0.0.127128126126
/26255.255.255.1920.0.0.63646262
/27255.255.255.2240.0.0.31323030
/28255.255.255.2400.0.0.15161414
/29255.255.255.2480.0.0.7866
/30255.255.255.2520.0.0.3422
/31255.255.255.2540.0.0.1220
/32255.255.255.2550.0.0.011−1

В таблице важнее соотношения, чем сами числа. Каждая следующая строка делит блок пополам: /24 вмещает 256 адресов, /25 — 128, /26 — 64. Колонка обратной маски — это маска подсети с инвертированными битами, поэтому 255.255.255.192 и 0.0.0.63 всегда стоят в одной строке. А две строки, выделенные жирным, — это места, где стандартная формула перестаёт описывать реальность.

Запоминать нужно только значения последнего октета в колонке маски, потому что они повторяются: 128, 192, 224, 240, 248, 252, 254, 255. Это единственные восемь нетривиальных байтовых значений, которыми может заканчиваться корректная маска. Если не верите на слово, переведите любое из них в двоичный вид в конвертере систем счисления.

Читаем таблицу в обратную сторону: от маски подсети к CIDR

Имея маску в точечно-десятичной записи, посчитайте единичные биты. Каждый октет 255 добавляет 8, а единственный интересный октет добавляет остаток:

Последний октет маски128192224240248252254255
Сколько битов добавляет12345678

Значит, 255.255.255.192 — это 8 + 8 + 8 + 2 = /26. А 255.255.252.0 — это 8 + 8 + 6 + 0 = /22, потому что 252 в двоичном виде — 11111100.

Любой октет, не равный ни 255, ни 0, — граничный, и в корректной маске он может быть только один. Его значение сразу даёт размер блока, на котором держится весь ручной счёт.

Как посчитать маску подсети и сеть вручную

Механический способ состоит из трёх шагов и работает для любого префикса. Ниже разберём его на 192.168.1.130/26; сам адрес произвольный, важна процедура.

Шаг 1 — найдите размер блока

Размер блока — это 256 − граничный октет маски.

Для /26 маска равна 255.255.255.192, значит размер блока — 256 − 192 = 64. Подсети такого размера начинаются на кратных 64 значениях в четвёртом октете: 0, 64, 128, 192. Других возможных стартовых точек нет.

Размер блока и количество адресов в нём — одно и то же число. Разница только в том, откуда его взяли: из маски или из числа битов узла.

Шаг 2 — определите, в какой блок попадает адрес

Разделите граничный октет адреса на размер блока и округлите вниз.

Адрес — 192.168.1.130, размер блока — 64, поэтому 130 ÷ 64 = 2.03…, что округляется вниз до 2. Умножаем обратно: 2 × 64 = 128. Адрес лежит в блоке, начинающемся со 128.

Большинство ошибок случается именно здесь и почти всегда в одну сторону: выданный адрес считают началом его блока, а он им обычно не является. 192.168.1.130 — это адрес узла, живущий в третьей подсети /26 внутри того /24.

Шаг 3 — сеть, широковещательный адрес, первый и последний узел

Начало блока — это адрес сети. Широковещательный адрес — начало блока плюс размер блока минус один. Всё, что строго между ними, можно раздавать:

Network    192.168.1.128
Broadcast  192.168.1.191
Usable     192.168.1.129 - 192.168.1.190
Usable     62 (of 64 total)
Netmask    255.255.255.192
Wildcard   0.0.0.63

Широковещательный адрес — 128 + 64 − 1 = 191. Первый узел — это сеть + 1, последний — широковещательный − 1, а число доступных адресов — 64 − 2 = 62, что совпадает со строкой /26 в шпаргалке.

Проговорить про себя это можно так: размер блока — это 256 минус октет маски; округлите адрес вниз до кратного ему значения — это ваша сеть, а начало следующего блока минус один — ваш широковещательный адрес.

Метод не привязан к четвёртому октету. Для /22 маска равна 255.255.252.0, значит граничным становится третий октет, а размер блока там — 256 − 252 = 4. Поэтому блоки начинаются с 10.0.0.0, 10.0.4.0, 10.0.8.0, а блок 10.0.0.0/22 тянется до широковещательного 10.0.3.255 с доступными адресами от 10.0.0.1 до 10.0.3.254 — четыре подряд идущих /24 внутри одного широковещательного домена. Те же три шага, другой октет.

Если вас притормаживает именно перевод между двоичной и десятичной системами, отдельное руководство по системам счисления разбирает конвертацию по шагам.

Проверять себя удобно и в скрипте — стандартная библиотека Python всё это уже умеет:

import ipaddress

net = ipaddress.ip_network("192.168.1.130/26", strict=False)

print(net)                     # 192.168.1.128/26
print(net.network_address)     # 192.168.1.128
print(net.broadcast_address)   # 192.168.1.191
print(net.netmask)             # 255.255.255.192
print(net.hostmask)            # 0.0.0.63
print(net.num_addresses)       # 64
print(len(list(net.hosts())))  # 62

strict=False здесь и позволяет передать адрес узла вместо адреса сети; при значении по умолчанию strict=True тот же вызов выбрасывает ValueError.

Где правило «минус два» перестаёт работать

У вычитания есть причина. В обычной подсети комбинация из одних нулей в битах узла называет саму сеть, а комбинация из одних единиц — направленный широковещательный адрес. Ни тот ни другой нельзя назначить интерфейсу, поэтому блок из 2ⁿ адресов отдаёт узлам 2ⁿ − 2. Именно поэтому /24 даёт 254, а /26 — 62.

Она же очерчивает границу: когда блок слишком мал, чтобы вместить эти два зарезервированных адреса, вычитать становится нечего.

У /31 два адреса и два доступных узла. RFC 3021 определяет /31 для двухточечных (point-to-point) линков. У такого линка ровно две конечные точки и нет общего сегмента, поэтому широковещательному адресу нечего делать, а адресу сети нечего идентифицировать. Оба адреса уходят двум концам. Формула 2ⁿ − 2 вернёт здесь 0, потому что арифметика отвечает на вопрос о топологии, к которой не относится. Оговорка при этом настоящая: /31 допустим только на действительно двухточечных интерфейсах. Многоабонентскому сегменту LAN по-прежнему нужен /30 или короче, а Windows не примет /31 на сетевой карте.

У /32 один адрес и один доступный узел. Это маршрут до одного узла — интерфейсы loopback, статические маршруты, anycast-адреса, правила межсетевого экрана на один адрес. Широковещательного адреса нет, поэтому − 2 из формулы вернуло бы −1.

Python согласен с обоими случаями:

import ipaddress

p2p = ipaddress.ip_network("203.0.113.4/31")
print([str(h) for h in p2p.hosts()])  # ['203.0.113.4', '203.0.113.5']

host = ipaddress.ip_network("10.0.0.1/32")
print([str(h) for h in host.hosts()])  # ['10.0.0.1']

Запоминать это как «два исключения» бесполезно. Вычитание убирает два конкретных адреса, и перед вычитанием стоит убедиться, что они вообще есть. У /31 и /32 широковещательного адреса нет, поэтому убирать нечего.

Всего адресов, доступно узлов и число подсетей — это три разных числа

Их путают постоянно, и путаница объяснима: все три — степени двойки, выведенные из одного и того же префикса.

  • Всего адресов в /p — это 2^(32 − p). Для /26: 64.
  • Доступно узлов — это же число минус 2, кроме /31 и /32. Для /26: 62.
  • Число подсетей, которое получается при делении родительского /p на дочерние /q, — это 2^(q − p). Деление /24 на /26 занимает два бита, значит 2² = 4 подсети.

Эти три величины отвечают на разные вопросы, поэтому фраза «/26 даёт четыре» верна, только если вопрос был про деление /24. Деление к тому же стоит адресов: каждая дочерняя подсеть резервирует собственную пару из адреса сети и широковещательного. Четыре /26, вырезанные из /24, вмещают 4 × 62 = 248 доступных адресов против 254 у родителя — шесть адресов ушли на само деление.

Обратная маска и маска подсети: какой команде что нужно

Обратная маска — это побитовая инверсия маски подсети. Где у маски подсети единицы, там у обратной нули. Возьмите строку /26 из шпаргалки: маска 255.255.255.192, обратная маска 0.0.0.63. Инвертируйте каждый бит одной — получите другую.

А используют их в противоположных смыслах. Маска подсети применяется побитовым AND, поэтому бит 1 означает «этот бит относится к сети». Обратная маска — это фильтр совпадения, поэтому бит 0 означает «этот бит должен совпасть», а бит 1 — «неважно». Операция под капотом та же, полярность обратная. Если механика на уровне битов подзабылась, руководство по побитовым операциям разбирает AND, OR и NOT в более общем виде.

Что именно нужно устройству — вопрос не вкуса. Для блока 192.168.1.128/26:

! wants the subnet mask
ip address 192.168.1.129 255.255.255.192

! wants the wildcard mask
access-list 10 permit 192.168.1.128 0.0.0.63
network 192.168.1.128 0.0.0.63 area 0
! Cisco ASA — wants the subnet mask, unlike IOS ACLs
access-list OUT permit ip 192.168.1.128 255.255.255.192 any
# Linux iproute2 — takes the prefix directly
ip addr add 192.168.1.129/26 dev eth0

ACL в Cisco IOS и network-инструкции OSPF принимают обратную маску, а ASA вместо неё — маску подсети. Это один вендор с двумя соглашениями внутри одного семейства продуктов, и именно поэтому здесь чаще всего ошибаются при копировании. У других платформ свои соглашения, так что прежде чем вставлять значение в незнакомое поле, уточните, какое из двух это поле ожидает.

Опасным всё это делает форма отказа. Вставьте 255.255.255.192 в ACL на IOS — и маршрутизатор прочитает значение как обратную маску: три октета из одних единиц означают «неважно», поэтому первые три октета вообще перестают проверяться, и правило дотягивается далеко за пределы задуманного блока. Ни синтаксической ошибки, ни строчки в логе — просто permit с неверной областью действия. Обратную ошибку хотя бы есть шанс поймать, потому что 0.0.0.63 — некорректная маска подсети: у неё нет ведущей череды единиц. Отвергнет ли её конкретная платформа или молча примет — не то, что стоит выяснять в продакшене.

Почему в обратных масках ACL допустимы дыры, а в масках подсети нет

Маска подсети обязана быть одной непрерывной чередой единиц, за которой идут нули. Это не стилистическое соглашение: именно непрерывность заставляет операцию AND делить адрес ровно на две части. Значение вроде 255.0.255.0 содержит дыру, не описывает никакой внятной границы, и устройства его отвергают. Python тоже:

import ipaddress
ipaddress.ip_network("10.0.0.0/255.0.255.0")
# ValueError: '10.0.0.0/255.0.255.0' does not appear to be an IPv4 or IPv6 network

Корректных масок всего 33 — от /0 до /32. Всё остальное — опечатка.

На обратные маски ACL такого ограничения нет, потому что они не делят адрес на сетевую и узловую части. Это побитовый фильтр совпадения, поэтому дыры законны и иногда полезны: одна обратная маска с дырой может совпасть, например, со всеми нечётными адресами диапазона. Разница в выразительности и есть причина, по которой два значения нельзя менять местами: это объекты разной природы, просто в точечно-десятичной записи они выглядят похоже.

Приватные диапазоны, CGNAT и другие зарезервированные блоки

Префикс говорит, насколько блок велик. А номер блока говорит, ваш ли он вообще.

БлокДиапазонКем зарезервирован
10.0.0.0/810.0.0.0 – 10.255.255.255приватный, RFC 1918
172.16.0.0/12172.16.0.0 – 172.31.255.255приватный, RFC 1918
192.168.0.0/16192.168.0.0 – 192.168.255.255приватный, RFC 1918
100.64.0.0/10100.64.0.0 – 100.127.255.255carrier-grade NAT, RFC 6598
169.254.0.0/16169.254.0.0 – 169.254.255.255link-local, RFC 3927
255.255.255.255/32один адресограниченный широковещательный

Диапазоны RFC 1918 никогда не маршрутизируются в публичном интернете — именно это делает их безопасными для внутреннего распределения. Остальные попали в таблицу по другим причинам.

100.64.0.0/10 — это пространство carrier-grade NAT. Если провайдер выдал вам адрес из него, вы находитесь за его NAT, и без туннеля до вас не дойдёт ни одно входящее соединение. Это не приватное пространство в смысле RFC 1918, и брать его во внутренний план нельзя: провайдер, возможно, уже использует его по другую сторону вашего маршрутизатора.

169.254.0.0/16 — это link-local. Узел назначает себе такой адрес, когда DHCP не отвечает, поэтому адрес 169.254 на интерфейсе — это диагноз, а не конфигурация: на запрос DHCP никто не ответил. Трафик к нему никогда не проходит через маршрутизатор.

Для примеров в документации и эксплуатационных инструкциях RFC 5737 резервирует 192.0.2.0/24, 198.51.100.0/24 и 203.0.113.0/24 — именно затем, чтобы скопированный пример не мог указать на реальный узел.

172.16.0.0/12 — это шестнадцать /16, а не один

Именно на этом зарезервированном диапазоне ошибаются чаще всего, и виноват префикс. /12 забирает четыре бита у второго октета, поэтому блок тянется от 172.16.0.0 до 172.31.255.255 — шестнадцать подряд идущих /16, а не просто 172.16.x.x.

Последствия идут в обе стороны. Адрес вроде 172.20.5.1 приватный и спокойно лежит внутри диапазона, хотя и не начинается со 172.16. А 172.15.x.x и 172.32.x.x — публичные адреса, принадлежащие кому-то другому, поэтому правило межсетевого экрана или проверка «доверяем внутреннему диапазону», написанные против 172.0.0.0/8, тихо доверяют изрядному куску интернета.

Если такую границу нужно подтвердить, шпаргалка даёт арифметику: у /12 2^(32−12) адресов, второй октет движется шагом 256 − 240 = 16, а 16 + 16 = 32, значит блок заканчивается непосредственно перед 172.32.0.0.

VLSM: деление одного блока на неравные подсети

Подсети одинакового размера делать легко и обычно неправильно. Филиалу, которому выдали один 192.168.1.0/24, может понадобиться четыре сегмента совершенно разной ёмкости: сотня рабочих станций, полсотни телефонов, десяток серверов и горстка интерфейсов управления. Разделите /24 на четыре равных /26 — и сегмент рабочих станций переполнится на 62 узлах, пока сегмент управления будет сидеть на 62 адресах ради десяти устройств.

Variable Length Subnet Masking (VLSM) означает, что каждому сегменту достаётся тот префикс, который ему действительно нужен. Тот же /24 можно нарезать на один /25, один /26 и два /28.

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

СегментНужно узловПрефиксСетьДиапазон доступныхШироковещательныйМаска подсети
Рабочие станции100/25192.168.1.0192.168.1.1 – 192.168.1.126192.168.1.127255.255.255.128
Телефония50/26192.168.1.128192.168.1.129 – 192.168.1.190192.168.1.191255.255.255.192
Серверы12/28192.168.1.192192.168.1.193 – 192.168.1.206192.168.1.207255.255.255.240
Управление10/28192.168.1.208192.168.1.209 – 192.168.1.222192.168.1.223255.255.255.240
не распределено/27192.168.1.224192.168.1.225 – 192.168.1.254192.168.1.255255.255.255.224

Пройдём по этому тем же трёхшаговым методом:

  1. У /25 размер блока 256 − 128 = 128, поэтому он начинается с 0, а его широковещательный — 0 + 128 − 1 = 127. Доступны адреса с 1 по 126, то есть 126 штук — хватает на 100 рабочих станций с запасом. Строка /25 в шпаргалке подтверждает: 128 всего, 126 доступно.
  2. Следующий свободный адрес — 128. У /26 размер блока 64, а 128 кратно 64, поэтому он помещается: сеть 192.168.1.128, широковещательный 128 + 64 − 1 = 191, доступны с 129 по 190. Это 62 доступных адреса на 50 телефонов. Строка /26 в шпаргалке: 64 всего, 62 доступно.
  3. Следующий свободный — 192. У /28 размер блока 16, а 192 = 16 × 12, поэтому он помещается: сеть 192.168.1.192, широковещательный 207, доступны с 193 по 206 — 14 адресов на 12 серверов. Строка /28 в шпаргалке: 16 всего, 14 доступно.
  4. Следующий свободный — 208, и 208 = 16 × 13, поэтому второй /28 встаёт на 192.168.1.208 с широковещательным 223 и доступными с 209 по 222.

На это ушло 128 + 64 + 16 + 16 = 224 из 256 адресов, и осталось с 192.168.1.224 по 192.168.1.255. Эти 32 адреса оказываются ровно одним выровненным /27 — оттуда потом и возьмутся двухточечные линки: внутрь помещается шестнадцать /31, по одному на каждый линк между маршрутизаторами.

Обратный порядок обходится дороже. Допустим, вы поставили два /28 в самое начало: 192.168.1.0/28 и 192.168.1.16/28. Следующий свободный адрес — 192.168.1.32, а /25 обязан начинаться на кратном 128, поэтому начаться там он не может. Ему приходится перепрыгнуть на 192.168.1.128. Адреса с 32 по 127 не потеряны, но пригодны только как более мелкие выровненные куски — /27 на 192.168.1.32 и /26 на 192.168.1.64, — так что остаток оказывается разбросан, а не лежит одним непрерывным блоком в конце. Добавьте к заявке ещё один сегмент — и тот же манёвр перестанет помещаться вовсе.

Сортировка по размеру от этого избавляет. Когда блок размещён, следующий свободный адрес кратен размеру этого блока, а кратное большей степени двойки автоматически кратно и каждой меньшей — поэтому любой следующий, меньший блок выровнен там, где закончился предыдущий. Перепрыгивать не приходится никогда. Проверять выравнивание каждого сегмента вручную долго, поэтому таблица деления в калькуляторе подсетей пригодится до того, как план уедет в коммутатор.

Пять ошибок, которые доживают до продакшена

1. Считать введённый адрес адресом сети

Симптом: правило межсетевого экрана ни с чем не совпадает или маршрут покрывает не ту половину сегмента. Причина: 192.168.1.130/26 прочитали как сеть 192.168.1.0 с широковещательным 192.168.1.255 — это граница /24, потому что именно её видно в десятичной записи. Решение: примените шаг 2. Размер блока 64, 130 ÷ 64 округляется вниз до 2, значит сеть — 2 × 64 = 128. Блок идёт с 192.168.1.128 по 192.168.1.191, а 192.168.1.0 — совершенно другая подсеть. Всякий раз, когда префикс длиннее /24, считайте выданный адрес адресом узла, пока не наложили маску.

2. Применять 2ⁿ − 2 к /31

Симптом: система IPAM или таблица показывает 0 доступных узлов для двухточечного линка, который поднят и пропускает трафик. Причина: правило «минус два» предполагает, что есть адрес сети и широковещательный адрес, которые можно вычесть. У /31 их нет. Решение: относитесь к /31 и /32 как к граничным условиям формулы, а не как к аномалиям. RFC 3021 делает назначаемыми оба адреса /31, а /32 — это маршрут до одного узла с одним адресом. Всё, что показывает 0 или −1, применило формулу вне её области определения. Сначала проверьте поддержку /31 на конкретном интерфейсе, потому что исключение работает только на действительно двухточечных линках.

3. Считать 172.16.0.0/12 только 172.16.x.x

Симптом: внутренний сервис недоступен из одного офиса или правило «блокировать все приватные диапазоны» протекает. Причина: /12 прочитали так, будто это /16. Решение: диапазон — с 172.16.0.0 по 172.31.255.255. Пишите ACL и списки разрешений против префикса 172.16.0.0/12, а не против шаблона октета, и помните, что 172.15.x.x и 172.32.x.x лежат за его пределами, в публичном интернете. Если проверяете вручную, граничный октет здесь второй и шагает по 16.

4. Вставлять обратную маску в поле, которому нужна маска подсети

Симптом: ACL разрешает гораздо больше или гораздо меньше задуманного, и в конфигурации ничто не выглядит подозрительно. Причина: ACL на IOS и network-инструкции OSPF принимают обратную маску, а ASA — маску подсети, при этом 0.0.0.63 и 255.255.255.192 на беглый взгляд взаимозаменяемы. Решение: проверяйте поле до вставки, а не после. Полезная примета: для любого префикса /8 и длиннее маска подсети начинается с 255, а обратная маска — с 0. Если значение в ACL или в network-инструкции OSPF начинается с 255, это маска подсети в поле обратной маски.

5. Написать несплошную маску или сгенерировать её случайно

Симптом: устройство отвергает строку конфигурации, или самописный скрипт выдаёт маски, которые выглядят правдоподобно и при этом неверны. Причина: значение вроде 255.0.255.0 не является корректной маской подсети — в нём дыра. Скриптовая версия тоньше: в JavaScript операторы сдвига берут правый операнд по модулю 32, поэтому префикс вне допустимого диапазона молча даёт правдоподобную неверную маску (33 превращается в /1, −1 — в /31) вместо того, чтобы выбросить исключение. Решение: проверяйте диапазон префикса до сдвига и отвергайте любую маску, которая не является сплошной чередой единиц с нулями следом. Библиотека, которая падает на плохом вводе, здесь ценнее той, что молча угадывает.

Часто задаваемые вопросы

Чем подсеть отличается от VLAN?

VLAN — это широковещательный домен второго уровня, настраиваемый на коммутаторах; подсеть — это диапазон адресов третьего уровня. Обычно их сопоставляют один к одному, но ничто этого не требует: на одном VLAN можно держать две подсети, а один VLAN — растянуть транком между площадками. Перенумеруйте подсеть — идентификатор VLAN от этого не изменится.

Сколько подсетей получится, если разделить /24 на /26?

Четыре. Количество — это двойка в степени числа занятых битов, а /26 длиннее /24 на два бита, значит 2² = 4 подсети по 64 адреса. Каждая дочерняя резервирует собственный адрес сети и широковещательный, поэтому четыре /26 вмещают 248 доступных адресов против 254 у родительского /24.

Работает ли нотация CIDR в IPv6 так же?

Слэш по-прежнему считает ведущие биты сети, поэтому /64 означает 64 бита сети из 128. Не переносится правило «минус два»: в IPv6 нет широковещательного адреса, поэтому из общего количества ничего не вычитается. Шпаргалка выше и стоящий за ней калькулятор — только для IPv4.

Что означает 0.0.0.0/0?

Ноль битов сети, поэтому запись совпадает с любым адресом IPv4. В таблице маршрутизации это маршрут по умолчанию, который используется, когда не подошёл ни один более специфичный префикс. Как адрес привязки он означает «все интерфейсы» — поэтому служба, слушающая 0.0.0.0, доступна из каждой сети, к которой подключена машина.

Что будет, если две подсети в одной сети перекроются?

Маршрутизаторы выберут более специфичный маршрут, поскольку при пересылке всегда выигрывает самый длинный совпавший префикс, а узлы внутри перекрытия разойдутся во мнениях о том, какие адресаты локальны. Симптом получается частичным: часть адресатов работает, часть нет, причём состав меняется в зависимости от того, откуда проверять.

Почему адреса классов A, B и C заменили на CIDR?

Потому что классы предлагали всего три размера: /8, /16 и /24. Организации, которой нужны 300 адресов, приходилось брать класс B и разбазаривать большую его часть — или держать два маршрута класса C. CIDR разрешил префиксу быть любой длины, что замедлило исчерпание адресов и позволило провайдерам сворачивать множество клиентских блоков в один маршрут.

Можно ли делить приватный диапазон вроде 192.168.0.0/16 как угодно?

Да. Пространство RFC 1918 ваше — делите его на любой длине префикса, снаружи его никто не видит. Ограничение внутреннее: пересечение с сетью партнёра или с облачным VPC, с которым вы позже устроите пиринг, дорого распутывать, поэтому блоки, которые уже занял каждый домашний маршрутизатор, в планах обычно обходят стороной.

Если сводить всё к нескольким правилам: префикс считает биты сети, а размер блока — это 256 − граничный октет маски. Округлите адрес вниз до кратного размеру блока — получите сеть; прибавьте размер блока минус один — получите широковещательный. Вычитайте два за зарезервированную пару, но только когда /31 или /32 уже не убрали саму причину вычитать. Различайте обратную маску и маску подсети по их форме. Распределяйте большие блоки раньше маленьких.

Когда счёт доведён до автоматизма, для одного блока никакой инструмент уже не нужен. План целиком всё же стоит проверить до того, как он доедет до маршрутизатора: калькулятор подсетей считает локально в браузере и заодно показывает двоичную границу блока.

Теги: networking subnetting cidr ip-address cheat-sheet

Похожие статьи

Все статьи