diff --git a/frontend/src/NetworkConfigManager.jsx b/frontend/src/NetworkConfigManager.jsx index 93fd29e..77d45df 100644 --- a/frontend/src/NetworkConfigManager.jsx +++ b/frontend/src/NetworkConfigManager.jsx @@ -926,7 +926,8 @@ function NetworkConfigManager() { } } } - return null; // Не удалось сгенерировать парный Remote IP + // Если не удалось сгенерировать парный Remote IP, продолжаем поиск в общем цикле ниже + // Не возвращаем null сразу, чтобы попробовать найти другую пару } // Вычисляем количество хостов в сети @@ -957,16 +958,9 @@ function NetworkConfigManager() { // Проверяем, что IP отличаются друг от друга if (localIp === remoteIp) continue; - // Проверяем, свободны ли оба IP (для /30) - if (prefix >= 30) { - if (!usedIps.has(localIp) && !usedIps.has(remoteIp)) { - return forRemote ? remoteIp : localIp; - } - } else { - // Для других префиксов просто проверяем один IP - if (!usedIps.has(localIp)) { - return localIp; - } + // Для всех префиксов проверяем, что оба IP свободны (для туннелей нужны пары) + if (!usedIps.has(localIp) && !usedIps.has(remoteIp)) { + return forRemote ? remoteIp : localIp; } } } else if (prefix >= 16) { @@ -984,12 +978,12 @@ function NetworkConfigManager() { if (!isIpInCidr(localIp, cidr)) continue; if (localIp === remoteIp) continue; + // Проверяем, что Remote IP тоже входит в пул + if (!isIpInCidr(remoteIp, cidr)) continue; + // Для всех префиксов проверяем, что оба IP свободны (для туннелей нужны пары) if (!usedIps.has(localIp) && !usedIps.has(remoteIp)) { - // Проверяем, что Remote IP тоже входит в пул (для префиксов >= 30 это всегда true) - if (prefix >= 30 || isIpInCidr(remoteIp, cidr)) { - return forRemote ? remoteIp : localIp; - } + return forRemote ? remoteIp : localIp; } } } @@ -3722,17 +3716,40 @@ function NetworkConfigManager() { const prevPairIpPoolId = prevPair.ipPoolId || templateIpPoolId; const prevPreviewLocal = generateFreePrivateIp(null, false, null, prevPairIpPoolId || null, previewUsedIps); if (prevPreviewLocal) { + previewUsedIps.add(prevPreviewLocal); const prevPreviewRemote = generateFreePrivateIp(null, true, prevPreviewLocal, prevPairIpPoolId || null, previewUsedIps); if (prevPreviewRemote && prevPreviewRemote !== prevPreviewLocal) { - previewUsedIps.add(prevPreviewLocal); previewUsedIps.add(prevPreviewRemote); } } } } - const previewLocalIp = generateFreePrivateIp(null, false, null, pairIpPoolId || null, previewUsedIps); - const previewRemoteIp = previewLocalIp ? generateFreePrivateIp(null, true, previewLocalIp, pairIpPoolId || null, previewUsedIps) : null; + // Генерируем IP для текущего туннеля + let previewLocalIp = generateFreePrivateIp(null, false, null, pairIpPoolId || null, previewUsedIps); + let previewRemoteIp = null; + + if (previewLocalIp) { + // Генерируем Remote IP на основе Local IP + previewRemoteIp = generateFreePrivateIp(null, true, previewLocalIp, pairIpPoolId || null, previewUsedIps); + + // Если Remote IP не сгенерировался или совпадает с Local IP, пробуем найти другую пару + if (!previewRemoteIp || previewRemoteIp === previewLocalIp) { + // Добавляем текущий Local IP в использованные и пробуем найти другую пару + previewUsedIps.add(previewLocalIp); + const altPreviewLocalIp = generateFreePrivateIp(null, false, null, pairIpPoolId || null, previewUsedIps); + if (altPreviewLocalIp && altPreviewLocalIp !== previewLocalIp) { + const altPreviewRemoteIp = generateFreePrivateIp(null, true, altPreviewLocalIp, pairIpPoolId || null, previewUsedIps); + if (altPreviewRemoteIp && altPreviewRemoteIp !== altPreviewLocalIp) { + previewLocalIp = altPreviewLocalIp; + previewRemoteIp = altPreviewRemoteIp; + } else { + // Если все равно не получилось, удаляем альтернативный Local IP + previewUsedIps.delete(altPreviewLocalIp); + } + } + } + } return (