fix(NetworkConfigManager): refine validation logic for /30 networks to ensure local IPs are correctly derived and within valid ranges, enhancing overall IP generation accuracy
Publish Fast Tabler Docker image / build-and-push-fast (push) Successful in 1m48s

This commit is contained in:
2026-01-24 00:32:51 +07:00
parent 4c9cb7eab6
commit 4ff9ae0f46
+18 -16
View File
@@ -864,6 +864,7 @@ function NetworkConfigManager() {
// Перебираем только базовые адреса сетей /30 (кратные 4) // Перебираем только базовые адреса сетей /30 (кратные 4)
for (let dVal = dStart; dVal <= dEndVal; dVal += 4) { for (let dVal = dStart; dVal <= dEndVal; dVal += 4) {
// Local IP = базовый + 1, Remote IP = базовый + 2 // Local IP = базовый + 1, Remote IP = базовый + 2
// НЕ используем базовый (dVal) и broadcast (dVal + 3)
const localIp = `${aVal}.${bVal}.${cVal}.${dVal + 1}`; const localIp = `${aVal}.${bVal}.${cVal}.${dVal + 1}`;
const remoteIp = `${aVal}.${bVal}.${cVal}.${dVal + 2}`; const remoteIp = `${aVal}.${bVal}.${cVal}.${dVal + 2}`;
@@ -918,6 +919,7 @@ function NetworkConfigManager() {
const localOffset = baseOctet - networkBase; const localOffset = baseOctet - networkBase;
// Для сетей /30 проверяем, что Local IP не является сетевым адресом или broadcast // Для сетей /30 проверяем, что Local IP не является сетевым адресом или broadcast
// Local IP должен быть базовый + 1 или базовый + 2
if (prefix >= 30) { if (prefix >= 30) {
const networkAddress = `${localIpParts[0]}.${localIpParts[1]}.${localIpParts[2]}.${networkBase}`; const networkAddress = `${localIpParts[0]}.${localIpParts[1]}.${localIpParts[2]}.${networkBase}`;
const broadcastAddress = `${localIpParts[0]}.${localIpParts[1]}.${localIpParts[2]}.${networkBase + 3}`; const broadcastAddress = `${localIpParts[0]}.${localIpParts[1]}.${localIpParts[2]}.${networkBase + 3}`;
@@ -925,15 +927,21 @@ function NetworkConfigManager() {
// Local IP является сетевым адресом или broadcast, не можем использовать // Local IP является сетевым адресом или broadcast, не можем использовать
return null; return null;
} }
// Проверяем, что Local IP находится в допустимом диапазоне (базовый + 1 или базовый + 2)
if (localOffset !== 1 && localOffset !== 2) {
// Local IP не в допустимом диапазоне для /30
return null;
}
} }
let remoteOffset; let remoteOffset;
if (localOffset === 1) { if (localOffset === 1) {
remoteOffset = 2; remoteOffset = 2; // Если Local IP = базовый + 1, то Remote IP = базовый + 2
} else if (localOffset === 2) { } else if (localOffset === 2) {
remoteOffset = 1; remoteOffset = 1; // Если Local IP = базовый + 2, то Remote IP = базовый + 1
} else { } else {
remoteOffset = localOffset === 0 ? 2 : (localOffset === 3 ? 1 : 2); // Если Local IP не в допустимом диапазоне, не можем сгенерировать парный Remote IP
return null;
} }
const remoteOctet = networkBase + remoteOffset; const remoteOctet = networkBase + remoteOffset;
@@ -989,16 +997,12 @@ function NetworkConfigManager() {
const remoteIp = `${a}.${b}.${c}.${dVal + 2}`; const remoteIp = `${a}.${b}.${c}.${dVal + 2}`;
// Для сетей /30 проверяем, что не используем сетевой адрес (базовый) и broadcast (базовый + 3) // Для сетей /30 проверяем, что не используем сетевой адрес (базовый) и broadcast (базовый + 3)
// Для /30 используем только dVal + 1 и dVal + 2, что уже гарантировано формулой выше
// Дополнительно проверяем границы
if (prefix >= 30) { if (prefix >= 30) {
const lastOctet = dVal % 4; if (dVal % 4 !== 0) continue; // Базовый адрес должен быть кратен 4
if (lastOctet !== 0) continue; // Базовый адрес должен быть кратен 4
if (dVal + 2 > 255) continue; // Проверяем, что remoteIp не превышает 255 if (dVal + 2 > 255) continue; // Проверяем, что remoteIp не превышает 255
// Проверяем, что не используем сетевой адрес (dVal) и broadcast (dVal + 3) // Для /30 dVal + 1 и dVal + 2 всегда валидны (не сетевой и не broadcast)
// Для /30 используем только dVal + 1 и dVal + 2
const networkAddress = `${a}.${b}.${c}.${dVal}`;
const broadcastAddress = `${a}.${b}.${c}.${dVal + 3}`;
if (localIp === networkAddress || localIp === broadcastAddress) continue;
if (remoteIp === networkAddress || remoteIp === broadcastAddress) continue;
} }
// Проверяем, что IP входят в диапазон пула // Проверяем, что IP входят в диапазон пула
@@ -1029,12 +1033,10 @@ function NetworkConfigManager() {
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
// Для сетей /30 проверяем, что не используем сетевой адрес (базовый) и broadcast (базовый + 3) // Для сетей /30 проверяем границы
// Для /30 dVal + 1 и dVal + 2 всегда валидны (не сетевой и не broadcast)
if (prefix >= 30) { if (prefix >= 30) {
const networkAddress = `${a}.${b}.${cVal}.${dVal}`; if (dVal + 2 > 255) continue; // Проверяем, что remoteIp не превышает 255
const broadcastAddress = `${a}.${b}.${cVal}.${dVal + 3}`;
if (localIp === networkAddress || localIp === broadcastAddress) continue;
if (remoteIp === networkAddress || remoteIp === broadcastAddress) continue;
} }
// Проверяем, что IP входят в диапазон пула и отличаются // Проверяем, что IP входят в диапазон пула и отличаются