Ретранслятор аутентификации SOCKS5 Proxy: создать или обойтись без него

Chrome и многие инструменты автоматизации до сих пор не могут аутентифицироваться через SOCKS5 proxy. Маленький локальный ретранслятор решает эту проблему, удерживая учетные данные — вот минимально работающий пример, готовые инструменты и случаи, когда он вообще не нужен.

Ретранслятор аутентификации SOCKS5 proxy — это небольшой локальный процесс, который отвечает на запрос прокси о вводе имени пользователя и пароля от вашего имени, а затем передает вашему инструменту простой, не требующий аутентификации, конечный пункт на 127.0.0.1. Он существует, чтобы закрыть упорный пробел: Chromium никогда не поддерживал аутентифицированный SOCKS5 (отслеживается как ошибка Chromium 40829748), и множество инструментов автоматизации принимают только голый host:port. Тема на Reddit, которая вызвала резонанс — кто-то настолько разочаровался, что создал маленький ретранслятор, потому что инструменты до сих пор не могли справиться с аутентифицированным SOCKS5 — это весь жанр в одном предложении. Это руководство показывает минимально работающий ретранслятор, готовые инструменты и, что не менее важно, когда он не нужен.

Шаблон: без аутентификации спереди, аутентифицированный сзади

Каждый ретранслятор в этой области делает одно и то же. Он слушает локально без аутентификации, и для каждого соединения открывает верхний участок с использованием ваших реальных учетных данных. Ваш инструмент подключается к 127.0.0.1 — пароль не нужен — и ретранслятор выполняет рукопожатие аутентификации SOCKS5 с шлюзом SOCKS5. Учетные данные хранятся в одном месте, на loopback, и никогда не касаются конфигурации инструмента. Это важно по второй причине: SOCKS5 не зашифрован и передает учетные данные в открытом виде, поэтому удержание аутентифицированного участка на вашем собственном компьютере, привязанного к 127.0.0.1, — это безопасный способ сделать это.

Ретранслятор в одну команду: gost

Вам редко нужно писать ретранслятор вручную. gost — это инструмент с открытым исходным кодом для туннелирования, который реализует полную спецификацию SOCKS5, включая аутентификацию по имени пользователя и паролю, и превращает всю работу в одну команду. Экспонируйте локально слушатель SOCKS5 без аутентификации и перенаправьте на ваш аутентифицированный верхний участок:

# local no-auth SOCKS5 on :1080  ->  authenticated SOCKS5 upstream
gost -L socks5://:1080 -F socks5://USER:PASS@gate.quantumproxies.io:PORT

# now point any tool at the loopback address, no credentials:
#   --proxy-server=socks5://127.0.0.1:1080   (Chrome, nodriver, zendriver)

Если ваш инструмент поддерживает HTTP, но не SOCKS5, та же команда конвертирует протоколы — экспонируйте локально HTTP proxy, который перенаправляет на аутентифицированный шлюз SOCKS5. Это чистый ответ на повторяющийся вопрос "конвертировать SOCKS5 в HTTP proxy", и он превосходит классическую конфигурацию Privoxy, потому что gost обрабатывает аутентификацию верхнего участка в одном месте:

# local HTTP proxy on :8080  ->  authenticated SOCKS5 upstream
gost -L http://:8080 -F socks5://USER:PASS@gate.quantumproxies.io:PORT

# Chrome/curl/anything with an HTTP proxy setting can now use 127.0.0.1:8080
Диаграмма потока локального ретранслятора аутентификации SOCKS5: инструмент подключается к слушателю loopback без аутентификации, который добавляет учетные данные и перенаправляет на аутентифицированный шлюз proxy
Ретранслятор удерживает учетные данные на loopback и выполняет рукопожатие аутентификации SOCKS5, так что инструмент видит только конечный пункт без аутентификации.

Минимальный ретранслятор с нуля

Если вы хотите понять движущие части, вот самая маленькая полезная версия на чистом Python. Она использует PySocks (pip install PySocks) для открытия аутентифицированного верхнего участка и передает байты в обе стороны. Этот конкретный набросок туннелирует один целевой хост — достаточно, чтобы скрапить один API через аутентифицированный выход SOCKS5 — что делает его коротким и правильным; общий сервер SOCKS5, который анализирует рукопожатие клиента, — это то, что инструменты, такие как gost, уже делают за вас:

import asyncio, socks   # PySocks

UP_HOST, UP_PORT = "gate.quantumproxies.io", 0000   # your SOCKS5 gateway
UP_USER, UP_PASS = "USER", "PASS"
TARGET = ("example.com", 443)                        # the one host to reach

async def pipe(reader, writer):
    try:
        while data := await reader.read(65536):
            writer.write(data)
            await writer.drain()
    finally:
        writer.close()

async def handle(local_r, local_w):
    # open the upstream leg with SOCKS5 auth (PySocks is blocking -> a thread)
    up = await asyncio.to_thread(
        socks.create_connection, TARGET,
        proxy_type=socks.SOCKS5, proxy_addr=UP_HOST, proxy_port=UP_PORT,
        username=UP_USER, password=UP_PASS,
    )
    up_r, up_w = await asyncio.open_connection(sock=up)
    await asyncio.gather(pipe(local_r, up_w), pipe(up_r, local_w))

async def main():
    server = await asyncio.start_server(handle, "127.0.0.1", 1080)
    async with server:
        await server.serve_forever()

asyncio.run(main())

Для полного локального сервера SOCKS5, на который может указывать любой клиент, проект сообщества socks-relay на GitHub — хорошая ссылка: он запускает слушатель без аутентификации или с user/pass и ретранслирует на другой сервер SOCKS5, в несколько сотен строк, построенных на PySocks. Проект socks-to-http-proxy (Rust) выполняет задачу конвертации HTTP, если вы предпочитаете скомпилированный бинарный файл. В любом случае, вы запускаете тот же шаблон, который gost дает вам в одной строке.

Когда вам НЕ нужен ретранслятор

Ретранслятор — это ваш собственный переход, и часто вы можете удалить всю проблему вместо этого. Обойдитесь без него, если выполняется любое из следующих условий:

# no relay needed — curl authenticates SOCKS5 directly (socks5h resolves DNS
# through the proxy, avoiding leaks):
curl -x socks5h://USER:PASS@gate.quantumproxies.io:PORT https://httpbin.org/ip

# and HTTP Basic proxy auth is even more widely supported:
curl -x http://USER:PASS@gate.quantumproxies.io:PORT https://httpbin.org/ip
Контрольный список, сравнивающий, когда ретранслятор аутентификации SOCKS5 не нужен, и когда он оправдывает свое существование, охватывающий HTTP конечные пункты, белый список IP, нативную поддержку библиотек и пробел SOCKS5 в Chromium
Большинство конфигураций могут обойтись без ретранслятора: HTTP конечный пункт, белый список IP или клиент, который нативно поддерживает аутентификацию SOCKS5, все устраняют необходимость в нем.

Честный минус

Запуск собственного ретранслятора добавляет точку отказа. Это еще один процесс для наблюдения: если он падает, каждый запрос за ним терпит неудачу, и простой скрипт не дает вам ни перезапуска, ни проверки состояния, ни логирования, если вы их не добавите. У него нет собственной ротации — он перенаправляет на любой один верхний участок, который вы настроили, так что ротация выхода все еще должна исходить от шлюза. Он добавляет задержку на переход, и он удерживает учетные данные в открытом виде в памяти, что именно поэтому он должен быть привязан к 127.0.0.1 и никогда к публичному интерфейсу. Для ноутбука, скрапящего один сайт, это нормально. Для чего-либо, что вы отслеживаете, предпочитайте решение без новых движущихся частей — белый список или HTTP конечный пункт — вместо ретранслятора, который теперь нужно поддерживать в рабочем состоянии.

Тот же шаблон ретранслятора встречается по всему скрытому экосистеме, потому что пробел SOCKS5 в Chromium разделяется каждым браузером, построенным на нем. Если вы подключаете это к конкретной структуре, смотрите аутентификация Playwright SOCKS5 и наш руководство по устранению ошибок 407 для ошибок, с которыми вы столкнетесь на этом пути.

Часто задаваемые вопросы

Что такое ретранслятор аутентификации SOCKS5 proxy?

Небольшой локальный процесс, который слушает без аутентификации и перенаправляет каждое соединение на верхний SOCKS5 proxy, используя ваше имя пользователя и пароль. Он позволяет инструментам, которые не могут отправить учетные данные SOCKS5 — в основном браузеры на базе Chromium — достичь аутентифицированного прокси, указывая на адрес loopback, такой как 127.0.0.1:1080. gost создает его одной командой.

Как конвертировать SOCKS5 proxy в HTTP proxy?

Вы не можете конвертировать сам прокси; вы запускаете посредник, который говорит HTTP локально и SOCKS5 на верхнем уровне. gost -L http://:8080 -F socks5://USER:PASS@host:port экспонирует локальный HTTP proxy, который перенаправляет на аутентифицированный шлюз SOCKS5. Специализированные инструменты, такие как socks-to-http-proxy и Privoxy, выполняют ту же задачу, если вы предпочитаете их.

Почему Chrome не может использовать аутентифицированный SOCKS5 proxy?

Chromium никогда не реализовывал аутентификацию по имени пользователя и паролю для SOCKS5 — это давнее ограничение, зарегистрированное как ошибка Chromium 40829748. Неаутентифицированный SOCKS5 работает через --proxy-server=socks5://host:port, но нет способа предоставить учетные данные. Локальный ретранслятор или белый список IP — это стандартное решение, а расширение для аутентификации proxy покрывает HTTP proxy.

Безопасно ли отправлять учетные данные SOCKS5 на ретранслятор?

Только через loopback. SOCKS5 не зашифрован и передает учетные данные в открытом виде, поэтому ретранслятор должен быть привязан к 127.0.0.1 и никогда к публичному интерфейсу — это удерживает аутентифицированный участок на вашем собственном компьютере. Зашифрованный туннель к цели устанавливается от конца до конца для HTTPS в любом случае, так что ретранслятор видит только байты TLS, которые он не может прочитать.

Обращайтесь к ретранслятору только тогда, когда инструмент не оставляет вам выбора. gost — это ответ в одну строку, PySocks — вариант с нуля — но самое быстрое решение для большинства людей — это белый список IP или использование HTTP конечного пункта и отсутствие дополнительных действий. Меньше движущихся частей, меньше ночных вызовов.

Получите SOCKS5 proxy с белым списком IP