fix(leak_check): eliminate false leak alarms, strip technical jargon, and optimize listener probe

This commit is contained in:
Dushnilin
2026-09-12 17:25:44 +03:00
parent 2019ddd12a
commit 0fe76b261a
8 changed files with 6716 additions and 6549 deletions
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
+107 -56
View File
@@ -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,
+107 -56
View File
@@ -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)"
File diff suppressed because it is too large Load Diff
+92 -43
View File
@@ -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));