From b7a55e4241cd55db4e1685ca207cbe997cf08fc9 Mon Sep 17 00:00:00 2001 From: shats Date: Fri, 23 Jan 2026 14:24:36 +0700 Subject: [PATCH] fix(NetworkConfigManager): enhance IP generation logic for /30 networks to ensure valid address ranges and prevent conflicts with reserved IPs --- frontend/src/NetworkConfigManager.jsx | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/frontend/src/NetworkConfigManager.jsx b/frontend/src/NetworkConfigManager.jsx index 534d5ff..60ff4da 100644 --- a/frontend/src/NetworkConfigManager.jsx +++ b/frontend/src/NetworkConfigManager.jsx @@ -948,7 +948,12 @@ function NetworkConfigManager() { // Определяем диапазон для перебора в зависимости от префикса if (prefix >= 24) { // /24 - /32: меняем только последний октет - const startOctet = d; + // Для сетей /30 базовый адрес должен быть кратен 4 + let startOctet = d; + if (prefix >= 30) { + // Округляем вниз до ближайшего кратного 4 + startOctet = Math.floor(d / 4) * 4; + } const maxHosts = Math.pow(2, hostBits); const endOctet = Math.min(d + maxHosts - 1, 255); @@ -960,6 +965,13 @@ function NetworkConfigManager() { const localIp = `${a}.${b}.${c}.${dVal + 1}`; const remoteIp = `${a}.${b}.${c}.${dVal + 2}`; + // Для сетей /30 проверяем, что не выходим за пределы сети (не используем .0 и .3) + if (prefix >= 30) { + const lastOctet = dVal % 4; + if (lastOctet !== 0) continue; // Базовый адрес должен быть кратен 4 + if (dVal + 2 > 255) continue; // Проверяем, что remoteIp не превышает 255 + } + // Проверяем, что IP входят в диапазон пула if (!isIpInCidr(localIp, cidr)) continue; if (!isIpInCidr(remoteIp, cidr)) continue; @@ -976,10 +988,15 @@ function NetworkConfigManager() { // /16 - /23: меняем третий и четвертый октеты const thirdOctetRange = Math.pow(2, Math.max(0, 24 - prefix)); for (let cVal = c; cVal < c + thirdOctetRange && cVal <= 255; cVal++) { - const dStart = (cVal === c) ? d : 0; + let dStart = (cVal === c) ? d : 0; + // Для сетей /30 базовый адрес должен быть кратен 4 + if (prefix >= 30) { + dStart = Math.floor(dStart / 4) * 4; + } const dEnd = 255; for (let dVal = dStart; dVal <= dEnd; dVal += step) { if (prefix >= 30 && dVal % 4 !== 0) continue; // Для /30 только кратные 4 + const localIp = `${a}.${b}.${cVal}.${dVal + 1}`; // Local IP = базовый + 1 const remoteIp = `${a}.${b}.${cVal}.${dVal + 2}`; // Remote IP = базовый + 2