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

This commit is contained in:
2026-01-23 14:24:36 +07:00
parent cef571cc40
commit b7a55e4241
+19 -2
View File
@@ -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