fix(NetworkConfigManager): enhance IP generation logic for /30 networks to ensure valid address ranges and prevent conflicts with reserved IPs
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m39s
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m39s
This commit is contained in:
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user