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
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m43s
This commit is contained in:
@@ -996,22 +996,21 @@ 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 проверяем, что не используем сетевой адрес (базовый) и broadcast (базовый + 3)
|
// Для сетей /30 проверяем границы
|
||||||
// Для /30 используем только dVal + 1 и dVal + 2, что уже гарантировано формулой выше
|
|
||||||
// Дополнительно проверяем границы
|
|
||||||
if (prefix >= 30) {
|
if (prefix >= 30) {
|
||||||
if (dVal % 4 !== 0) continue; // Базовый адрес должен быть кратен 4
|
if (dVal % 4 !== 0) continue; // Базовый адрес должен быть кратен 4
|
||||||
if (dVal + 2 > 255) continue; // Проверяем, что remoteIp не превышает 255
|
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 входят в диапазон пула
|
// Проверяем, что IP входят в диапазон пула
|
||||||
if (!isIpInCidr(localIp, cidr)) continue;
|
if (!isIpInCidr(localIp, cidr)) continue;
|
||||||
if (!isIpInCidr(remoteIp, cidr)) continue;
|
if (!isIpInCidr(remoteIp, cidr)) continue;
|
||||||
@@ -1041,18 +1040,19 @@ function NetworkConfigManager() {
|
|||||||
const remoteIp = `${a}.${b}.${cVal}.${dVal + 2}`; // Remote IP = базовый + 2
|
const remoteIp = `${a}.${b}.${cVal}.${dVal + 2}`; // Remote IP = базовый + 2
|
||||||
|
|
||||||
// Для сетей /30 проверяем границы
|
// Для сетей /30 проверяем границы
|
||||||
// Для /30 dVal + 1 и dVal + 2 всегда валидны (не сетевой и не broadcast)
|
|
||||||
if (prefix >= 30) {
|
if (prefix >= 30) {
|
||||||
if (dVal + 2 > 255) continue; // Проверяем, что remoteIp не превышает 255
|
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 входят в диапазон пула и отличаются
|
// Проверяем, что IP входят в диапазон пула и отличаются
|
||||||
if (!isIpInCidr(localIp, cidr)) continue;
|
if (!isIpInCidr(localIp, cidr)) continue;
|
||||||
if (localIp === remoteIp) continue;
|
if (localIp === remoteIp) continue;
|
||||||
|
|||||||
Reference in New Issue
Block a user