Как рассчитать подсеть: маска, CIDR и VLSM на примерах

Как рассчитать подсеть: маска, CIDR и VLSM на примерах

Подсеть — это диапазон IP-адресов с общим префиксом. Умение находить её границы помогает спроектировать офисную сеть, настроить VPN, выделить адреса серверам и понять, почему два устройства не видят друг друга. Для расчёта достаточно двоичной логики и нескольких степеней двойки; запоминать «классы A, B, C» в качестве метода проектирования современной сети не нужно.

Разберём адрес 192.168.10.77/26, затем распределим один /24 между отделами разного размера. Все расчёты можно проверить стандартным модулем Python ipaddress. Код только рассчитывает адреса и ничего не меняет в сетевых настройках.

Как читать CIDR

В записи IPv4 192.168.10.77/26 число после косой черты обозначает количество битов сетевого префикса. Всего в IPv4 32 бита, значит на оставшуюся часть приходится 6 бит. Полный размер блока равен 2^(32 − 26) = 64 адресам. В обычной широковещательной подсети два крайних адреса используются как адрес сети и broadcast.

Чем больше длина префикса, тем меньше блок. /25 содержит 128 адресов, /26 — 64, /27 — 32, /28 — 16. Переход от /24 к /26 делит исходную сеть на четыре одинаковые части. Не путайте размер блока и число адресов, которое можно выдать клиентам: шлюз и статические устройства тоже занимают место.

Где разместить проект

Для сайтов, ботов и pet-проектов можно использовать Beget: виртуальный хостинг от 420 ₽/мес., VPS от 330 ₽/мес. и тестовый период.

Перейти на Beget →

Из префикса в маску

Маска /26 в двоичной форме содержит 26 единиц, за которыми следуют 6 нулей. Первые три октета полностью состоят из единиц, поэтому равны 255. Последний октет — 11000000, то есть 128 + 64 = 192. Получается 255.255.255.192.

/24 → 255.255.255.0   → 256 адресов
/25 → 255.255.255.128 → 128 адресов
/26 → 255.255.255.192 →  64 адреса
/27 → 255.255.255.224 →  32 адреса
/28 → 255.255.255.240 →  16 адресов
/29 → 255.255.255.248 →   8 адресов
/30 → 255.255.255.252 →   4 адреса

Этот список нужен как проверка, а не вместо понимания. Если префикс короче /24, изменение затрагивает и предыдущие октеты. Например, /23 объединяет два смежных /24, но только при правильном выравнивании границы блока.

Расчёт 192.168.10.77/26 вручную

Для /26 шаг в последнем октете равен 64. Возможные начала блоков в пределах 192.168.10.0/24: 0, 64, 128 и 192. Число 77 попадает между 64 и 127. Следовательно, адрес сети — 192.168.10.64, следующий блок начинается с 128, а broadcast текущего блока — 127.

  • IP узла: 192.168.10.77.
  • Префикс и маска: /26, 255.255.255.192.
  • Сеть: 192.168.10.64/26.
  • Адреса узлов: 192.168.10.65–192.168.10.126.
  • Broadcast: 192.168.10.127.
  • Обычная вместимость: 62 адреса узлов.

Шлюз можно назначить, например, на .65, но это организационное соглашение, а не свойство /26. Если .65 занят маршрутизатором и ещё несколько адресов зарезервированы, DHCP-пул должен быть меньше 62. Нельзя выдавать клиенту адрес сети .64 или broadcast .127.

Почему адрес сети должен быть выровнен

Запись 192.168.10.77/26 допустима как адрес интерфейса, но неверна как канонический адрес сети: в ней установлены биты узла. Некоторые программы автоматически нормализуют её в 192.168.10.64/26, другие откажут. Это полезный отказ: он помогает заметить ошибку до применения firewall или маршрута.

Для /23 границы находятся в чётных значениях третьего октета. Сеть 192.168.10.0/23 охватывает 192.168.10.0–192.168.11.255. Запись 192.168.11.0/23 не обозначает отдельный независимый блок: она относится к тому же диапазону после нормализации.

VLSM: отделы разного размера

Предположим, есть блок 10.20.0.0/24. Нужно выделить 50 адресов рабочим станциям, 25 — телефонии, 12 — серверам и 5 — управлению. В этих требованиях заранее учтём адрес шлюза. VLSM позволяет использовать разные длины префикса, а не делить всё на одинаковые подсети.

Распределяем от самого крупного требования к меньшему. Рабочим станциям подходит /26 с 62 адресами узлов. Телефонии — /27 с 30, серверам — /28 с 14, управлению — /29 с 6. Проверяем, чтобы каждый новый блок начинался на своей границе и не пересекался с уже выделенными.

Рабочие станции: 10.20.0.0/26
  узлы .1–.62, broadcast .63
Телефония:       10.20.0.64/27
  узлы .65–.94, broadcast .95
Серверы:         10.20.0.96/28
  узлы .97–.110, broadcast .111
Управление:      10.20.0.112/29
  узлы .113–.118, broadcast .119

Диапазон начиная с .120 остаётся свободным, но его нельзя объявить одним произвольным CIDR-блоком без проверки выравнивания. В адресном плане полезно хранить выделенные сети, свободные блоки, владельца, назначение, шлюз, DHCP-пул и резерв на рост.

Проверяем расчёт в Python

from ipaddress import ip_interface, ip_network

iface = ip_interface("192.168.10.77/26")
net = iface.network
print(net)                    # 192.168.10.64/26
print(net.netmask)            # 255.255.255.192
print(net.broadcast_address)  # 192.168.10.127
print(net.num_addresses)      # 64

office = ip_network("10.20.0.0/26")
voice = ip_network("10.20.0.64/27")
print(office.overlaps(voice)) # False
print(iface.ip in net)        # True

Для адреса интерфейса используется ip_interface, для канонической сети — ip_network. Если нужно намеренно убрать биты узла, у второй функции есть strict=False, но в валидаторе конфигурации лучше не скрывать ошибочные исходные значения. Получение списка всех адресов большой сети также не требуется: проверка принадлежности и пересечений работает без перечисления каждого узла.

Подсеть и VLAN решают разные задачи

IP-подсеть описывает адресное пространство сетевого уровня. VLAN разделяет канальные широковещательные домены. Обычно проектируют одну подсеть на VLAN, но само изменение маски не создаёт изоляцию коммутатора. Два устройства могут физически находиться рядом и всё равно не обмениваться ARP, если их порты принадлежат разным VLAN.

Чтобы разрешить связь между VLAN, нужен маршрутизатор или L3-коммутатор и согласованные правила firewall. Чтобы запретить гостям доступ к серверам, одного другого адресного диапазона недостаточно: запрет должен обеспечиваться сетевой политикой. DHCP relay и настройки DNS также проектируются для каждого сегмента.

Исключения: /31, /32 и IPv6

В обычных IPv4-подсетях мы вычитали адрес сети и broadcast. На поддерживаемых соединениях точка-точка /31 оба адреса используются концами линии, что описано RFC 3021. Префикс /32 обозначает один адрес, например host route. Поэтому калькулятор, который всегда вычитает два, даёт неверный результат на этих случаях.

Для IPv6 не нужно повторять практику экономии адресов IPv4. Обычные SLAAC-сегменты планируются с /64; broadcast в IPv6 нет. Выделение /64, маршрутизация префиксов и адреса link-local требуют отдельного понимания. Базовые различия разобраны в статье об IPv4, IPv6 и шлюзе.

Три ошибки адресного плана

Первая — пересечение с удалённой сетью VPN. Популярный домашний диапазон может совпасть с офисным, после чего запрос уйдёт по неожиданному маршруту. Вторая — отсутствие запаса. Если сеть рассчитана ровно на текущие устройства, новые принтеры и телефоны быстро потребуют переразметки. Третья — путаница между пулом DHCP и всей подсетью. Пул занимает лишь часть адресов; шлюзы, серверы и резервирования нужно учитывать отдельно.

Перед изменением существующей маски проверьте статические адреса, маршруты, ACL, DHCP options, DNS и мониторинг. Изменение одной цифры на сервере может потребовать согласованных правок на нескольких устройствах. Для практического применения используйте руководство по Netplan.

Упражнения с ответами

Задача 1: найти сеть для 192.168.8.141/27. Шаг 32, адрес лежит в диапазоне 128–159. Ответ: сеть .128/27, узлы .129–.158, broadcast .159.

Задача 2: помещаются ли 40 клиентов и один шлюз в /27? Нет: доступно только 30 обычных адресов узлов. /26 даёт 62, то есть оставляет 21 адрес после размещения 41 устройства.

Задача 3: пересекаются ли 10.20.0.0/25 и 10.20.0.64/26? Да, второй диапазон полностью находится внутри первого. Два отдельных DHCP-сегмента так проектировать нельзя.

Частые вопросы

Почему .255 иногда обычный адрес?

Значение определяется префиксом. Например, 192.168.10.255 внутри 192.168.10.0/23 не является broadcast; broadcast этого /23 — 192.168.11.255.

Обязательно ли шлюз заканчивается на .1?

Нет, это только распространённое соглашение. Он должен соответствовать реальной маршрутизации и правилам площадки.

Источники: RFC 4632 — CIDR, RFC 3021 — /31, документация Python ipaddress.

Хотите системно изучить программирование?

Подборка онлайн-курсов для разработчиков — Python, Java, веб и DevOps.

Смотреть курсы →

Бесплатные инструменты

Калькулятор подсетей · SSH-конфиг · Nginx · Docker Compose

Нужно настроить сервер, сайт или автоматизацию?

Разберём задачу по VPS/Linux, DNS, WordPress, Telegram-ботам и интеграциям. Стоимость определяется после оценки объёма.

Обсудить задачу → 8 918 532 81 08

Статья может содержать партнёрские ссылки. Это не влияет на стоимость для вас, но помогает развивать блог.