diff --git a/frontend/src/NetworkConfigManager.jsx b/frontend/src/NetworkConfigManager.jsx index 62c1f49..51b26f3 100644 --- a/frontend/src/NetworkConfigManager.jsx +++ b/frontend/src/NetworkConfigManager.jsx @@ -864,6 +864,7 @@ function NetworkConfigManager() { // Перебираем только базовые адреса сетей /30 (кратные 4) for (let dVal = dStart; dVal <= dEndVal; dVal += 4) { // Local IP = базовый + 1, Remote IP = базовый + 2 + // НЕ используем базовый (dVal) и broadcast (dVal + 3) const localIp = `${aVal}.${bVal}.${cVal}.${dVal + 1}`; const remoteIp = `${aVal}.${bVal}.${cVal}.${dVal + 2}`; @@ -918,6 +919,7 @@ function NetworkConfigManager() { const localOffset = baseOctet - networkBase; // Для сетей /30 проверяем, что Local IP не является сетевым адресом или broadcast + // Local IP должен быть базовый + 1 или базовый + 2 if (prefix >= 30) { const networkAddress = `${localIpParts[0]}.${localIpParts[1]}.${localIpParts[2]}.${networkBase}`; const broadcastAddress = `${localIpParts[0]}.${localIpParts[1]}.${localIpParts[2]}.${networkBase + 3}`; @@ -925,15 +927,21 @@ function NetworkConfigManager() { // Local IP является сетевым адресом или broadcast, не можем использовать return null; } + // Проверяем, что Local IP находится в допустимом диапазоне (базовый + 1 или базовый + 2) + if (localOffset !== 1 && localOffset !== 2) { + // Local IP не в допустимом диапазоне для /30 + return null; + } } let remoteOffset; if (localOffset === 1) { - remoteOffset = 2; + remoteOffset = 2; // Если Local IP = базовый + 1, то Remote IP = базовый + 2 } else if (localOffset === 2) { - remoteOffset = 1; + remoteOffset = 1; // Если Local IP = базовый + 2, то Remote IP = базовый + 1 } else { - remoteOffset = localOffset === 0 ? 2 : (localOffset === 3 ? 1 : 2); + // Если Local IP не в допустимом диапазоне, не можем сгенерировать парный Remote IP + return null; } const remoteOctet = networkBase + remoteOffset; @@ -989,16 +997,12 @@ function NetworkConfigManager() { const remoteIp = `${a}.${b}.${c}.${dVal + 2}`; // Для сетей /30 проверяем, что не используем сетевой адрес (базовый) и broadcast (базовый + 3) + // Для /30 используем только dVal + 1 и dVal + 2, что уже гарантировано формулой выше + // Дополнительно проверяем границы if (prefix >= 30) { - const lastOctet = dVal % 4; - if (lastOctet !== 0) continue; // Базовый адрес должен быть кратен 4 + if (dVal % 4 !== 0) continue; // Базовый адрес должен быть кратен 4 if (dVal + 2 > 255) continue; // Проверяем, что remoteIp не превышает 255 - // Проверяем, что не используем сетевой адрес (dVal) и broadcast (dVal + 3) - // Для /30 используем только dVal + 1 и dVal + 2 - const networkAddress = `${a}.${b}.${c}.${dVal}`; - const broadcastAddress = `${a}.${b}.${c}.${dVal + 3}`; - if (localIp === networkAddress || localIp === broadcastAddress) continue; - if (remoteIp === networkAddress || remoteIp === broadcastAddress) continue; + // Для /30 dVal + 1 и dVal + 2 всегда валидны (не сетевой и не broadcast) } // Проверяем, что IP входят в диапазон пула @@ -1029,12 +1033,10 @@ function NetworkConfigManager() { const localIp = `${a}.${b}.${cVal}.${dVal + 1}`; // Local IP = базовый + 1 const remoteIp = `${a}.${b}.${cVal}.${dVal + 2}`; // Remote IP = базовый + 2 - // Для сетей /30 проверяем, что не используем сетевой адрес (базовый) и broadcast (базовый + 3) + // Для сетей /30 проверяем границы + // Для /30 dVal + 1 и dVal + 2 всегда валидны (не сетевой и не broadcast) if (prefix >= 30) { - const networkAddress = `${a}.${b}.${cVal}.${dVal}`; - const broadcastAddress = `${a}.${b}.${cVal}.${dVal + 3}`; - if (localIp === networkAddress || localIp === broadcastAddress) continue; - if (remoteIp === networkAddress || remoteIp === broadcastAddress) continue; + if (dVal + 2 > 255) continue; // Проверяем, что remoteIp не превышает 255 } // Проверяем, что IP входят в диапазон пула и отличаются