feat(NetworkConfigManager): enhance IP generation logic to ensure unique local and remote IP pairs; improve handling of alternative IP generation for tunnel previews, ensuring better usability and error handling
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m42s
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m42s
This commit is contained in:
@@ -926,7 +926,8 @@ function NetworkConfigManager() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return null; // Не удалось сгенерировать парный Remote IP
|
// Если не удалось сгенерировать парный Remote IP, продолжаем поиск в общем цикле ниже
|
||||||
|
// Не возвращаем null сразу, чтобы попробовать найти другую пару
|
||||||
}
|
}
|
||||||
|
|
||||||
// Вычисляем количество хостов в сети
|
// Вычисляем количество хостов в сети
|
||||||
@@ -957,16 +958,9 @@ function NetworkConfigManager() {
|
|||||||
// Проверяем, что IP отличаются друг от друга
|
// Проверяем, что IP отличаются друг от друга
|
||||||
if (localIp === remoteIp) continue;
|
if (localIp === remoteIp) continue;
|
||||||
|
|
||||||
// Проверяем, свободны ли оба IP (для /30)
|
// Для всех префиксов проверяем, что оба IP свободны (для туннелей нужны пары)
|
||||||
if (prefix >= 30) {
|
if (!usedIps.has(localIp) && !usedIps.has(remoteIp)) {
|
||||||
if (!usedIps.has(localIp) && !usedIps.has(remoteIp)) {
|
return forRemote ? remoteIp : localIp;
|
||||||
return forRemote ? remoteIp : localIp;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
// Для других префиксов просто проверяем один IP
|
|
||||||
if (!usedIps.has(localIp)) {
|
|
||||||
return localIp;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if (prefix >= 16) {
|
} else if (prefix >= 16) {
|
||||||
@@ -984,12 +978,12 @@ function NetworkConfigManager() {
|
|||||||
if (!isIpInCidr(localIp, cidr)) continue;
|
if (!isIpInCidr(localIp, cidr)) continue;
|
||||||
if (localIp === remoteIp) continue;
|
if (localIp === remoteIp) continue;
|
||||||
|
|
||||||
|
// Проверяем, что Remote IP тоже входит в пул
|
||||||
|
if (!isIpInCidr(remoteIp, cidr)) continue;
|
||||||
|
|
||||||
// Для всех префиксов проверяем, что оба IP свободны (для туннелей нужны пары)
|
// Для всех префиксов проверяем, что оба IP свободны (для туннелей нужны пары)
|
||||||
if (!usedIps.has(localIp) && !usedIps.has(remoteIp)) {
|
if (!usedIps.has(localIp) && !usedIps.has(remoteIp)) {
|
||||||
// Проверяем, что Remote IP тоже входит в пул (для префиксов >= 30 это всегда true)
|
return forRemote ? remoteIp : localIp;
|
||||||
if (prefix >= 30 || isIpInCidr(remoteIp, cidr)) {
|
|
||||||
return forRemote ? remoteIp : localIp;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3722,17 +3716,40 @@ function NetworkConfigManager() {
|
|||||||
const prevPairIpPoolId = prevPair.ipPoolId || templateIpPoolId;
|
const prevPairIpPoolId = prevPair.ipPoolId || templateIpPoolId;
|
||||||
const prevPreviewLocal = generateFreePrivateIp(null, false, null, prevPairIpPoolId || null, previewUsedIps);
|
const prevPreviewLocal = generateFreePrivateIp(null, false, null, prevPairIpPoolId || null, previewUsedIps);
|
||||||
if (prevPreviewLocal) {
|
if (prevPreviewLocal) {
|
||||||
|
previewUsedIps.add(prevPreviewLocal);
|
||||||
const prevPreviewRemote = generateFreePrivateIp(null, true, prevPreviewLocal, prevPairIpPoolId || null, previewUsedIps);
|
const prevPreviewRemote = generateFreePrivateIp(null, true, prevPreviewLocal, prevPairIpPoolId || null, previewUsedIps);
|
||||||
if (prevPreviewRemote && prevPreviewRemote !== prevPreviewLocal) {
|
if (prevPreviewRemote && prevPreviewRemote !== prevPreviewLocal) {
|
||||||
previewUsedIps.add(prevPreviewLocal);
|
|
||||||
previewUsedIps.add(prevPreviewRemote);
|
previewUsedIps.add(prevPreviewRemote);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const previewLocalIp = generateFreePrivateIp(null, false, null, pairIpPoolId || null, previewUsedIps);
|
// Генерируем IP для текущего туннеля
|
||||||
const previewRemoteIp = previewLocalIp ? generateFreePrivateIp(null, true, previewLocalIp, pairIpPoolId || null, previewUsedIps) : null;
|
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 (
|
return (
|
||||||
<div key={index} className="card card-sm border">
|
<div key={index} className="card card-sm border">
|
||||||
|
|||||||
Reference in New Issue
Block a user