From 6c4753e9ad33edf2171b5e30ea2a1a5d13d0ed2f Mon Sep 17 00:00:00 2001 From: Fovway Date: Sun, 26 Oct 2025 06:50:17 +0700 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20=D0=9E=D0=B1=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=BB=D0=B5=D0=BD=D0=B0=20=D0=BE=D0=B1=D1=80=D0=B0=D0=B1=D0=BE?= =?UTF-8?q?=D1=82=D0=BA=D0=B0=20IP-=D0=B0=D0=B4=D1=80=D0=B5=D1=81=D0=BE?= =?UTF-8?q?=D0=B2=20=D0=B8=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE=D0=B9?= =?UTF-8?q?=D0=BA=D0=B8=20=D0=B4=D0=BE=D0=B2=D0=B5=D1=80=D0=B5=D0=BD=D0=BD?= =?UTF-8?q?=D1=8B=D1=85=20=D0=BF=D1=80=D0=BE=D0=BA=D1=81=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Упрощена настройка trust proxy для работы с nginx proxy manager. - Оптимизирована функция получения IP-адреса клиента с учетом локальных адресов и заголовков прокси. - Удалено избыточное логирование и улучшена обработка IPv6 адресов. --- server.js | 57 ++++++++++--------------------------------------------- 1 file changed, 10 insertions(+), 47 deletions(-) diff --git a/server.js b/server.js index b4221de..4907f9b 100644 --- a/server.js +++ b/server.js @@ -15,14 +15,8 @@ const app = express(); const PORT = process.env.PORT || 3000; // Настройка trust proxy для правильного получения IP адресов через прокси -// Доверяем localhost и стандартной Docker bridge сети -app.set("trust proxy", [ - "127.0.0.1", - "::1", - "172.17.0.0/16", - "10.0.0.0/8", - "192.168.0.0/16", -]); +// Доверяем nginx proxy manager (обычно работает на localhost) +app.set("trust proxy", ["127.0.0.1", "::1", "::ffff:127.0.0.1"]); // Создаем директорию для аватарок, если её нет const uploadsDir = path.join(__dirname, "public", "uploads"); @@ -302,37 +296,17 @@ function logAction(userId, actionType, details, ipAddress) { // Функция для получения IP-адреса клиента function getClientIP(req) { - // Для отладки логируем все релевантные заголовки и IP адреса - const debugInfo = { - "req.ip": req.ip, - "req.connection.remoteAddress": req.connection?.remoteAddress, - "x-forwarded-for": req.headers["x-forwarded-for"], - "x-real-ip": req.headers["x-real-ip"], - "x-client-ip": req.headers["x-client-ip"], - "cf-connecting-ip": req.headers["cf-connecting-ip"], - }; - console.log("IP Debug info:", JSON.stringify(debugInfo, null, 2)); - // Используем встроенный в Express метод req.ip, который учитывает trust proxy let ip = req.ip; - // Если req.ip вернул undefined или является локальным/Docker адресом, пробуем другие варианты - if ( - !ip || - ip === "127.0.0.1" || - ip === "::1" || - ip === "172.17.0.1" || - ip.startsWith("172.17.") || - ip.startsWith("10.") || - ip.startsWith("192.168.") - ) { + // Если req.ip является локальным адресом, пробуем получить из заголовков + if (!ip || ip === "127.0.0.1" || ip === "::1" || ip === "::ffff:127.0.0.1") { // Проверяем заголовки прокси по приоритету ip = req.headers["x-forwarded-for"]?.split(",")[0].trim() || req.headers["x-real-ip"] || req.headers["x-client-ip"] || req.headers["cf-connecting-ip"] || // Для Cloudflare - req.headers["x-cluster-client-ip"] || // Для кластеров req.connection?.remoteAddress || req.socket?.remoteAddress || req.connection?.socket?.remoteAddress || @@ -344,38 +318,27 @@ function getClientIP(req) { // Убираем скобки IPv6 ip = ip.replace(/[[\]]/g, ""); - // Проверяем, является ли это IPv6 адресом + // Обрабатываем IPv6 адреса if (ip.includes("::")) { - // Это IPv6 адрес (содержит "::" или несколько ":") - // IPv6 адреса могут быть в формате [::1]:port или ::1 const ipv6Match = ip.match(/^(\[)?([^\]]+)(\])?(:(\d+))?$/); if (ipv6Match) { - ip = ipv6Match[2]; // Берем IPv6 адрес без скобок и порта + ip = ipv6Match[2]; } - } else if (ip.includes(":") && !ip.includes(".")) { - // IPv6 адрес без "::" но с несколькими ":" - // Например, 2001:db8::1 - // Оставляем как есть } else if (ip.includes(":")) { - // IPv4 с портом (например, 192.168.1.1:3000) + // IPv4 с портом const parts = ip.split(":"); if (parts.length === 2 && /^\d+$/.test(parts[1])) { ip = parts[0]; } } - // IPv4 без порта оставляем как есть } - // Конвертируем IPv6 localhost в IPv4 для лучшей читаемости - if (ip === "::1") { + // Конвертируем IPv6 localhost в IPv4 + if (ip === "::1" || ip === "::ffff:127.0.0.1") { ip = "127.0.0.1"; } - // Финальный IP для логов - const finalIP = ip || "unknown"; - console.log(`Final IP for logging: ${finalIP}`); - - return finalIP; + return ip || "unknown"; } // Миграции базы данных