Проверка CIDR нотации

CIDR (Classless Inter-Domain Routing) представляет собой способ записи IP-адреса с указанием маски сети через слэш. Формат включает базовый адрес и длину префикса, определяющую количество бит, относящихся к сети.

Примеры CIDR-записей:

  • IPv4: 192.168.0.0/24
  • IPv4: 10.0.0.0/8
  • IPv6: 2001:db8::/32

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


Поддержка CIDR в Validator.js

В библиотеке validator.js отсутствует отдельная функция строго с названием isCIDR, однако проверка CIDR реализуется через метод:

  • isIPRange(value[, version])

Данный метод позволяет проверять как диапазоны IP-адресов, так и CIDR-нотацию для IPv4 и IPv6.


Базовое использование isIPRange

const validator = require('validator');

validator.isIPRange('192.168.0.0/24'); // true
validator.isIPRange('10.0.0.0/8');     // true
validator.isIPRange('192.168.0.0/33'); // false

Функция автоматически интерпретирует строку как CIDR, если присутствует символ / и корректный префикс.


Проверка IPv4 CIDR

IPv4 CIDR ограничивается маской от 0 до 32:

validator.isIPRange('172.16.0.0/12');   // true
validator.isIPRange('172.16.0.0/33');   // false
validator.isIPRange('256.1.1.0/24');    // false

Особенности проверки:

  • IP-адрес должен быть корректным IPv4
  • Префикс не должен превышать 32
  • Недопустимы ведущие нули в октетах (в зависимости от строгих настроек окружения)

Проверка IPv6 CIDR

IPv6 использует расширенный адресный формат и префиксы до 128:

validator.isIPRange('2001:db8::/32');   // true
validator.isIPRange('::1/128');         // true
validator.isIPRange('2001:db8::/129');  // false

Особенности:

  • Поддерживаются сокращённые записи (::)
  • Префикс ограничен значением 128
  • Проверяется соответствие IPv6-формату

Явное указание версии IP

Метод позволяет ограничить проверку только IPv4 или IPv6:

validator.isIPRange('192.168.1.0/24', 4); // true
validator.isIPRange('192.168.1.0/24', 6); // false

validator.isIPRange('2001:db8::/32', 6);  // true
validator.isIPRange('2001:db8::/32', 4);  // false

Использование версии полезно при строгой типизации входных данных, особенно в API с фиксированным типом адресов.


Разбор структуры CIDR

CIDR-строка состоит из двух частей:

<IP-адрес>/<префикс>

Например:

192.168.10.0/24

Разделение:

  • 192.168.10.0 — базовый адрес сети
  • 24 — количество бит, закреплённых за сетью

При обработке через Validator.js строка анализируется как единое выражение, без необходимости ручного разделения.


Ручная валидация через разбор строки

При необходимости более строгого контроля можно комбинировать проверки:

const validator = require('validator');

function isValidCIDR(input) {
  if (typeof input !== 'string') return false;

  const parts = input.split('/');

  if (parts.length !== 2) return false;

  const [ip, prefix] = parts;

  if (!validator.isIP(ip)) return false;
  if (!validator.isInt(prefix, { min: 0, max: 128 })) return false;

  return validator.isIPRange(input);
}

Такой подход позволяет:

  • заранее отсеивать некорректные строки
  • контролировать диапазон префиксов
  • комбинировать несколько уровней проверки

Частые ошибки при проверке CIDR

1. Неверный формат IP

validator.isIPRange('192.168.1.300/24'); // false

Октет выходит за допустимый диапазон.


2. Отсутствие префикса

validator.isIPRange('192.168.1.0'); // false

CIDR требует обязательного указания маски.


3. Некорректный префикс

validator.isIPRange('192.168.1.0/-1');  // false
validator.isIPRange('192.168.1.0/999'); // false

4. Несоответствие версии IP

validator.isIPRange('2001:db8::/32', 4); // false

IPv6-адрес не проходит проверку IPv4-режима.


Использование валидации в API

CIDR часто применяется в системах ограничения доступа:

  • whitelist IP-диапазонов
  • firewall-правила
  • настройки прокси
  • cloud security groups

Пример фильтрации входных данных:

function validateNetworkRule(rule) {
  return validator.isIPRange(rule);
}

const rules = [
  '192.168.0.0/24',
  '10.0.0.0/8',
  'invalid_ip/24'
];

const validRules = rules.filter(validateNetworkRule);

Производные подходы и расширения проверки

Для сложных сценариев применяется дополнительная логика:

Нормализация входных данных

function normalizeCIDR(input) {
  return input.trim().toLowerCase();
}

Проверка на приватные диапазоны

function isPrivateCIDR(cidr) {
  return (
    cidr.startsWith('10.') ||
    cidr.startsWith('192.168.') ||
    cidr.startsWith('172.')
  );
}

Комбинирование с IP-проверками

validator.isIP(ip, 4);
validator.isIPRange(cidr);

Ограничения Validator.js при работе с CIDR

Несмотря на удобство, библиотека не предоставляет:

  • детального разбора сети на хосты
  • вычисления broadcast-адресов
  • работы с битовыми масками напрямую
  • анализа пересечения сетей

Она ограничивается синтаксической валидацией строки.


Поведение при некорректных типах данных

validator.isIPRange(null);        // false
validator.isIPRange(undefined);   // false
validator.isIPRange(12345);       // false

Любые нестроковые значения автоматически отклоняются.


Практические сценарии применения

CIDR-валидация используется в следующих контекстах:

  • проверка конфигурационных файлов
  • валидация пользовательских настроек доступа
  • обработка сетевых политик
  • фильтрация логов и событий безопасности
  • настройка балансировщиков нагрузки

Совместное использование с другими валидаторами

const validator = require('validator');

function validateAccessRule(input) {
  return (
    validator.isLength(input, { min: 5 }) &&
    validator.isIPRange(input)
  );
}

Такой подход позволяет объединять структурную и синтаксическую проверку.


Особенности обработки IPv6 CIDR

IPv6 требует особого внимания к сокращённой форме:

validator.isIPRange('2001:0db8:0000:0000::/64'); // true
validator.isIPRange('2001:db8::/64');           // true

Обе формы считаются эквивалентными.


Итоговые характеристики метода isIPRange

  • поддерживает IPv4 и IPv6 CIDR
  • проверяет корректность IP-адреса и префикса
  • не выполняет семантический анализ сети
  • используется как базовый слой валидации
  • интегрируется с другими функциями Validator.js