From 6ced966274c33f44cb15bcf9bfe2688999afe80e Mon Sep 17 00:00:00 2001 From: shats Date: Sat, 24 Jan 2026 01:18:05 +0700 Subject: [PATCH] fix(NetworkConfigManager): enhance validation for /30 networks by ensuring generated local and remote IPs are always checked against network and broadcast address conflicts, improving IP generation reliability --- frontend/src/NetworkConfigManager.jsx | 38 +++++++++++++-------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/frontend/src/NetworkConfigManager.jsx b/frontend/src/NetworkConfigManager.jsx index 025253c..04e38b5 100644 --- a/frontend/src/NetworkConfigManager.jsx +++ b/frontend/src/NetworkConfigManager.jsx @@ -996,22 +996,21 @@ function NetworkConfigManager() { const localIp = `${a}.${b}.${c}.${dVal + 1}`; const remoteIp = `${a}.${b}.${c}.${dVal + 2}`; - // Для сетей /30 проверяем, что не используем сетевой адрес (базовый) и broadcast (базовый + 3) - // Для /30 используем только dVal + 1 и dVal + 2, что уже гарантировано формулой выше - // Дополнительно проверяем границы + // Для сетей /30 проверяем границы if (prefix >= 30) { if (dVal % 4 !== 0) continue; // Базовый адрес должен быть кратен 4 if (dVal + 2 > 255) continue; // Проверяем, что remoteIp не превышает 255 - // Для /30 dVal + 1 и dVal + 2 всегда валидны (не сетевой и не broadcast) - // Но нужно проверить, что эти IP не являются сетевыми или broadcast для других сетей /30 - const localLastOctet = dVal + 1; - const remoteLastOctet = dVal + 2; - // Проверяем, что Local IP не является сетевым адресом (кратен 4) или broadcast (кратен 4 + 3) - if (localLastOctet % 4 === 0 || localLastOctet % 4 === 3) continue; - // Проверяем, что Remote IP не является сетевым адресом (кратен 4) или broadcast (кратен 4 + 3) - if (remoteLastOctet % 4 === 0 || remoteLastOctet % 4 === 3) continue; } + // ВСЕГДА проверяем, что генерируемые IP не являются сетевыми или broadcast для любой сети /30 + // Это важно даже если пул имеет префикс меньше /30 + const localLastOctet = dVal + 1; + const remoteLastOctet = dVal + 2; + // Проверяем, что Local IP не является сетевым адресом (кратен 4) или broadcast (остаток 3 при делении на 4) + if (localLastOctet % 4 === 0 || localLastOctet % 4 === 3) continue; + // Проверяем, что Remote IP не является сетевым адресом (кратен 4) или broadcast (остаток 3 при делении на 4) + if (remoteLastOctet % 4 === 0 || remoteLastOctet % 4 === 3) continue; + // Проверяем, что IP входят в диапазон пула if (!isIpInCidr(localIp, cidr)) continue; if (!isIpInCidr(remoteIp, cidr)) continue; @@ -1041,18 +1040,19 @@ function NetworkConfigManager() { const remoteIp = `${a}.${b}.${cVal}.${dVal + 2}`; // Remote IP = базовый + 2 // Для сетей /30 проверяем границы - // Для /30 dVal + 1 и dVal + 2 всегда валидны (не сетевой и не broadcast) if (prefix >= 30) { if (dVal + 2 > 255) continue; // Проверяем, что remoteIp не превышает 255 - // Дополнительно проверяем, что IP не являются сетевыми или broadcast для других сетей /30 - const localLastOctet = dVal + 1; - const remoteLastOctet = dVal + 2; - // Проверяем, что Local IP не является сетевым адресом (кратен 4) или broadcast (кратен 4 + 3) - if (localLastOctet % 4 === 0 || localLastOctet % 4 === 3) continue; - // Проверяем, что Remote IP не является сетевым адресом (кратен 4) или broadcast (кратен 4 + 3) - if (remoteLastOctet % 4 === 0 || remoteLastOctet % 4 === 3) continue; } + // ВСЕГДА проверяем, что генерируемые IP не являются сетевыми или broadcast для любой сети /30 + // Это важно даже если пул имеет префикс меньше /30 + const localLastOctet = dVal + 1; + const remoteLastOctet = dVal + 2; + // Проверяем, что Local IP не является сетевым адресом (кратен 4) или broadcast (остаток 3 при делении на 4) + if (localLastOctet % 4 === 0 || localLastOctet % 4 === 3) continue; + // Проверяем, что Remote IP не является сетевым адресом (кратен 4) или broadcast (остаток 3 при делении на 4) + if (remoteLastOctet % 4 === 0 || remoteLastOctet % 4 === 3) continue; + // Проверяем, что IP входят в диапазон пула и отличаются if (!isIpInCidr(localIp, cidr)) continue; if (localIp === remoteIp) continue;