К содержимому

Первое подключение через прокси с повторяемой проверкой

Подтвердите маршрут до проверки реального сервиса.

Настройте клиент, отправляющий запрос, и проверьте ответ вместе с маршрутом. В этом локальном упражнении curl получает конфигурацию через stdin без пароля в аргументах команды. Успешный запрос сравнивается с неверным паролем и прямым обходом. Платный прокси, аккаунт и внешний адрес не нужны.

Дата проверки:

curl обращается к локальному назначению через прокси с авторизацией; записи обеих сторон подтверждают путь. Отдельный прямой путь достигает того же назначения без прокси.
Правильный ответ можно получить и напрямую. Запись прокси отличает нужный маршрут от контрольного обхода.
Открыть изображение в полном размере

Подготовьте два публичных файла

  1. Проверьте установленные программы

    Рецепт проверен на Windows с Node.js 24.14.0 и curl 8.13.0. Нужны только встроенные модули Node и curl, без установки пакетов. В PowerShell/cmd проверьте node --version и curl.exe --version; в POSIX shell используйте curl --version.

  2. Сохраните локальный пример

    Сохраните файл local-first-connection-v1.mjs по ссылке в новую папку. Полный блок «Пример запроса» сохраните рядом как example.mjs. Прочтите оба файла: программа запуска не изолирует произвольный код.

  3. Запустите из этой папки

    Выполните команду ниже в PowerShell, cmd или POSIX shell. Программа поднимет прокси и сервер назначения на loopback с временными портами и передаст синтетические данные в example.mjs через stdin.

  4. Сверьте контрольные результаты

    Общий код выхода 0 означает совпадение ожидаемых результатов успешного запроса, неверного пароля и обхода. Оба слушателя затем закрываются. Любой другой общий код требует проверки; отсутствие клиента не означает отказ авторизации.

Скачайте ограниченный локальный пример

Программа пропускает только GET на собственный точный адрес /echo и не поддерживает CONNECT. Она не обращается к платформам, не меняет аккаунты и не устанавливает клиент. Реальные пароли и файл protected-config не нужны.

Программа передаёт proxy, username, password, target и bypass через stdin. Пример направляет конфигурацию curl в закрытый канал: `curl -q --config -`. Аргумент -q стоит первым, чтобы стандартный curlrc не менял запрос. В Windows выбирается curl.exe, а не псевдоним PowerShell. CURL_BIN позволяет указать уже доверенный исполняемый файл curl.

Запустить три контрольных запроса

Используйте клавиши со стрелками для горизонтальной прокрутки.

node local-first-connection-v1.mjs example.mjs

Выполните из папки с двумя сохранёнными файлами. Команда не использует перенаправление ввода shell и подходит для PowerShell, cmd и POSIX shell.

Проверено на локальном примере

Пример запроса

Используйте клавиши со стрелками для горизонтальной прокрутки.

import { readFileSync } from 'node:fs'
import { spawn } from 'node:child_process'

let cfg
try {
  cfg = JSON.parse(readFileSync(0, 'utf8'))
  if (!cfg || typeof cfg.bypass !== 'boolean' ||
      ['proxy','username','password','target'].some(key =>
        typeof cfg[key] !== 'string' || /[\r\n]/.test(cfg[key]))) throw new Error()
} catch {
  console.log(JSON.stringify({error:'invalid-input'}))
  process.exit(1)
}
const quote = value => {
  return '"' + value.replaceAll('\\', '\\\\').replaceAll('"', '\\"') + '"'
}
const curl = process.env.CURL_BIN || (process.platform === 'win32' ? 'curl.exe' : 'curl')
const config = [
  'proxy = ' + quote(cfg.proxy),
  'proxy-user = ' + quote(cfg.username + ':' + cfg.password),
  'noproxy = ' + quote(cfg.bypass ? '*' : ''),
  'url = ' + quote(cfg.target),
  'silent',
  'fail',
  'connect-timeout = 3',
  'max-time = 5',
  'write-out = "\\n%{http_code}"',
].join('\n')
const child = spawn(curl, ['-q', '--config', '-'], { stdio: ['pipe','pipe','pipe'], windowsHide:true })
let output = '', startFailed = false
child.stdout.setEncoding('utf8')
child.stdout.on('data', chunk => { output += chunk })
child.stderr.resume()
child.stdin.on('error', () => {})
child.on('error', () => {
  startFailed = true
  console.log(JSON.stringify({error:'runtime-unavailable'}))
  process.exitCode = 1
})
child.on('close', code => {
  if (startFailed) return
  const match = output.match(/\n(\d{3})$/)
  if (!match) {
    console.log(JSON.stringify({error:'runtime-invalid'}))
    process.exitCode = 1
    return
  }
  const http_status = Number(match[1])
  const body = output.slice(0, match.index)
  const marker = body === 'first-connection-fixture'
  console.log(JSON.stringify({http_status,curl_exit:code,marker}))
  process.exitCode = code === 0 && http_status === 200 && marker ? 0 : 1
})
child.stdin.end(config)

Сохраните как example.mjs. Node передаёт curl в argv только -q --config -, а синтетическую конфигурацию — через stdin. Тела ошибок и необработанная диагностика curl не выводятся.

Проверено на локальном примере

Ожидаемые локальные данные

Используйте клавиши со стрелками для горизонтальной прокрутки.

Ожидаемые локальные данные
КритерийОтвет и код выходаЗаписи запросов
successhttp_status=200, curl_exit=0, marker=trueproxy_requests=1; destination_requests=1
wrong_credentialshttp_status=407, curl_exit=22; ожидаемая ошибка примераproxy_requests=1; destination_requests=0
bypasshttp_status=200, curl_exit=0, marker=trueproxy_requests=0; destination_requests=1

Сама программа запуска завершится с кодом 0 только при совпадении всех трёх исходов. Это счётчики локальной HTTP-проверки, а не проверка рабочего внешнего выхода.

Разделяйте протокол и авторизацию

Используйте клавиши со стрелками для горизонтальной прокрутки.

Разделяйте протокол и авторизацию
КритерийЗначение в curlЧто проверяет упражнение
HTTP-проксиproxy-user задаёт авторизацию на прокси. Вход на сайт или авторизация API настраиваются отдельно.Только локальный HTTP GET с авторизацией
Назначение HTTPSHTTP-прокси обычно использует CONNECT для адреса HTTPS; TLS проверяется отдельно.CONNECT, TLS и сертификаты здесь не проверены
Параметры SOCKS5--socks5 или socks5:// разрешает имя назначения локально; --socks5-hostname или socks5h:// поручает это прокси.Поведение параметров по документации curl; SOCKS5 не запускался

Разница DNS относится к выбранному параметру или URL-схеме curl, а не к безусловному свойству протокола SOCKS5.

При переходе к реальным реквизитам

Используйте адрес только для чтения, который принадлежит вам или разрешён для теста. Уточните протокол, хост, порт и данные авторизации прокси в разрешённых вам реквизитах подключения. Не используйте платный API как проверку связности.

Для ручной конфигурации curl храните proxy и proxy-user в локальном файле, доступном только вашему пользователю ОС, и передавайте имя файла параметру --config. Ограничьте доступ до записи секретов: права только владельца в POSIX или ACL только для своего пользователя в Windows. Не храните файл в общей или синхронизируемой папке и в системе контроля версий; удалите после работы. Эта страница не предлагает и не проверяет конкретную команду настройки прав ОС.

Не раскрывайте переменную с паролем в аргументы команды. Избегайте verbose/trace, снимков конфигурации и необработанной диагностики. Авторизация прокси отделена от авторизации назначения. Проверка реального выхода требует адреса клиента, наблюдаемого разрешённым сервером, и записи нужного прокси; локальный пример не подтверждает страну или совместимость платформ.

Разберите ошибку до смены выхода

invalid-input

Что проверить: Некорректный JSON, обязательное поле или перевод строки в значении.

Следующее действие: Используйте неизменённую программу запуска и полный пример. Ввод отклоняется до запуска curl и не выводится.

runtime-unavailable или runtime-invalid

Что проверить: curl не запустился либо не вернул ожидаемый формат статуса.

Следующее действие: Проверьте установленный файл и версию. Это не отказ прокси.

407 при неверных реквизитах

Что проверить: Прокси отклонил синтетический пароль, сервер назначения не получил запрос.

Следующее действие: Это ожидаемый отрицательный контроль. При реальных настройках проверяйте пароль прокси, а не вход на сайт.

200 без запроса на прокси

Что проверить: Контроль обхода обращается к серверу напрямую.

Следующее действие: В реальной проверке изучите no-proxy и переменные окружения curl. Ответ сам по себе не подтверждает маршрут.

fixture-infrastructure, example-timeout или control-mismatch

Что проверить: Не запустился локальный слушатель, не завершился пример или не совпал контрольный результат.

Следующее действие: Остановитесь, проверьте оба файла и локальную среду. Не делайте выводов о внешней платформе.

Следующее руководство

Если нужно было проверить только маршрут curl, закончите после сверки двух записей. У браузерной автоматизации и отдельного клиента API свои настройки. Сохраните прямой доступ, если его достаточно: прокси добавляет ещё одно соединение для диагностики.

Загрузки и подключение

Расширения браузера и инструменты подключения

Ссылки взяты из общего каталога инструментов кабинета. Выберите инструмент для своей системы и настройте приобретённый прокси по инструкции.

Платформы и версии указаны по существующему каталогу, а не по новой проверке совместимости. Перед установкой проверьте требования инструмента.

Войдите для просмотра параметров подключения, мобильных приложений и других инструментов ↗

Источники и проверка

  1. curl manual: config, proxy-user and SOCKS5 DNS

    Официальная документация · Проверено:

  2. Локальные контрольные запросы curl

    Локальный пример · Проверено:

    Node.js 24.14.0 и curl 8.13.0; код со страницы работает с публичным loopback-примером и синтетическими реквизитами через stdin; проверяются успех, 407 и прямой доступ.

    Только контролируемый локальный HTTP. Платные сервисы, региональный выход, внешние аккаунты, TLS/CONNECT, SOCKS и браузерные интеграции не проверены.