fix(NetworkConfigManager): enhance validation for /30 networks by ensuring generated local and remote IPs are always checked against network and broadcast address conflicts, improving IP generation reliability
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m43s

This commit is contained in:
2026-01-24 01:18:05 +07:00
parent 32255c6a3a
commit 6ced966274
+19 -19
View File
@@ -996,22 +996,21 @@ function NetworkConfigManager() {
const localIp = `${a}.${b}.${c}.${dVal + 1}`;
const remoteIp = `${a}.${b}.${c}.${dVal + 2}`;
// Для сетей /30 проверяем, что не используем сетевой адрес (базовый) и broadcast (базовый + 3)
// Для /30 используем только dVal + 1 и dVal + 2, что уже гарантировано формулой выше
// Дополнительно проверяем границы
// Для сетей /30 проверяем границы
if (prefix >= 30) {
if (dVal % 4 !== 0) continue; // Базовый адрес должен быть кратен 4
if (dVal + 2 > 255) continue; // Проверяем, что remoteIp не превышает 255
// Для /30 dVal + 1 и dVal + 2 всегда валидны (не сетевой и не broadcast)
// Но нужно проверить, что эти IP не являются сетевыми или broadcast для других сетей /30
const localLastOctet = dVal + 1;
const remoteLastOctet = dVal + 2;
// Проверяем, что Local IP не является сетевым адресом (кратен 4) или broadcast (кратен 4 + 3)
if (localLastOctet % 4 === 0 || localLastOctet % 4 === 3) continue;
// Проверяем, что Remote IP не является сетевым адресом (кратен 4) или broadcast (кратен 4 + 3)
if (remoteLastOctet % 4 === 0 || remoteLastOctet % 4 === 3) continue;
}
// ВСЕГДА проверяем, что генерируемые IP не являются сетевыми или broadcast для любой сети /30
// Это важно даже если пул имеет префикс меньше /30
const localLastOctet = dVal + 1;
const remoteLastOctet = dVal + 2;
// Проверяем, что Local IP не является сетевым адресом (кратен 4) или broadcast (остаток 3 при делении на 4)
if (localLastOctet % 4 === 0 || localLastOctet % 4 === 3) continue;
// Проверяем, что Remote IP не является сетевым адресом (кратен 4) или broadcast (остаток 3 при делении на 4)
if (remoteLastOctet % 4 === 0 || remoteLastOctet % 4 === 3) continue;
// Проверяем, что IP входят в диапазон пула
if (!isIpInCidr(localIp, cidr)) continue;
if (!isIpInCidr(remoteIp, cidr)) continue;
@@ -1041,18 +1040,19 @@ function NetworkConfigManager() {
const remoteIp = `${a}.${b}.${cVal}.${dVal + 2}`; // Remote IP = базовый + 2
// Для сетей /30 проверяем границы
// Для /30 dVal + 1 и dVal + 2 всегда валидны (не сетевой и не broadcast)
if (prefix >= 30) {
if (dVal + 2 > 255) continue; // Проверяем, что remoteIp не превышает 255
// Дополнительно проверяем, что IP не являются сетевыми или broadcast для других сетей /30
const localLastOctet = dVal + 1;
const remoteLastOctet = dVal + 2;
// Проверяем, что Local IP не является сетевым адресом (кратен 4) или broadcast (кратен 4 + 3)
if (localLastOctet % 4 === 0 || localLastOctet % 4 === 3) continue;
// Проверяем, что Remote IP не является сетевым адресом (кратен 4) или broadcast (кратен 4 + 3)
if (remoteLastOctet % 4 === 0 || remoteLastOctet % 4 === 3) continue;
}
// ВСЕГДА проверяем, что генерируемые IP не являются сетевыми или broadcast для любой сети /30
// Это важно даже если пул имеет префикс меньше /30
const localLastOctet = dVal + 1;
const remoteLastOctet = dVal + 2;
// Проверяем, что Local IP не является сетевым адресом (кратен 4) или broadcast (остаток 3 при делении на 4)
if (localLastOctet % 4 === 0 || localLastOctet % 4 === 3) continue;
// Проверяем, что Remote IP не является сетевым адресом (кратен 4) или broadcast (остаток 3 при делении на 4)
if (remoteLastOctet % 4 === 0 || remoteLastOctet % 4 === 3) continue;
// Проверяем, что IP входят в диапазон пула и отличаются
if (!isIpInCidr(localIp, cidr)) continue;
if (localIp === remoteIp) continue;