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) {
|
if (prefix >= 24) {
|
||||||
// /24 - /32: меняем только последний октет
|
// /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 maxHosts = Math.pow(2, hostBits);
|
||||||
const endOctet = Math.min(d + maxHosts - 1, 255);
|
const endOctet = Math.min(d + maxHosts - 1, 255);
|
||||||
|
|
||||||
@@ -960,6 +965,13 @@ function NetworkConfigManager() {
|
|||||||
const localIp = `${a}.${b}.${c}.${dVal + 1}`;
|
const localIp = `${a}.${b}.${c}.${dVal + 1}`;
|
||||||
const remoteIp = `${a}.${b}.${c}.${dVal + 2}`;
|
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 входят в диапазон пула
|
// Проверяем, что IP входят в диапазон пула
|
||||||
if (!isIpInCidr(localIp, cidr)) continue;
|
if (!isIpInCidr(localIp, cidr)) continue;
|
||||||
if (!isIpInCidr(remoteIp, cidr)) continue;
|
if (!isIpInCidr(remoteIp, cidr)) continue;
|
||||||
@@ -976,10 +988,15 @@ function NetworkConfigManager() {
|
|||||||
// /16 - /23: меняем третий и четвертый октеты
|
// /16 - /23: меняем третий и четвертый октеты
|
||||||
const thirdOctetRange = Math.pow(2, Math.max(0, 24 - prefix));
|
const thirdOctetRange = Math.pow(2, Math.max(0, 24 - prefix));
|
||||||
for (let cVal = c; cVal < c + thirdOctetRange && cVal <= 255; cVal++) {
|
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;
|
const dEnd = 255;
|
||||||
for (let dVal = dStart; dVal <= dEnd; dVal += step) {
|
for (let dVal = dStart; dVal <= dEnd; dVal += step) {
|
||||||
if (prefix >= 30 && dVal % 4 !== 0) continue; // Для /30 только кратные 4
|
if (prefix >= 30 && dVal % 4 !== 0) continue; // Для /30 только кратные 4
|
||||||
|
|
||||||
const localIp = `${a}.${b}.${cVal}.${dVal + 1}`; // Local IP = базовый + 1
|
const localIp = `${a}.${b}.${cVal}.${dVal + 1}`; // Local IP = базовый + 1
|
||||||
const remoteIp = `${a}.${b}.${cVal}.${dVal + 2}`; // Remote IP = базовый + 2
|
const remoteIp = `${a}.${b}.${cVal}.${dVal + 2}`; // Remote IP = базовый + 2
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user