fix(leak_check): eliminate false leak alarms, strip technical jargon, and optimize listener probe
This commit is contained in:
+2145
-2137
File diff suppressed because it is too large
Load Diff
+2094
-2089
File diff suppressed because it is too large
Load Diff
@@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: TACHYON\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-09-11 22:54+0300\n"
|
||||
"PO-Revision-Date: 2026-09-11 22:54+0300\n"
|
||||
"POT-Creation-Date: 2026-09-12 17:21+0300\n"
|
||||
"PO-Revision-Date: 2026-09-12 17:21+0300\n"
|
||||
"Last-Translator: Dushnilin\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: ru\n"
|
||||
@@ -26,6 +26,9 @@ msgstr "Списки .lst"
|
||||
msgid "(provider default)"
|
||||
msgstr "(по умолчанию провайдера)"
|
||||
|
||||
msgid "(this rule, when active)"
|
||||
msgstr "(эта же секция, при активном VPN)"
|
||||
|
||||
msgid "+ add"
|
||||
msgstr "+ добавить"
|
||||
|
||||
@@ -53,12 +56,6 @@ msgstr "⚠️ Бенчмарк завершен. Не найдено рабоч
|
||||
msgid "⚠️ Benchmark stopped"
|
||||
msgstr "⚠️ Бенчмарк остановлен"
|
||||
|
||||
msgid "⚠️ CRITICAL IP LEAK: Your real public IP is exposed through the proxy outbound!"
|
||||
msgstr "⚠️ КРИТИЧЕСКАЯ УТЕЧКА IP: Ваш реальный публичный IP раскрыт через исходящий прокси!"
|
||||
|
||||
msgid "⚠️ DNS LEAK DETECTED: DNS queries are leaking to your local Internet Service Provider!"
|
||||
msgstr "⚠️ ОБНАРУЖЕНА УТЕЧКА DNS: DNS-запросы утекают к вашему местному интернет-провайдеру!"
|
||||
|
||||
msgid "⚠️ If all Bootstrap DNS fail 3 times, queries will be sent to your ISP's DNS in plaintext. Only use as a last resort to prevent complete internet loss."
|
||||
msgstr "⚠️ Если все Bootstrap DNS завершатся с ошибкой 3 раза, запросы будут отправлены в DNS вашего провайдера в открытом виде. Используйте только в крайнем случае для предотвращения полной потери интернета."
|
||||
|
||||
@@ -170,18 +167,15 @@ msgstr "🛑 Остановить бенчмарк"
|
||||
msgid "🛠️ My Custom Strategies Only"
|
||||
msgstr "🛠️ Только мои стратегии"
|
||||
|
||||
msgid "🛡️ SECURE: No DNS leaks detected. All queries resolve through non-ISP upstream resolvers."
|
||||
msgstr "🛡️ ЗАЩИЩЕНО: Утечек DNS не обнаружено. Все запросы обрабатываются независимыми резолверами."
|
||||
msgid "🛡️ SECURE: All DNS queries are resolved through independent secure DNS servers."
|
||||
msgstr "🛡️ ЗАЩИЩЕНО: Все DNS-запросы разрешаются через независимые защищённые DNS-серверы."
|
||||
|
||||
msgid "🛡️ SECURE: No IP leak detected. Real WAN IP is concealed behind proxy outbound."
|
||||
msgstr "🛡️ ЗАЩИЩЕНО: Утечек IP не обнаружено. Реальный WAN IP скрыт за исходящим прокси."
|
||||
msgid "🛡️ SECURE: Public IP is concealed behind the proxy outbound."
|
||||
msgstr "🛡️ ЗАЩИЩЕНО: Публичный IP-адрес скрыт за исходящим прокси."
|
||||
|
||||
msgid "🟣 Twitch Suite (Live Stream + HLS CDN)"
|
||||
msgstr "🟣 Twitch (Прямой эфир + HLS CDN)"
|
||||
|
||||
msgid "127.0.0.1:4534 (sing-box mixed)"
|
||||
msgstr "127.0.0.1:4534 (смешанный sing-box)"
|
||||
|
||||
msgid "Accept external proxy connections and route them with sing-box."
|
||||
msgstr "Принимать внешние прокси-подключения и маршрутизировать их через sing-box."
|
||||
|
||||
@@ -683,9 +677,6 @@ msgstr "Ср. задержка"
|
||||
msgid "Backend validation failed: %s"
|
||||
msgstr "Ошибка проверки бэкенда: %s"
|
||||
|
||||
msgid "Baseline"
|
||||
msgstr "Базовый уровень"
|
||||
|
||||
msgid "Basic connectivity"
|
||||
msgstr "Базовая связность"
|
||||
|
||||
@@ -848,9 +839,6 @@ msgstr "Стратегия ByeDPI"
|
||||
msgid "ByeDPI strategy cannot be empty"
|
||||
msgstr "Стратегия ByeDPI не может быть пустой"
|
||||
|
||||
msgid "Bypasses proxy (SO_MARK 0x08000000)"
|
||||
msgstr "В обход прокси (SO_MARK 0x08000000)"
|
||||
|
||||
msgid "Bypasses UDP traffic for selected game consoles (PS5/Xbox) to achieve NAT Type 1 / 2 (Full Cone NAT) for P2P matchmaking, while keeping TCP (PSN/Auth) routed through the proxy."
|
||||
msgstr "Обходит UDP-трафик для выбранных игровых консолей (PS5/Xbox) для достижения NAT Type 1 / 2 (Full Cone NAT) для P2P-матчмейкинга, сохраняя TCP (PSN/Auth) через прокси."
|
||||
|
||||
@@ -1193,9 +1181,6 @@ msgstr "Текущий диагноз"
|
||||
msgid "Current section cannot be used as its own transit section"
|
||||
msgstr "Текущая секция не может использоваться как собственная транзитная секция"
|
||||
|
||||
msgid "Current section cannot download its own subscription"
|
||||
msgstr "Текущая секция не может загружать собственную подписку"
|
||||
|
||||
msgid "Currently unavailable"
|
||||
msgstr "Временно недоступно"
|
||||
|
||||
@@ -1337,12 +1322,21 @@ msgstr "DHCP содержит DNS сервер"
|
||||
msgid "DHCP is managed manually"
|
||||
msgstr "DHCP управляется вручную"
|
||||
|
||||
msgid "Diagnostic check completed"
|
||||
msgstr "Диагностическая проверка завершена"
|
||||
|
||||
msgid "Diagnostic check failed to complete"
|
||||
msgstr "Не удалось завершить диагностическую проверку"
|
||||
|
||||
msgid "Diagnostics"
|
||||
msgstr "Диагностика"
|
||||
|
||||
msgid "Direct"
|
||||
msgstr "Напрямую"
|
||||
|
||||
msgid "DIRECT"
|
||||
msgstr "ПРЯМОЙ (WAN)"
|
||||
|
||||
msgid "Direct (Default)"
|
||||
msgstr "Прямое (по умолчанию)"
|
||||
|
||||
@@ -1352,6 +1346,9 @@ msgstr "Прямой WAN"
|
||||
msgid "Direct connection"
|
||||
msgstr "Прямое подключение"
|
||||
|
||||
msgid "Direct connection via ISP"
|
||||
msgstr "Прямое подключение через провайдера"
|
||||
|
||||
msgid "Direct Proxy"
|
||||
msgstr "Прямой прокси"
|
||||
|
||||
@@ -1481,8 +1478,8 @@ msgstr "Быстрый DNS-кэш"
|
||||
msgid "DNS Unavailability Timeout"
|
||||
msgstr "Таймаут недоступности DNS"
|
||||
|
||||
msgid "DNS Upstream Resolver Analysis (bash.ws protocol)"
|
||||
msgstr "Анализ восходящих DNS-резолверов (протокол bash.ws)"
|
||||
msgid "DNS Upstream Resolver Analysis"
|
||||
msgstr "Анализ вышестоящих DNS-резолверов"
|
||||
|
||||
msgid "DNS: Resolved %s to %s"
|
||||
msgstr "DNS: Разрешено %s в %s"
|
||||
@@ -1586,9 +1583,6 @@ msgstr "Скачивать эту подписку без проверки се
|
||||
msgid "Download through"
|
||||
msgstr "Загружать через"
|
||||
|
||||
msgid "(this rule, when active)"
|
||||
msgstr "(эта же секция, при активном VPN)"
|
||||
|
||||
msgid "Downloaded"
|
||||
msgstr "Загружено"
|
||||
|
||||
@@ -2387,6 +2381,12 @@ msgstr "HTTP хосты"
|
||||
msgid "HWID"
|
||||
msgstr "HWID"
|
||||
|
||||
msgid "ℹ️ Direct connection (WAN): Public IP matches your ISP. Under selective routing (by domains or blocklists), unblocked resources bypass the proxy — this is standard operation."
|
||||
msgstr "ℹ️ Прямое подключение (WAN): Публичный IP совпадает с провайдером. При выборочной маршрутизации (по доменам или спискам блокировок) незаблокированные ресурсы идут напрямую — это штатный режим работы."
|
||||
|
||||
msgid "ℹ️ ISP DNS detected: DNS queries are handled by your local Internet Service Provider. If you use selective routing, this is standard behavior for direct connections."
|
||||
msgstr "ℹ️ Обнаружен DNS провайдера: DNS-запросы обрабатываются вашим интернет-провайдером. При выборочной маршрутизации это стандартное поведение для прямого трафика."
|
||||
|
||||
msgid "Idle timeout"
|
||||
msgstr "Таймаут простоя"
|
||||
|
||||
@@ -2414,6 +2414,9 @@ msgstr "Импортировать группы URLTest подписки"
|
||||
msgid "Import URLTest groups returned by this subscription provider"
|
||||
msgstr "Импортировать группы URLTest, возвращённые этим провайдером подписки"
|
||||
|
||||
msgid "INACTIVE"
|
||||
msgstr "НЕАКТИВЕН"
|
||||
|
||||
msgid "Inbound JSON"
|
||||
msgstr "Inbound JSON"
|
||||
|
||||
@@ -2810,8 +2813,8 @@ msgstr "Изолировать локальную сеть"
|
||||
msgid "ISP / Organization"
|
||||
msgstr "Провайдер / Организация"
|
||||
|
||||
msgid "ISP DNS LEAK"
|
||||
msgstr "УТЕЧКА DNS К ПРОВАЙДЕРУ"
|
||||
msgid "ISP DNS"
|
||||
msgstr "DNS ПРОВАЙДЕРА"
|
||||
|
||||
msgid "Issues"
|
||||
msgstr "Проблемы"
|
||||
@@ -2939,15 +2942,6 @@ msgstr "Установлена последняя версия"
|
||||
msgid "Latest version:"
|
||||
msgstr "Последняя версия:"
|
||||
|
||||
msgid "Leak detection completed"
|
||||
msgstr "Проверка утечек завершена"
|
||||
|
||||
msgid "Leak detection failed to complete"
|
||||
msgstr "Не удалось завершить проверку утечек"
|
||||
|
||||
msgid "LEAKED"
|
||||
msgstr "УТЕЧКА"
|
||||
|
||||
msgid "Leave empty to omit this header"
|
||||
msgstr "Оставьте пустым, чтобы пропустить этот заголовок"
|
||||
|
||||
@@ -3287,8 +3281,8 @@ msgstr "DHCP-клиенты не обнаружены"
|
||||
msgid "No diagnostic history available yet."
|
||||
msgstr "История проверок пока пуста."
|
||||
|
||||
msgid "No DNS resolvers captured via proxy test. Proxy may be offline or blocking test subdomains."
|
||||
msgstr "В тесте через прокси резолверы не зафиксированы. Возможно, прокси не работает или блокирует тестовые поддомены."
|
||||
msgid "No DNS resolvers captured through proxy (proxy is offline or test domain is not intercepted)."
|
||||
msgstr "DNS-резолверы через прокси не зафиксированы (прокси выключен либо тестовый домен не перехватывается)."
|
||||
|
||||
msgid "No DNS resolvers recorded"
|
||||
msgstr "DNS-резолверы не зафиксированы"
|
||||
@@ -3425,9 +3419,6 @@ msgstr "Пароль обфускации"
|
||||
msgid "Observed Public IP"
|
||||
msgstr "Внешний публичный IP"
|
||||
|
||||
msgid "OFFLINE"
|
||||
msgstr "ОФЛАЙН"
|
||||
|
||||
msgid "OlcRTC Crypto Key"
|
||||
msgstr "Ключ шифрования OlcRTC"
|
||||
|
||||
@@ -3656,9 +3647,6 @@ msgstr "Ожидает запуска"
|
||||
msgid "Pending..."
|
||||
msgstr "Ожидание..."
|
||||
|
||||
msgid "Performs simultaneous outbound checks via direct WAN (bypassing Sing-box redirect) and via proxy (127.0.0.1:4534) to verify that your real IP and DNS queries are not leaking to your ISP."
|
||||
msgstr "Выполняет одновременные исходящие запросы напрямую в WAN (в обход правил Sing-box) и через прокси (127.0.0.1:4534), проверяя, что ваш реальный IP и DNS-запросы не утекают провайдеру."
|
||||
|
||||
msgid "Periodically check the current level and switch to a faster server even when the current one works."
|
||||
msgstr "Периодически проверять текущий уровень и переключаться на более быстрый сервер, даже если текущий работает."
|
||||
|
||||
@@ -3842,15 +3830,15 @@ msgstr "Интервал проверки здоровья прокси (с)"
|
||||
msgid "Proxy Health Check URL"
|
||||
msgstr "URL проверки здоровья прокси"
|
||||
|
||||
msgid "Proxy is offline or unreachable on 127.0.0.1:4534."
|
||||
msgstr "Прокси выключен или недоступен на 127.0.0.1:4534."
|
||||
|
||||
msgid "Proxy link is unavailable"
|
||||
msgstr "Ссылка прокси недоступна"
|
||||
|
||||
msgid "Proxy Outbound"
|
||||
msgstr "Исходящий прокси (туннель)"
|
||||
|
||||
msgid "Proxy outbound is inactive or not configured for local testing."
|
||||
msgstr "Исходящий прокси неактивен или не настроен для локального тестирования."
|
||||
|
||||
msgid "Proxy Section for Bot"
|
||||
msgstr "Секция прокси для бота"
|
||||
|
||||
@@ -3869,8 +3857,8 @@ msgstr "Изоляция публичного IP-адреса"
|
||||
msgid "QR code is too large"
|
||||
msgstr "QR-код слишком большой"
|
||||
|
||||
msgid "Querying WAN direct socket and proxy outbound on 127.0.0.1:4534..."
|
||||
msgstr "Опрос прямого WAN-сокета и исходящего прокси на 127.0.0.1:4534..."
|
||||
msgid "Querying direct connection and proxy outbound..."
|
||||
msgstr "Опрос прямого подключения и исходящего прокси..."
|
||||
|
||||
msgid "QUIC (HTTP/3)"
|
||||
msgstr "QUIC (HTTP/3)"
|
||||
@@ -4589,6 +4577,9 @@ msgstr "Не удалось показать конфигурацию sing-box"
|
||||
msgid "Show subscription metadata for this source on the dashboard"
|
||||
msgstr "Показывать метаданные подписки для этого источника на дашборде"
|
||||
|
||||
msgid "Simultaneous check of your public IP address and upstream DNS resolvers to verify network visibility through direct connection and proxy."
|
||||
msgstr "Одновременная проверка внешнего IP-адреса и вышестоящих DNS-резолверов для проверки сетевой видимости через прямое подключение и прокси."
|
||||
|
||||
msgid "sing-box"
|
||||
msgstr "sing-box"
|
||||
|
||||
@@ -4925,6 +4916,9 @@ msgstr "Tachyon управляет жизненным циклом процес
|
||||
msgid "Tachyon manages the nfqws2 process lifecycle itself, so daemon mode is not allowed here."
|
||||
msgstr "Tachyon управляет жизненным циклом процесса nfqws2 самостоятельно, поэтому режим daemon здесь не допускается."
|
||||
|
||||
msgid "Tachyon proxy routing"
|
||||
msgstr "Маршрутизация через прокси Tachyon"
|
||||
|
||||
msgid "Tachyon service is stopped. Start the service to display connections."
|
||||
msgstr "Служба Tachyon остановлена. Запустите сервис для отображения подключений."
|
||||
|
||||
@@ -5078,12 +5072,12 @@ msgstr "Проверка всех секций..."
|
||||
msgid "Testing bypass strategies in isolated sandbox..."
|
||||
msgstr "Тестирование стратегий обхода в изолированной песочнице..."
|
||||
|
||||
msgid "Testing DNS leak upstream resolvers with bash.ws protocol..."
|
||||
msgstr "Тестирование восходящих DNS-резолверов по протоколу bash.ws..."
|
||||
|
||||
msgid "Testing strategy"
|
||||
msgstr "Тестирование стратегии"
|
||||
|
||||
msgid "Testing upstream DNS resolvers..."
|
||||
msgstr "Тестирование вышестоящих DNS-резолверов..."
|
||||
|
||||
msgid "Testing URL"
|
||||
msgstr "URL проверки"
|
||||
|
||||
@@ -5825,6 +5819,63 @@ msgstr "Правила маршрутизации sing-box для Zapret2 нас
|
||||
msgid "Zapret2 sing-box route rules are not configured"
|
||||
msgstr "Правила маршрутизации sing-box для Zapret2 не настроены"
|
||||
|
||||
msgid "⚠️ CRITICAL IP LEAK: Your real public IP is exposed through the proxy outbound!"
|
||||
msgstr "⚠️ КРИТИЧЕСКАЯ УТЕЧКА IP: Ваш реальный публичный IP раскрыт через исходящий прокси!"
|
||||
|
||||
msgid "⚠️ DNS LEAK DETECTED: DNS queries are leaking to your local Internet Service Provider!"
|
||||
msgstr "⚠️ ОБНАРУЖЕНА УТЕЧКА DNS: DNS-запросы утекают к вашему местному интернет-провайдеру!"
|
||||
|
||||
msgid "🛡️ SECURE: No DNS leaks detected. All queries resolve through non-ISP upstream resolvers."
|
||||
msgstr "🛡️ ЗАЩИЩЕНО: Утечек DNS не обнаружено. Все запросы обрабатываются независимыми резолверами."
|
||||
|
||||
msgid "🛡️ SECURE: No IP leak detected. Real WAN IP is concealed behind proxy outbound."
|
||||
msgstr "🛡️ ЗАЩИЩЕНО: Утечек IP не обнаружено. Реальный WAN IP скрыт за исходящим прокси."
|
||||
|
||||
msgid "127.0.0.1:4534 (sing-box mixed)"
|
||||
msgstr "127.0.0.1:4534 (смешанный sing-box)"
|
||||
|
||||
msgid "Baseline"
|
||||
msgstr "Базовый уровень"
|
||||
|
||||
msgid "Bypasses proxy (SO_MARK 0x08000000)"
|
||||
msgstr "В обход прокси (SO_MARK 0x08000000)"
|
||||
|
||||
msgid "Current section cannot download its own subscription"
|
||||
msgstr "Текущая секция не может загружать собственную подписку"
|
||||
|
||||
msgid "DNS Upstream Resolver Analysis (bash.ws protocol)"
|
||||
msgstr "Анализ восходящих DNS-резолверов (протокол bash.ws)"
|
||||
|
||||
msgid "ISP DNS LEAK"
|
||||
msgstr "УТЕЧКА DNS К ПРОВАЙДЕРУ"
|
||||
|
||||
msgid "Leak detection completed"
|
||||
msgstr "Проверка утечек завершена"
|
||||
|
||||
msgid "Leak detection failed to complete"
|
||||
msgstr "Не удалось завершить проверку утечек"
|
||||
|
||||
msgid "LEAKED"
|
||||
msgstr "УТЕЧКА"
|
||||
|
||||
msgid "No DNS resolvers captured via proxy test. Proxy may be offline or blocking test subdomains."
|
||||
msgstr "В тесте через прокси резолверы не зафиксированы. Возможно, прокси не работает или блокирует тестовые поддомены."
|
||||
|
||||
msgid "OFFLINE"
|
||||
msgstr "ОФЛАЙН"
|
||||
|
||||
msgid "Performs simultaneous outbound checks via direct WAN (bypassing Sing-box redirect) and via proxy (127.0.0.1:4534) to verify that your real IP and DNS queries are not leaking to your ISP."
|
||||
msgstr "Выполняет одновременные исходящие запросы напрямую в WAN (в обход правил Sing-box) и через прокси (127.0.0.1:4534), проверяя, что ваш реальный IP и DNS-запросы не утекают провайдеру."
|
||||
|
||||
msgid "Proxy is offline or unreachable on 127.0.0.1:4534."
|
||||
msgstr "Прокси выключен или недоступен на 127.0.0.1:4534."
|
||||
|
||||
msgid "Querying WAN direct socket and proxy outbound on 127.0.0.1:4534..."
|
||||
msgstr "Опрос прямого WAN-сокета и исходящего прокси на 127.0.0.1:4534..."
|
||||
|
||||
msgid "Testing DNS leak upstream resolvers with bash.ws protocol..."
|
||||
msgstr "Тестирование восходящих DNS-резолверов по протоколу bash.ws..."
|
||||
|
||||
msgid "Блокировка по IP (Таймаут TCP SYN)"
|
||||
msgstr "Блокировка по IP (Таймаут TCP SYN)"
|
||||
|
||||
|
||||
@@ -41,7 +41,7 @@ export function renderLeakCheckModal() {
|
||||
progressContainer.style.display = 'block';
|
||||
progressBar.style.width = '30%';
|
||||
statusLabel.textContent = _(
|
||||
'Querying WAN direct socket and proxy outbound on 127.0.0.1:4534...',
|
||||
'Querying direct connection and proxy outbound...',
|
||||
);
|
||||
|
||||
if (retryBtn) (retryBtn as HTMLButtonElement).disabled = true;
|
||||
@@ -49,9 +49,7 @@ export function renderLeakCheckModal() {
|
||||
// Advance progress smoothly
|
||||
const timer = setTimeout(() => {
|
||||
progressBar.style.width = '70%';
|
||||
statusLabel.textContent = _(
|
||||
'Testing DNS leak upstream resolvers with bash.ws protocol...',
|
||||
);
|
||||
statusLabel.textContent = _('Testing upstream DNS resolvers...');
|
||||
}, 1500);
|
||||
|
||||
try {
|
||||
@@ -60,12 +58,10 @@ export function renderLeakCheckModal() {
|
||||
clearTimeout(timer);
|
||||
progressBar.style.width = `${progress}%`;
|
||||
if (stage === 'dns') {
|
||||
statusLabel.textContent = _(
|
||||
'Testing DNS leak upstream resolvers with bash.ws protocol...',
|
||||
);
|
||||
statusLabel.textContent = _('Testing upstream DNS resolvers...');
|
||||
} else if (stage === 'ip') {
|
||||
statusLabel.textContent = _(
|
||||
'Querying WAN direct socket and proxy outbound on 127.0.0.1:4534...',
|
||||
'Querying direct connection and proxy outbound...',
|
||||
);
|
||||
}
|
||||
},
|
||||
@@ -74,7 +70,7 @@ export function renderLeakCheckModal() {
|
||||
progressBar.style.width = '100%';
|
||||
|
||||
if (response.success && response.data) {
|
||||
statusLabel.textContent = _('Leak detection completed');
|
||||
statusLabel.textContent = _('Diagnostic check completed');
|
||||
setTimeout(() => {
|
||||
progressContainer.style.display = 'none';
|
||||
progressBar.style.width = '0%';
|
||||
@@ -85,7 +81,7 @@ export function renderLeakCheckModal() {
|
||||
const err =
|
||||
!response.success && response.error
|
||||
? response.error
|
||||
: _('Leak detection failed to complete');
|
||||
: _('Diagnostic check failed to complete');
|
||||
progressContainer.style.display = 'none';
|
||||
statusLabel.textContent = err;
|
||||
resultsContainer.innerHTML = '';
|
||||
@@ -125,21 +121,23 @@ export function renderLeakCheckModal() {
|
||||
const { ip_leak, dns_leak } = data;
|
||||
|
||||
// --- 1. IP Leak Section ---
|
||||
const isDirectRouting =
|
||||
ip_leak.proxy_online &&
|
||||
(ip_leak.leaked || ip_leak.direct_ip === ip_leak.proxy_ip);
|
||||
|
||||
const ipAlertClass = !ip_leak.proxy_online
|
||||
? 'alert-message warning'
|
||||
: ip_leak.leaked
|
||||
? 'alert-message danger'
|
||||
? 'alert-message info'
|
||||
: isDirectRouting
|
||||
? 'alert-message info'
|
||||
: 'alert-message success';
|
||||
|
||||
const ipAlertText = !ip_leak.proxy_online
|
||||
? _('Proxy is offline or unreachable on 127.0.0.1:4534.')
|
||||
: ip_leak.leaked
|
||||
? _('Proxy outbound is inactive or not configured for local testing.')
|
||||
: isDirectRouting
|
||||
? _(
|
||||
'⚠️ CRITICAL IP LEAK: Your real public IP is exposed through the proxy outbound!',
|
||||
'ℹ️ Direct connection (WAN): Public IP matches your ISP. Under selective routing (by domains or blocklists), unblocked resources bypass the proxy — this is standard operation.',
|
||||
)
|
||||
: _(
|
||||
'🛡️ SECURE: No IP leak detected. Real WAN IP is concealed behind proxy outbound.',
|
||||
);
|
||||
: _('🛡️ SECURE: Public IP is concealed behind the proxy outbound.');
|
||||
|
||||
const ipTable = E(
|
||||
'table',
|
||||
@@ -167,7 +165,7 @@ export function renderLeakCheckModal() {
|
||||
style:
|
||||
'font-size: 11px; color: var(--text-color-medium, #6c757d);',
|
||||
},
|
||||
_('Bypasses proxy (SO_MARK 0x08000000)'),
|
||||
_('Direct connection via ISP'),
|
||||
),
|
||||
]),
|
||||
E('td', { class: 'td' }, [E('code', {}, ip_leak.direct_ip || '—')]),
|
||||
@@ -187,7 +185,7 @@ export function renderLeakCheckModal() {
|
||||
style:
|
||||
'background: var(--text-color-medium, #6c757d); color: #fff; padding: 2px 6px; border-radius: 4px; font-size: 11px;',
|
||||
},
|
||||
_('Baseline'),
|
||||
_('WAN'),
|
||||
),
|
||||
]),
|
||||
]),
|
||||
@@ -200,7 +198,7 @@ export function renderLeakCheckModal() {
|
||||
style:
|
||||
'font-size: 11px; color: var(--text-color-medium, #6c757d);',
|
||||
},
|
||||
_('127.0.0.1:4534 (sing-box mixed)'),
|
||||
_('Tachyon proxy routing'),
|
||||
),
|
||||
]),
|
||||
E('td', { class: 'td' }, [E('code', {}, ip_leak.proxy_ip || '—')]),
|
||||
@@ -219,19 +217,19 @@ export function renderLeakCheckModal() {
|
||||
{
|
||||
class: 'badge',
|
||||
style:
|
||||
'background: #fd7e14; color: #fff; padding: 2px 6px; border-radius: 4px; font-size: 11px;',
|
||||
'background: #6c757d; color: #fff; padding: 2px 6px; border-radius: 4px; font-size: 11px;',
|
||||
},
|
||||
_('OFFLINE'),
|
||||
_('INACTIVE'),
|
||||
)
|
||||
: ip_leak.leaked
|
||||
: isDirectRouting
|
||||
? E(
|
||||
'span',
|
||||
{
|
||||
class: 'badge',
|
||||
style:
|
||||
'background: #dc3545; color: #fff; padding: 2px 6px; border-radius: 4px; font-size: 11px;',
|
||||
'background: #17a2b8; color: #fff; padding: 2px 6px; border-radius: 4px; font-size: 11px;',
|
||||
},
|
||||
_('LEAKED'),
|
||||
_('DIRECT'),
|
||||
)
|
||||
: E(
|
||||
'span',
|
||||
@@ -268,23 +266,25 @@ export function renderLeakCheckModal() {
|
||||
);
|
||||
|
||||
// --- 2. DNS Leak Section ---
|
||||
const dnsAlertClass = dns_leak.dns_leaked
|
||||
? 'alert-message danger'
|
||||
: dns_leak.dns_servers.length > 0
|
||||
? 'alert-message success'
|
||||
: 'alert-message info';
|
||||
const dnsAlertClass =
|
||||
!dns_leak.proxy_online || (dns_leak.dns_servers || []).length === 0
|
||||
? 'alert-message info'
|
||||
: dns_leak.dns_leaked
|
||||
? 'alert-message warning'
|
||||
: 'alert-message success';
|
||||
|
||||
const dnsAlertText = dns_leak.dns_leaked
|
||||
? _(
|
||||
'⚠️ DNS LEAK DETECTED: DNS queries are leaking to your local Internet Service Provider!',
|
||||
)
|
||||
: dns_leak.dns_servers.length > 0
|
||||
const dnsAlertText =
|
||||
!dns_leak.proxy_online || (dns_leak.dns_servers || []).length === 0
|
||||
? _(
|
||||
'🛡️ SECURE: No DNS leaks detected. All queries resolve through non-ISP upstream resolvers.',
|
||||
'No DNS resolvers captured through proxy (proxy is offline or test domain is not intercepted).',
|
||||
)
|
||||
: _(
|
||||
'No DNS resolvers captured via proxy test. Proxy may be offline or blocking test subdomains.',
|
||||
);
|
||||
: dns_leak.dns_leaked
|
||||
? _(
|
||||
'ℹ️ ISP DNS detected: DNS queries are handled by your local Internet Service Provider. If you use selective routing, this is standard behavior for direct connections.',
|
||||
)
|
||||
: _(
|
||||
'🛡️ SECURE: All DNS queries are resolved through independent secure DNS servers.',
|
||||
);
|
||||
|
||||
const dnsTableRows = (dns_leak.dns_servers || []).map((s) =>
|
||||
E('tr', { class: 'tr cbi-section-table-row' }, [
|
||||
@@ -298,9 +298,9 @@ export function renderLeakCheckModal() {
|
||||
{
|
||||
class: 'badge',
|
||||
style:
|
||||
'background: #dc3545; color: #fff; padding: 2px 6px; border-radius: 4px; font-size: 11px;',
|
||||
'background: #fd7e14; color: #fff; padding: 2px 6px; border-radius: 4px; font-size: 11px;',
|
||||
},
|
||||
_('ISP DNS LEAK'),
|
||||
_('ISP DNS'),
|
||||
)
|
||||
: E(
|
||||
'span',
|
||||
@@ -366,7 +366,7 @@ export function renderLeakCheckModal() {
|
||||
[
|
||||
E('h4', { style: 'margin-top: 0; margin-bottom: 8px;' }, [
|
||||
'🔍 ',
|
||||
_('DNS Upstream Resolver Analysis (bash.ws protocol)'),
|
||||
_('DNS Upstream Resolver Analysis'),
|
||||
]),
|
||||
E('div', { class: dnsAlertClass, style: 'margin-bottom: 12px;' }, [
|
||||
dnsAlertText,
|
||||
@@ -403,7 +403,7 @@ export function renderLeakCheckModal() {
|
||||
'font-size: 13px; color: var(--text-color-medium, #6c757d); margin-bottom: 14px;',
|
||||
},
|
||||
_(
|
||||
'Performs simultaneous outbound checks via direct WAN (bypassing Sing-box redirect) and via proxy (127.0.0.1:4534) to verify that your real IP and DNS queries are not leaking to your ISP.',
|
||||
'Simultaneous check of your public IP address and upstream DNS resolvers to verify network visibility through direct connection and proxy.',
|
||||
),
|
||||
),
|
||||
statusLabel,
|
||||
|
||||
@@ -15359,14 +15359,12 @@ function renderLeakCheckModal() {
|
||||
progressContainer.style.display = "block";
|
||||
progressBar.style.width = "30%";
|
||||
statusLabel.textContent = _(
|
||||
"Querying WAN direct socket and proxy outbound on 127.0.0.1:4534..."
|
||||
"Querying direct connection and proxy outbound..."
|
||||
);
|
||||
if (retryBtn) retryBtn.disabled = true;
|
||||
const timer = setTimeout(() => {
|
||||
progressBar.style.width = "70%";
|
||||
statusLabel.textContent = _(
|
||||
"Testing DNS leak upstream resolvers with bash.ws protocol..."
|
||||
);
|
||||
statusLabel.textContent = _("Testing upstream DNS resolvers...");
|
||||
}, 1500);
|
||||
try {
|
||||
const response = await TachyonShellMethods.leakCheck(
|
||||
@@ -15374,12 +15372,10 @@ function renderLeakCheckModal() {
|
||||
clearTimeout(timer);
|
||||
progressBar.style.width = `${progress}%`;
|
||||
if (stage === "dns") {
|
||||
statusLabel.textContent = _(
|
||||
"Testing DNS leak upstream resolvers with bash.ws protocol..."
|
||||
);
|
||||
statusLabel.textContent = _("Testing upstream DNS resolvers...");
|
||||
} else if (stage === "ip") {
|
||||
statusLabel.textContent = _(
|
||||
"Querying WAN direct socket and proxy outbound on 127.0.0.1:4534..."
|
||||
"Querying direct connection and proxy outbound..."
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -15387,14 +15383,14 @@ function renderLeakCheckModal() {
|
||||
clearTimeout(timer);
|
||||
progressBar.style.width = "100%";
|
||||
if (response.success && response.data) {
|
||||
statusLabel.textContent = _("Leak detection completed");
|
||||
statusLabel.textContent = _("Diagnostic check completed");
|
||||
setTimeout(() => {
|
||||
progressContainer.style.display = "none";
|
||||
progressBar.style.width = "0%";
|
||||
}, 400);
|
||||
renderResults(response.data);
|
||||
} else {
|
||||
const err = !response.success && response.error ? response.error : _("Leak detection failed to complete");
|
||||
const err = !response.success && response.error ? response.error : _("Diagnostic check failed to complete");
|
||||
progressContainer.style.display = "none";
|
||||
statusLabel.textContent = err;
|
||||
resultsContainer.innerHTML = "";
|
||||
@@ -15430,12 +15426,11 @@ function renderLeakCheckModal() {
|
||||
const renderResults = (data) => {
|
||||
resultsContainer.innerHTML = "";
|
||||
const { ip_leak, dns_leak } = data;
|
||||
const ipAlertClass = !ip_leak.proxy_online ? "alert-message warning" : ip_leak.leaked ? "alert-message danger" : "alert-message success";
|
||||
const ipAlertText = !ip_leak.proxy_online ? _("Proxy is offline or unreachable on 127.0.0.1:4534.") : ip_leak.leaked ? _(
|
||||
"⚠️ CRITICAL IP LEAK: Your real public IP is exposed through the proxy outbound!"
|
||||
) : _(
|
||||
"🛡️ SECURE: No IP leak detected. Real WAN IP is concealed behind proxy outbound."
|
||||
);
|
||||
const isDirectRouting = ip_leak.proxy_online && (ip_leak.leaked || ip_leak.direct_ip === ip_leak.proxy_ip);
|
||||
const ipAlertClass = !ip_leak.proxy_online ? "alert-message info" : isDirectRouting ? "alert-message info" : "alert-message success";
|
||||
const ipAlertText = !ip_leak.proxy_online ? _("Proxy outbound is inactive or not configured for local testing.") : isDirectRouting ? _(
|
||||
"ℹ️ Direct connection (WAN): Public IP matches your ISP. Under selective routing (by domains or blocklists), unblocked resources bypass the proxy — this is standard operation."
|
||||
) : _("🛡️ SECURE: Public IP is concealed behind the proxy outbound.");
|
||||
const ipTable = E(
|
||||
"table",
|
||||
{
|
||||
@@ -15461,7 +15456,7 @@ function renderLeakCheckModal() {
|
||||
{
|
||||
style: "font-size: 11px; color: var(--text-color-medium, #6c757d);"
|
||||
},
|
||||
_("Bypasses proxy (SO_MARK 0x08000000)")
|
||||
_("Direct connection via ISP")
|
||||
)
|
||||
]),
|
||||
E("td", { class: "td" }, [E("code", {}, ip_leak.direct_ip || "—")]),
|
||||
@@ -15478,7 +15473,7 @@ function renderLeakCheckModal() {
|
||||
class: "badge",
|
||||
style: "background: var(--text-color-medium, #6c757d); color: #fff; padding: 2px 6px; border-radius: 4px; font-size: 11px;"
|
||||
},
|
||||
_("Baseline")
|
||||
_("WAN")
|
||||
)
|
||||
])
|
||||
]),
|
||||
@@ -15490,7 +15485,7 @@ function renderLeakCheckModal() {
|
||||
{
|
||||
style: "font-size: 11px; color: var(--text-color-medium, #6c757d);"
|
||||
},
|
||||
_("127.0.0.1:4534 (sing-box mixed)")
|
||||
_("Tachyon proxy routing")
|
||||
)
|
||||
]),
|
||||
E("td", { class: "td" }, [E("code", {}, ip_leak.proxy_ip || "—")]),
|
||||
@@ -15505,16 +15500,16 @@ function renderLeakCheckModal() {
|
||||
"span",
|
||||
{
|
||||
class: "badge",
|
||||
style: "background: #fd7e14; color: #fff; padding: 2px 6px; border-radius: 4px; font-size: 11px;"
|
||||
style: "background: #6c757d; color: #fff; padding: 2px 6px; border-radius: 4px; font-size: 11px;"
|
||||
},
|
||||
_("OFFLINE")
|
||||
) : ip_leak.leaked ? E(
|
||||
_("INACTIVE")
|
||||
) : isDirectRouting ? E(
|
||||
"span",
|
||||
{
|
||||
class: "badge",
|
||||
style: "background: #dc3545; color: #fff; padding: 2px 6px; border-radius: 4px; font-size: 11px;"
|
||||
style: "background: #17a2b8; color: #fff; padding: 2px 6px; border-radius: 4px; font-size: 11px;"
|
||||
},
|
||||
_("LEAKED")
|
||||
_("DIRECT")
|
||||
) : E(
|
||||
"span",
|
||||
{
|
||||
@@ -15545,13 +15540,13 @@ function renderLeakCheckModal() {
|
||||
ipTable
|
||||
]
|
||||
);
|
||||
const dnsAlertClass = dns_leak.dns_leaked ? "alert-message danger" : dns_leak.dns_servers.length > 0 ? "alert-message success" : "alert-message info";
|
||||
const dnsAlertText = dns_leak.dns_leaked ? _(
|
||||
"⚠️ DNS LEAK DETECTED: DNS queries are leaking to your local Internet Service Provider!"
|
||||
) : dns_leak.dns_servers.length > 0 ? _(
|
||||
"🛡️ SECURE: No DNS leaks detected. All queries resolve through non-ISP upstream resolvers."
|
||||
const dnsAlertClass = !dns_leak.proxy_online || (dns_leak.dns_servers || []).length === 0 ? "alert-message info" : dns_leak.dns_leaked ? "alert-message warning" : "alert-message success";
|
||||
const dnsAlertText = !dns_leak.proxy_online || (dns_leak.dns_servers || []).length === 0 ? _(
|
||||
"No DNS resolvers captured through proxy (proxy is offline or test domain is not intercepted)."
|
||||
) : dns_leak.dns_leaked ? _(
|
||||
"ℹ️ ISP DNS detected: DNS queries are handled by your local Internet Service Provider. If you use selective routing, this is standard behavior for direct connections."
|
||||
) : _(
|
||||
"No DNS resolvers captured via proxy test. Proxy may be offline or blocking test subdomains."
|
||||
"🛡️ SECURE: All DNS queries are resolved through independent secure DNS servers."
|
||||
);
|
||||
const dnsTableRows = (dns_leak.dns_servers || []).map(
|
||||
(s) => E("tr", { class: "tr cbi-section-table-row" }, [
|
||||
@@ -15563,9 +15558,9 @@ function renderLeakCheckModal() {
|
||||
"span",
|
||||
{
|
||||
class: "badge",
|
||||
style: "background: #dc3545; color: #fff; padding: 2px 6px; border-radius: 4px; font-size: 11px;"
|
||||
style: "background: #fd7e14; color: #fff; padding: 2px 6px; border-radius: 4px; font-size: 11px;"
|
||||
},
|
||||
_("ISP DNS LEAK")
|
||||
_("ISP DNS")
|
||||
) : E(
|
||||
"span",
|
||||
{
|
||||
@@ -15624,7 +15619,7 @@ function renderLeakCheckModal() {
|
||||
[
|
||||
E("h4", { style: "margin-top: 0; margin-bottom: 8px;" }, [
|
||||
"🔍 ",
|
||||
_("DNS Upstream Resolver Analysis (bash.ws protocol)")
|
||||
_("DNS Upstream Resolver Analysis")
|
||||
]),
|
||||
E("div", { class: dnsAlertClass, style: "margin-bottom: 12px;" }, [
|
||||
dnsAlertText
|
||||
@@ -15656,7 +15651,7 @@ function renderLeakCheckModal() {
|
||||
style: "font-size: 13px; color: var(--text-color-medium, #6c757d); margin-bottom: 14px;"
|
||||
},
|
||||
_(
|
||||
"Performs simultaneous outbound checks via direct WAN (bypassing Sing-box redirect) and via proxy (127.0.0.1:4534) to verify that your real IP and DNS queries are not leaking to your ISP."
|
||||
"Simultaneous check of your public IP address and upstream DNS resolvers to verify network visibility through direct connection and proxy."
|
||||
)
|
||||
),
|
||||
statusLabel,
|
||||
|
||||
@@ -7,8 +7,8 @@ msgid ""
|
||||
msgstr ""
|
||||
"Project-Id-Version: TACHYON\n"
|
||||
"Report-Msgid-Bugs-To: \n"
|
||||
"POT-Creation-Date: 2026-09-11 22:54+0300\n"
|
||||
"PO-Revision-Date: 2026-09-11 22:54+0300\n"
|
||||
"POT-Creation-Date: 2026-09-12 17:21+0300\n"
|
||||
"PO-Revision-Date: 2026-09-12 17:21+0300\n"
|
||||
"Last-Translator: Dushnilin\n"
|
||||
"Language-Team: none\n"
|
||||
"Language: ru\n"
|
||||
@@ -26,6 +26,9 @@ msgstr "Списки .lst"
|
||||
msgid "(provider default)"
|
||||
msgstr "(по умолчанию провайдера)"
|
||||
|
||||
msgid "(this rule, when active)"
|
||||
msgstr "(эта же секция, при активном VPN)"
|
||||
|
||||
msgid "+ add"
|
||||
msgstr "+ добавить"
|
||||
|
||||
@@ -53,12 +56,6 @@ msgstr "⚠️ Бенчмарк завершен. Не найдено рабоч
|
||||
msgid "⚠️ Benchmark stopped"
|
||||
msgstr "⚠️ Бенчмарк остановлен"
|
||||
|
||||
msgid "⚠️ CRITICAL IP LEAK: Your real public IP is exposed through the proxy outbound!"
|
||||
msgstr "⚠️ КРИТИЧЕСКАЯ УТЕЧКА IP: Ваш реальный публичный IP раскрыт через исходящий прокси!"
|
||||
|
||||
msgid "⚠️ DNS LEAK DETECTED: DNS queries are leaking to your local Internet Service Provider!"
|
||||
msgstr "⚠️ ОБНАРУЖЕНА УТЕЧКА DNS: DNS-запросы утекают к вашему местному интернет-провайдеру!"
|
||||
|
||||
msgid "⚠️ If all Bootstrap DNS fail 3 times, queries will be sent to your ISP's DNS in plaintext. Only use as a last resort to prevent complete internet loss."
|
||||
msgstr "⚠️ Если все Bootstrap DNS завершатся с ошибкой 3 раза, запросы будут отправлены в DNS вашего провайдера в открытом виде. Используйте только в крайнем случае для предотвращения полной потери интернета."
|
||||
|
||||
@@ -170,18 +167,15 @@ msgstr "🛑 Остановить бенчмарк"
|
||||
msgid "🛠️ My Custom Strategies Only"
|
||||
msgstr "🛠️ Только мои стратегии"
|
||||
|
||||
msgid "🛡️ SECURE: No DNS leaks detected. All queries resolve through non-ISP upstream resolvers."
|
||||
msgstr "🛡️ ЗАЩИЩЕНО: Утечек DNS не обнаружено. Все запросы обрабатываются независимыми резолверами."
|
||||
msgid "🛡️ SECURE: All DNS queries are resolved through independent secure DNS servers."
|
||||
msgstr "🛡️ ЗАЩИЩЕНО: Все DNS-запросы разрешаются через независимые защищённые DNS-серверы."
|
||||
|
||||
msgid "🛡️ SECURE: No IP leak detected. Real WAN IP is concealed behind proxy outbound."
|
||||
msgstr "🛡️ ЗАЩИЩЕНО: Утечек IP не обнаружено. Реальный WAN IP скрыт за исходящим прокси."
|
||||
msgid "🛡️ SECURE: Public IP is concealed behind the proxy outbound."
|
||||
msgstr "🛡️ ЗАЩИЩЕНО: Публичный IP-адрес скрыт за исходящим прокси."
|
||||
|
||||
msgid "🟣 Twitch Suite (Live Stream + HLS CDN)"
|
||||
msgstr "🟣 Twitch (Прямой эфир + HLS CDN)"
|
||||
|
||||
msgid "127.0.0.1:4534 (sing-box mixed)"
|
||||
msgstr "127.0.0.1:4534 (смешанный sing-box)"
|
||||
|
||||
msgid "Accept external proxy connections and route them with sing-box."
|
||||
msgstr "Принимать внешние прокси-подключения и маршрутизировать их через sing-box."
|
||||
|
||||
@@ -683,9 +677,6 @@ msgstr "Ср. задержка"
|
||||
msgid "Backend validation failed: %s"
|
||||
msgstr "Ошибка проверки бэкенда: %s"
|
||||
|
||||
msgid "Baseline"
|
||||
msgstr "Базовый уровень"
|
||||
|
||||
msgid "Basic connectivity"
|
||||
msgstr "Базовая связность"
|
||||
|
||||
@@ -848,9 +839,6 @@ msgstr "Стратегия ByeDPI"
|
||||
msgid "ByeDPI strategy cannot be empty"
|
||||
msgstr "Стратегия ByeDPI не может быть пустой"
|
||||
|
||||
msgid "Bypasses proxy (SO_MARK 0x08000000)"
|
||||
msgstr "В обход прокси (SO_MARK 0x08000000)"
|
||||
|
||||
msgid "Bypasses UDP traffic for selected game consoles (PS5/Xbox) to achieve NAT Type 1 / 2 (Full Cone NAT) for P2P matchmaking, while keeping TCP (PSN/Auth) routed through the proxy."
|
||||
msgstr "Обходит UDP-трафик для выбранных игровых консолей (PS5/Xbox) для достижения NAT Type 1 / 2 (Full Cone NAT) для P2P-матчмейкинга, сохраняя TCP (PSN/Auth) через прокси."
|
||||
|
||||
@@ -1193,9 +1181,6 @@ msgstr "Текущий диагноз"
|
||||
msgid "Current section cannot be used as its own transit section"
|
||||
msgstr "Текущая секция не может использоваться как собственная транзитная секция"
|
||||
|
||||
msgid "Current section cannot download its own subscription"
|
||||
msgstr "Текущая секция не может загружать собственную подписку"
|
||||
|
||||
msgid "Currently unavailable"
|
||||
msgstr "Временно недоступно"
|
||||
|
||||
@@ -1337,12 +1322,21 @@ msgstr "DHCP содержит DNS сервер"
|
||||
msgid "DHCP is managed manually"
|
||||
msgstr "DHCP управляется вручную"
|
||||
|
||||
msgid "Diagnostic check completed"
|
||||
msgstr "Диагностическая проверка завершена"
|
||||
|
||||
msgid "Diagnostic check failed to complete"
|
||||
msgstr "Не удалось завершить диагностическую проверку"
|
||||
|
||||
msgid "Diagnostics"
|
||||
msgstr "Диагностика"
|
||||
|
||||
msgid "Direct"
|
||||
msgstr "Напрямую"
|
||||
|
||||
msgid "DIRECT"
|
||||
msgstr "ПРЯМОЙ (WAN)"
|
||||
|
||||
msgid "Direct (Default)"
|
||||
msgstr "Прямое (по умолчанию)"
|
||||
|
||||
@@ -1352,6 +1346,9 @@ msgstr "Прямой WAN"
|
||||
msgid "Direct connection"
|
||||
msgstr "Прямое подключение"
|
||||
|
||||
msgid "Direct connection via ISP"
|
||||
msgstr "Прямое подключение через провайдера"
|
||||
|
||||
msgid "Direct Proxy"
|
||||
msgstr "Прямой прокси"
|
||||
|
||||
@@ -1481,8 +1478,8 @@ msgstr "Быстрый DNS-кэш"
|
||||
msgid "DNS Unavailability Timeout"
|
||||
msgstr "Таймаут недоступности DNS"
|
||||
|
||||
msgid "DNS Upstream Resolver Analysis (bash.ws protocol)"
|
||||
msgstr "Анализ восходящих DNS-резолверов (протокол bash.ws)"
|
||||
msgid "DNS Upstream Resolver Analysis"
|
||||
msgstr "Анализ вышестоящих DNS-резолверов"
|
||||
|
||||
msgid "DNS: Resolved %s to %s"
|
||||
msgstr "DNS: Разрешено %s в %s"
|
||||
@@ -1586,9 +1583,6 @@ msgstr "Скачивать эту подписку без проверки се
|
||||
msgid "Download through"
|
||||
msgstr "Загружать через"
|
||||
|
||||
msgid "(this rule, when active)"
|
||||
msgstr "(эта же секция, при активном VPN)"
|
||||
|
||||
msgid "Downloaded"
|
||||
msgstr "Загружено"
|
||||
|
||||
@@ -2387,6 +2381,12 @@ msgstr "HTTP хосты"
|
||||
msgid "HWID"
|
||||
msgstr "HWID"
|
||||
|
||||
msgid "ℹ️ Direct connection (WAN): Public IP matches your ISP. Under selective routing (by domains or blocklists), unblocked resources bypass the proxy — this is standard operation."
|
||||
msgstr "ℹ️ Прямое подключение (WAN): Публичный IP совпадает с провайдером. При выборочной маршрутизации (по доменам или спискам блокировок) незаблокированные ресурсы идут напрямую — это штатный режим работы."
|
||||
|
||||
msgid "ℹ️ ISP DNS detected: DNS queries are handled by your local Internet Service Provider. If you use selective routing, this is standard behavior for direct connections."
|
||||
msgstr "ℹ️ Обнаружен DNS провайдера: DNS-запросы обрабатываются вашим интернет-провайдером. При выборочной маршрутизации это стандартное поведение для прямого трафика."
|
||||
|
||||
msgid "Idle timeout"
|
||||
msgstr "Таймаут простоя"
|
||||
|
||||
@@ -2414,6 +2414,9 @@ msgstr "Импортировать группы URLTest подписки"
|
||||
msgid "Import URLTest groups returned by this subscription provider"
|
||||
msgstr "Импортировать группы URLTest, возвращённые этим провайдером подписки"
|
||||
|
||||
msgid "INACTIVE"
|
||||
msgstr "НЕАКТИВЕН"
|
||||
|
||||
msgid "Inbound JSON"
|
||||
msgstr "Inbound JSON"
|
||||
|
||||
@@ -2810,8 +2813,8 @@ msgstr "Изолировать локальную сеть"
|
||||
msgid "ISP / Organization"
|
||||
msgstr "Провайдер / Организация"
|
||||
|
||||
msgid "ISP DNS LEAK"
|
||||
msgstr "УТЕЧКА DNS К ПРОВАЙДЕРУ"
|
||||
msgid "ISP DNS"
|
||||
msgstr "DNS ПРОВАЙДЕРА"
|
||||
|
||||
msgid "Issues"
|
||||
msgstr "Проблемы"
|
||||
@@ -2939,15 +2942,6 @@ msgstr "Установлена последняя версия"
|
||||
msgid "Latest version:"
|
||||
msgstr "Последняя версия:"
|
||||
|
||||
msgid "Leak detection completed"
|
||||
msgstr "Проверка утечек завершена"
|
||||
|
||||
msgid "Leak detection failed to complete"
|
||||
msgstr "Не удалось завершить проверку утечек"
|
||||
|
||||
msgid "LEAKED"
|
||||
msgstr "УТЕЧКА"
|
||||
|
||||
msgid "Leave empty to omit this header"
|
||||
msgstr "Оставьте пустым, чтобы пропустить этот заголовок"
|
||||
|
||||
@@ -3287,8 +3281,8 @@ msgstr "DHCP-клиенты не обнаружены"
|
||||
msgid "No diagnostic history available yet."
|
||||
msgstr "История проверок пока пуста."
|
||||
|
||||
msgid "No DNS resolvers captured via proxy test. Proxy may be offline or blocking test subdomains."
|
||||
msgstr "В тесте через прокси резолверы не зафиксированы. Возможно, прокси не работает или блокирует тестовые поддомены."
|
||||
msgid "No DNS resolvers captured through proxy (proxy is offline or test domain is not intercepted)."
|
||||
msgstr "DNS-резолверы через прокси не зафиксированы (прокси выключен либо тестовый домен не перехватывается)."
|
||||
|
||||
msgid "No DNS resolvers recorded"
|
||||
msgstr "DNS-резолверы не зафиксированы"
|
||||
@@ -3425,9 +3419,6 @@ msgstr "Пароль обфускации"
|
||||
msgid "Observed Public IP"
|
||||
msgstr "Внешний публичный IP"
|
||||
|
||||
msgid "OFFLINE"
|
||||
msgstr "ОФЛАЙН"
|
||||
|
||||
msgid "OlcRTC Crypto Key"
|
||||
msgstr "Ключ шифрования OlcRTC"
|
||||
|
||||
@@ -3656,9 +3647,6 @@ msgstr "Ожидает запуска"
|
||||
msgid "Pending..."
|
||||
msgstr "Ожидание..."
|
||||
|
||||
msgid "Performs simultaneous outbound checks via direct WAN (bypassing Sing-box redirect) and via proxy (127.0.0.1:4534) to verify that your real IP and DNS queries are not leaking to your ISP."
|
||||
msgstr "Выполняет одновременные исходящие запросы напрямую в WAN (в обход правил Sing-box) и через прокси (127.0.0.1:4534), проверяя, что ваш реальный IP и DNS-запросы не утекают провайдеру."
|
||||
|
||||
msgid "Periodically check the current level and switch to a faster server even when the current one works."
|
||||
msgstr "Периодически проверять текущий уровень и переключаться на более быстрый сервер, даже если текущий работает."
|
||||
|
||||
@@ -3842,15 +3830,15 @@ msgstr "Интервал проверки здоровья прокси (с)"
|
||||
msgid "Proxy Health Check URL"
|
||||
msgstr "URL проверки здоровья прокси"
|
||||
|
||||
msgid "Proxy is offline or unreachable on 127.0.0.1:4534."
|
||||
msgstr "Прокси выключен или недоступен на 127.0.0.1:4534."
|
||||
|
||||
msgid "Proxy link is unavailable"
|
||||
msgstr "Ссылка прокси недоступна"
|
||||
|
||||
msgid "Proxy Outbound"
|
||||
msgstr "Исходящий прокси (туннель)"
|
||||
|
||||
msgid "Proxy outbound is inactive or not configured for local testing."
|
||||
msgstr "Исходящий прокси неактивен или не настроен для локального тестирования."
|
||||
|
||||
msgid "Proxy Section for Bot"
|
||||
msgstr "Секция прокси для бота"
|
||||
|
||||
@@ -3869,8 +3857,8 @@ msgstr "Изоляция публичного IP-адреса"
|
||||
msgid "QR code is too large"
|
||||
msgstr "QR-код слишком большой"
|
||||
|
||||
msgid "Querying WAN direct socket and proxy outbound on 127.0.0.1:4534..."
|
||||
msgstr "Опрос прямого WAN-сокета и исходящего прокси на 127.0.0.1:4534..."
|
||||
msgid "Querying direct connection and proxy outbound..."
|
||||
msgstr "Опрос прямого подключения и исходящего прокси..."
|
||||
|
||||
msgid "QUIC (HTTP/3)"
|
||||
msgstr "QUIC (HTTP/3)"
|
||||
@@ -4589,6 +4577,9 @@ msgstr "Не удалось показать конфигурацию sing-box"
|
||||
msgid "Show subscription metadata for this source on the dashboard"
|
||||
msgstr "Показывать метаданные подписки для этого источника на дашборде"
|
||||
|
||||
msgid "Simultaneous check of your public IP address and upstream DNS resolvers to verify network visibility through direct connection and proxy."
|
||||
msgstr "Одновременная проверка внешнего IP-адреса и вышестоящих DNS-резолверов для проверки сетевой видимости через прямое подключение и прокси."
|
||||
|
||||
msgid "sing-box"
|
||||
msgstr "sing-box"
|
||||
|
||||
@@ -4925,6 +4916,9 @@ msgstr "Tachyon управляет жизненным циклом процес
|
||||
msgid "Tachyon manages the nfqws2 process lifecycle itself, so daemon mode is not allowed here."
|
||||
msgstr "Tachyon управляет жизненным циклом процесса nfqws2 самостоятельно, поэтому режим daemon здесь не допускается."
|
||||
|
||||
msgid "Tachyon proxy routing"
|
||||
msgstr "Маршрутизация через прокси Tachyon"
|
||||
|
||||
msgid "Tachyon service is stopped. Start the service to display connections."
|
||||
msgstr "Служба Tachyon остановлена. Запустите сервис для отображения подключений."
|
||||
|
||||
@@ -5078,12 +5072,12 @@ msgstr "Проверка всех секций..."
|
||||
msgid "Testing bypass strategies in isolated sandbox..."
|
||||
msgstr "Тестирование стратегий обхода в изолированной песочнице..."
|
||||
|
||||
msgid "Testing DNS leak upstream resolvers with bash.ws protocol..."
|
||||
msgstr "Тестирование восходящих DNS-резолверов по протоколу bash.ws..."
|
||||
|
||||
msgid "Testing strategy"
|
||||
msgstr "Тестирование стратегии"
|
||||
|
||||
msgid "Testing upstream DNS resolvers..."
|
||||
msgstr "Тестирование вышестоящих DNS-резолверов..."
|
||||
|
||||
msgid "Testing URL"
|
||||
msgstr "URL проверки"
|
||||
|
||||
@@ -5825,6 +5819,63 @@ msgstr "Правила маршрутизации sing-box для Zapret2 нас
|
||||
msgid "Zapret2 sing-box route rules are not configured"
|
||||
msgstr "Правила маршрутизации sing-box для Zapret2 не настроены"
|
||||
|
||||
msgid "⚠️ CRITICAL IP LEAK: Your real public IP is exposed through the proxy outbound!"
|
||||
msgstr "⚠️ КРИТИЧЕСКАЯ УТЕЧКА IP: Ваш реальный публичный IP раскрыт через исходящий прокси!"
|
||||
|
||||
msgid "⚠️ DNS LEAK DETECTED: DNS queries are leaking to your local Internet Service Provider!"
|
||||
msgstr "⚠️ ОБНАРУЖЕНА УТЕЧКА DNS: DNS-запросы утекают к вашему местному интернет-провайдеру!"
|
||||
|
||||
msgid "🛡️ SECURE: No DNS leaks detected. All queries resolve through non-ISP upstream resolvers."
|
||||
msgstr "🛡️ ЗАЩИЩЕНО: Утечек DNS не обнаружено. Все запросы обрабатываются независимыми резолверами."
|
||||
|
||||
msgid "🛡️ SECURE: No IP leak detected. Real WAN IP is concealed behind proxy outbound."
|
||||
msgstr "🛡️ ЗАЩИЩЕНО: Утечек IP не обнаружено. Реальный WAN IP скрыт за исходящим прокси."
|
||||
|
||||
msgid "127.0.0.1:4534 (sing-box mixed)"
|
||||
msgstr "127.0.0.1:4534 (смешанный sing-box)"
|
||||
|
||||
msgid "Baseline"
|
||||
msgstr "Базовый уровень"
|
||||
|
||||
msgid "Bypasses proxy (SO_MARK 0x08000000)"
|
||||
msgstr "В обход прокси (SO_MARK 0x08000000)"
|
||||
|
||||
msgid "Current section cannot download its own subscription"
|
||||
msgstr "Текущая секция не может загружать собственную подписку"
|
||||
|
||||
msgid "DNS Upstream Resolver Analysis (bash.ws protocol)"
|
||||
msgstr "Анализ восходящих DNS-резолверов (протокол bash.ws)"
|
||||
|
||||
msgid "ISP DNS LEAK"
|
||||
msgstr "УТЕЧКА DNS К ПРОВАЙДЕРУ"
|
||||
|
||||
msgid "Leak detection completed"
|
||||
msgstr "Проверка утечек завершена"
|
||||
|
||||
msgid "Leak detection failed to complete"
|
||||
msgstr "Не удалось завершить проверку утечек"
|
||||
|
||||
msgid "LEAKED"
|
||||
msgstr "УТЕЧКА"
|
||||
|
||||
msgid "No DNS resolvers captured via proxy test. Proxy may be offline or blocking test subdomains."
|
||||
msgstr "В тесте через прокси резолверы не зафиксированы. Возможно, прокси не работает или блокирует тестовые поддомены."
|
||||
|
||||
msgid "OFFLINE"
|
||||
msgstr "ОФЛАЙН"
|
||||
|
||||
msgid "Performs simultaneous outbound checks via direct WAN (bypassing Sing-box redirect) and via proxy (127.0.0.1:4534) to verify that your real IP and DNS queries are not leaking to your ISP."
|
||||
msgstr "Выполняет одновременные исходящие запросы напрямую в WAN (в обход правил Sing-box) и через прокси (127.0.0.1:4534), проверяя, что ваш реальный IP и DNS-запросы не утекают провайдеру."
|
||||
|
||||
msgid "Proxy is offline or unreachable on 127.0.0.1:4534."
|
||||
msgstr "Прокси выключен или недоступен на 127.0.0.1:4534."
|
||||
|
||||
msgid "Querying WAN direct socket and proxy outbound on 127.0.0.1:4534..."
|
||||
msgstr "Опрос прямого WAN-сокета и исходящего прокси на 127.0.0.1:4534..."
|
||||
|
||||
msgid "Testing DNS leak upstream resolvers with bash.ws protocol..."
|
||||
msgstr "Тестирование восходящих DNS-резолверов по протоколу bash.ws..."
|
||||
|
||||
msgid "Блокировка по IP (Таймаут TCP SYN)"
|
||||
msgstr "Блокировка по IP (Таймаут TCP SYN)"
|
||||
|
||||
|
||||
+2097
-2089
File diff suppressed because it is too large
Load Diff
@@ -21,6 +21,47 @@ function curl_supports_so_mark() {
|
||||
return _has_so_mark_cached;
|
||||
}
|
||||
|
||||
function is_tcp_port_listening(port) {
|
||||
if (!port || int(port) <= 0)
|
||||
return false;
|
||||
let hex_port = sprintf(":%04X", int(port));
|
||||
for (let path in [ "/proc/net/tcp", "/proc/net/tcp6" ]) {
|
||||
let content = fs.readfile(path);
|
||||
if (content && index(content, hex_port) >= 0)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
const KNOWN_PUBLIC_DNS_PATTERNS = [
|
||||
"google", "cloudflare", "quad9", "opendns", "cisco", "adguard",
|
||||
"nextdns", "controld", "control d", "yandex", "level 3", "lumen",
|
||||
"centurylink", "dns.sb", "mullvad", "cleanbrowsing", "he.net"
|
||||
];
|
||||
|
||||
const KNOWN_PUBLIC_DNS_IPS = {
|
||||
"1.1.1.1": true, "1.0.0.1": true, "1.1.1.2": true, "1.0.0.2": true, "1.1.1.3": true, "1.0.0.3": true,
|
||||
"8.8.8.8": true, "8.8.4.4": true,
|
||||
"9.9.9.9": true, "149.112.112.112": true, "9.9.9.10": true, "149.112.112.10": true,
|
||||
"208.67.222.222": true, "208.67.220.220": true,
|
||||
"94.140.14.14": true, "94.140.15.15": true, "94.140.14.140": true, "94.140.14.141": true,
|
||||
"77.88.8.8": true, "77.88.8.1": true, "77.88.8.2": true, "77.88.8.3": true,
|
||||
"4.2.2.1": true, "4.2.2.2": true, "4.2.2.3": true, "4.2.2.4": true,
|
||||
"185.228.168.9": true, "185.228.169.9": true
|
||||
};
|
||||
|
||||
function is_public_dns_resolver(ip, name, asn) {
|
||||
if (ip && KNOWN_PUBLIC_DNS_IPS[ip])
|
||||
return true;
|
||||
let text = lc(as_string(name || "") + " " + as_string(asn || ""));
|
||||
for (let pat in KNOWN_PUBLIC_DNS_PATTERNS) {
|
||||
if (index(text, pat) >= 0)
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Detect active WAN network interface/device name.
|
||||
* Prioritizes actual routing table default gateway device (e.g. pppoe-wan, eth1, br-wan),
|
||||
@@ -225,39 +266,42 @@ function check_ip_leak(wan_iface, mixed_port) {
|
||||
|
||||
let direct = null;
|
||||
let proxy = null;
|
||||
let proxy_listening = is_tcp_port_listening(mixed_port);
|
||||
|
||||
if (work_dir != "") {
|
||||
let proxy_flag = "--proxy http://127.0.0.1:" + mixed_port;
|
||||
let direct_flags = get_direct_curl_flags(wan_iface);
|
||||
|
||||
let cmd_direct = sprintf("( curl -s -m 3 --connect-timeout 2 %s https://api.ip.sb/geoip || curl -s -m 3 --connect-timeout 2 %s https://ipwho.is/ || curl -s -m 2 --connect-timeout 2 %s 'https://api.ipify.org?format=json' || curl -s -m 2 --connect-timeout 2 %s https://cloudflare.com/cdn-cgi/trace ) > %s/direct.out 2>/dev/null", direct_flags, direct_flags, direct_flags, direct_flags, work_dir);
|
||||
let cmd_proxy = sprintf("( curl -s -m 3 --connect-timeout 2 %s https://api.ip.sb/geoip || curl -s -m 3 --connect-timeout 2 %s https://ipwho.is/ || curl -s -m 2 --connect-timeout 2 %s 'https://api.ipify.org?format=json' || curl -s -m 2 --connect-timeout 2 %s https://cloudflare.com/cdn-cgi/trace ) > %s/proxy.out 2>/dev/null", proxy_flag, proxy_flag, proxy_flag, proxy_flag, work_dir);
|
||||
|
||||
system(sprintf("{ %s & %s & wait; } 2>/dev/null", cmd_direct, cmd_proxy));
|
||||
if (proxy_listening) {
|
||||
let proxy_flag = "--proxy http://127.0.0.1:" + mixed_port;
|
||||
let cmd_proxy = sprintf("( curl -s -m 3 --connect-timeout 2 %s https://api.ip.sb/geoip || curl -s -m 3 --connect-timeout 2 %s https://ipwho.is/ || curl -s -m 2 --connect-timeout 2 %s 'https://api.ipify.org?format=json' || curl -s -m 2 --connect-timeout 2 %s https://cloudflare.com/cdn-cgi/trace ) > %s/proxy.out 2>/dev/null", proxy_flag, proxy_flag, proxy_flag, proxy_flag, work_dir);
|
||||
system(sprintf("{ %s & %s & wait; } 2>/dev/null", cmd_direct, cmd_proxy));
|
||||
let proxy_out = fs.readfile(work_dir + "/proxy.out");
|
||||
proxy = parse_ip_response(proxy_out);
|
||||
} else {
|
||||
system(sprintf("{ %s & wait; } 2>/dev/null", cmd_direct));
|
||||
proxy = { ip: "—", country: "", country_code: "", city: "", isp: "", ok: false };
|
||||
}
|
||||
|
||||
let direct_out = fs.readfile(work_dir + "/direct.out");
|
||||
let proxy_out = fs.readfile(work_dir + "/proxy.out");
|
||||
|
||||
direct = parse_ip_response(direct_out);
|
||||
proxy = parse_ip_response(proxy_out);
|
||||
|
||||
system(sprintf("rm -rf %s 2>/dev/null", shell_quote(work_dir)));
|
||||
}
|
||||
|
||||
if (direct == null)
|
||||
direct = fetch_ip_info(false, wan_iface, mixed_port);
|
||||
if (proxy == null)
|
||||
if (proxy == null && proxy_listening)
|
||||
proxy = fetch_ip_info(true, wan_iface, mixed_port);
|
||||
else if (proxy == null)
|
||||
proxy = { ip: "—", country: "", country_code: "", city: "", isp: "", ok: false };
|
||||
|
||||
let proxy_online = (proxy.ok && proxy.ip != "—");
|
||||
let leaked = false;
|
||||
|
||||
if (proxy_online && direct.ok && direct.ip != "—") {
|
||||
leaked = (proxy.ip == direct.ip);
|
||||
}
|
||||
let is_direct_routing = (proxy_online && direct.ok && direct.ip != "—" && proxy.ip == direct.ip);
|
||||
|
||||
return {
|
||||
leaked: leaked,
|
||||
leaked: is_direct_routing,
|
||||
direct_mode: is_direct_routing,
|
||||
direct_ip: direct.ip,
|
||||
direct_country: direct.country,
|
||||
direct_country_code: direct.country_code,
|
||||
@@ -372,8 +416,11 @@ function check_dns_leak(wan_iface, mixed_port, direct_ip, proxy_ip) {
|
||||
for (let pr in proxy_resolvers) {
|
||||
if (type(pr) != "object" || !pr.ip) continue;
|
||||
|
||||
let is_direct_leak = (direct_map[pr.ip] == true);
|
||||
if (is_direct_leak) {
|
||||
let is_public = is_public_dns_resolver(pr.ip, pr.name, pr.asn);
|
||||
let is_direct_leak = false;
|
||||
|
||||
if (!is_public && direct_map[pr.ip] == true) {
|
||||
is_direct_leak = true;
|
||||
leak_found = true;
|
||||
}
|
||||
|
||||
@@ -381,18 +428,21 @@ function check_dns_leak(wan_iface, mixed_port, direct_ip, proxy_ip) {
|
||||
ip: pr.ip,
|
||||
country: as_string(pr.country || pr.country_name || ""),
|
||||
isp: as_string(pr.name || pr.asn || "Unknown"),
|
||||
is_isp: is_direct_leak
|
||||
is_isp: is_direct_leak,
|
||||
is_public: is_public
|
||||
});
|
||||
}
|
||||
|
||||
let formatted_direct_servers = [];
|
||||
for (let dr in direct_resolvers) {
|
||||
if (type(dr) != "object" || !dr.ip) continue;
|
||||
let is_public = is_public_dns_resolver(dr.ip, dr.name, dr.asn);
|
||||
push(formatted_direct_servers, {
|
||||
ip: dr.ip,
|
||||
country: as_string(dr.country || dr.country_name || ""),
|
||||
isp: as_string(dr.name || dr.asn || "ISP Upstream"),
|
||||
is_isp: true
|
||||
is_isp: !is_public,
|
||||
is_public: is_public
|
||||
});
|
||||
}
|
||||
|
||||
@@ -406,15 +456,10 @@ function check_dns_leak(wan_iface, mixed_port, direct_ip, proxy_ip) {
|
||||
|
||||
if (proxy_online && length(formatted_proxy_servers) > 0) {
|
||||
dns_leaked = leak_found;
|
||||
} else if (proxy_online && length(formatted_proxy_servers) == 0) {
|
||||
} else {
|
||||
dns_leaked = false;
|
||||
}
|
||||
|
||||
// If proxy IP equals direct IP, then DNS is definitely not shielded
|
||||
if (proxy_ip != null && direct_ip != null && proxy_ip != "—" && direct_ip != "—" && proxy_ip == direct_ip) {
|
||||
dns_leaked = true;
|
||||
}
|
||||
|
||||
return {
|
||||
dns_leaked: dns_leaked,
|
||||
direct_ip: direct_ip || "—",
|
||||
@@ -558,8 +603,11 @@ function run_leak_check(wan_iface, mixed_port) {
|
||||
for (let pr in proxy_resolvers) {
|
||||
if (type(pr) != "object" || !pr.ip) continue;
|
||||
|
||||
let is_direct_leak = (direct_map[pr.ip] == true);
|
||||
if (is_direct_leak) {
|
||||
let is_public = is_public_dns_resolver(pr.ip, pr.name, pr.asn);
|
||||
let is_direct_leak = false;
|
||||
|
||||
if (!is_public && direct_map[pr.ip] == true) {
|
||||
is_direct_leak = true;
|
||||
leak_found = true;
|
||||
}
|
||||
|
||||
@@ -567,18 +615,21 @@ function run_leak_check(wan_iface, mixed_port) {
|
||||
ip: pr.ip,
|
||||
country: as_string(pr.country || pr.country_name || ""),
|
||||
isp: as_string(pr.name || pr.asn || "Unknown"),
|
||||
is_isp: is_direct_leak
|
||||
is_isp: is_direct_leak,
|
||||
is_public: is_public
|
||||
});
|
||||
}
|
||||
|
||||
let formatted_direct_servers = [];
|
||||
for (let dr in direct_resolvers) {
|
||||
if (type(dr) != "object" || !dr.ip) continue;
|
||||
let is_public = is_public_dns_resolver(dr.ip, dr.name, dr.asn);
|
||||
push(formatted_direct_servers, {
|
||||
ip: dr.ip,
|
||||
country: as_string(dr.country || dr.country_name || ""),
|
||||
isp: as_string(dr.name || dr.asn || "ISP Upstream"),
|
||||
is_isp: true
|
||||
is_isp: !is_public,
|
||||
is_public: is_public
|
||||
});
|
||||
}
|
||||
|
||||
@@ -586,19 +637,15 @@ function run_leak_check(wan_iface, mixed_port) {
|
||||
formatted_direct_servers = direct_dns_servers;
|
||||
}
|
||||
|
||||
let dns_proxy_online = (proxy_id != "" || (ip_res.proxy_ip != null && ip_res.proxy_ip != "" && ip_res.proxy_ip != "—"));
|
||||
let dns_proxy_online = (proxy_id != "" || (proxy_ip_info.ok && proxy_ip_info.ip != "—"));
|
||||
let dns_leaked = false;
|
||||
|
||||
if (dns_proxy_online && length(formatted_proxy_servers) > 0) {
|
||||
dns_leaked = leak_found;
|
||||
} else if (dns_proxy_online && length(formatted_proxy_servers) == 0) {
|
||||
} else {
|
||||
dns_leaked = false;
|
||||
}
|
||||
|
||||
if (ip_res.proxy_ip != null && ip_res.direct_ip != null && ip_res.proxy_ip != "—" && ip_res.direct_ip != "—" && ip_res.proxy_ip == ip_res.direct_ip) {
|
||||
dns_leaked = true;
|
||||
}
|
||||
|
||||
let dns_res = {
|
||||
dns_leaked: dns_leaked,
|
||||
direct_ip: ip_res.direct_ip,
|
||||
@@ -731,29 +778,31 @@ function print_cli_summary(res) {
|
||||
print(sprintf("Proxy Outbound: %s (%s, %s)\n", res.ip_leak.proxy_ip, res.ip_leak.proxy_country || "Unknown", res.ip_leak.proxy_org || "Proxy"));
|
||||
|
||||
if (res.ip_leak.proxy_online) {
|
||||
if (res.ip_leak.leaked) {
|
||||
print("IP Status : ❌ LEAK DETECTED (Direct and Proxy IP match!)\n");
|
||||
if (res.ip_leak.proxy_ip == res.ip_leak.direct_ip) {
|
||||
print("IP Status : ℹ️ DIRECT (WAN IP matches; normal under selective routing)\n");
|
||||
} else {
|
||||
print("IP Status : ✅ SECURE (Real WAN IP is hidden behind proxy)\n");
|
||||
print("IP Status : ✅ SECURE (Real WAN IP is concealed behind proxy)\n");
|
||||
}
|
||||
} else {
|
||||
print("IP Status : ⚪ Proxy is offline or unreachable\n");
|
||||
}
|
||||
|
||||
print("\n--- DNS Resolvers Detected ---\n");
|
||||
if (length(res.dns_leak.dns_servers) > 0) {
|
||||
if (res.dns_leak.proxy_online && length(res.dns_leak.dns_servers) > 0) {
|
||||
for (let s in res.dns_leak.dns_servers) {
|
||||
let flag = s.is_isp ? "❌ ISP LEAK" : "✅ SECURE";
|
||||
let flag = s.is_isp ? "⚠️ ISP DNS" : "✅ SECURE";
|
||||
print(sprintf(" [%s] %s (%s - %s)\n", flag, s.ip, s.country, s.isp));
|
||||
}
|
||||
} else {
|
||||
print(" (No proxy DNS queries recorded or proxy offline)\n");
|
||||
}
|
||||
|
||||
if (res.dns_leak.dns_leaked) {
|
||||
print("\nDNS Status : ❌ DNS LEAK DETECTED (Queries reach your local ISP!)\n\n");
|
||||
if (!res.dns_leak.proxy_online) {
|
||||
print("\nDNS Status : ⚪ Proxy offline (DNS check skipped)\n\n");
|
||||
} else if (res.dns_leak.dns_leaked) {
|
||||
print("\nDNS Status : ℹ️ ISP DNS (Queries handled by ISP; normal under split tunneling)\n\n");
|
||||
} else {
|
||||
print("\nDNS Status : ✅ SECURE (All DNS routed through encrypted/proxy resolvers)\n\n");
|
||||
print("\nDNS Status : ✅ SECURE (All DNS routed through secure/independent resolvers)\n\n");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -762,7 +811,7 @@ let mode = ARGV[0] || "";
|
||||
|
||||
if (mode == "leak-check" || mode == "leak_check") {
|
||||
let res = run_leak_check(null, null);
|
||||
if (ARGV[1] == "--pretty" || ARGV[1] == "-p") {
|
||||
if (ARGV[1] == "--pretty" || ARGV[1] == "-p" || ARGV[2] == "--pretty" || ARGV[2] == "-p") {
|
||||
print_cli_summary(res);
|
||||
} else {
|
||||
print(sprintf("%J\n", res));
|
||||
|
||||
Reference in New Issue
Block a user