Руководство по настройке SOCKS5: браузеры, SSH, curl, git и Python
Практическое руководство по настройке SOCKS5 для Firefox, macOS, Linux, динамического перенаправления SSH, curl, git и Python — включая различие между socks5 и socks5h, которое становится причиной большинства утечек геолокации и DNS.
Поиск конфигуратора SOCKS5 обычно означает, что у вас уже есть хост, порт и, возможно, имя пользователя и пароль — и вы хотите, чтобы браузер, оболочка или скрипт направляли трафик через него. Не существует единого универсального конфигуратора, но в каждом месте, где вы настраиваете SOCKS5, нужны одни и те же несколько значений, а особенности предсказуемы. Это руководство охватывает конфигурации, которые люди действительно используют.
Что такое SOCKS5, примерно за 60 секунд
SOCKS5 (RFC 1928) — это прокси-протокол транспортного уровня. Ваш клиент открывает соединение с прокси, просит его достичь пункта назначения, а затем передаёт байты в обоих направлениях. Из такого дизайна следуют два последствия:
- Прокси не разбирает и не переписывает прикладные протоколы, поэтому он передаёт HTTPS, SSH и произвольный TCP-трафик без специальной настройки.
- SOCKS5 ничего не шифрует. Конфиденциальность обеспечивается целевым протоколом (HTTPS, SSH) или запуском туннеля поверх шифрованного транспорта, такого как SSH.
Аутентификация по имени пользователя и паролю для SOCKS5 — это отдельная спецификация, RFC 1929. Поддержка её клиентами различается, и это различие вызывает большую часть проблем с настройкой.
Необходимые значения до начала работы
- Хост — имя хоста или IP-адрес прокси.
- Порт — порт прослушивания, предоставленный провайдером или туннелем.
- Аутентификация — имя пользователя и пароль, список разрешённых IP или отсутствие таковой.
- Схема — ожидает ли ваш инструмент
socks5://илиsocks5h://.
socks5:// против socks5h:// и почему DNS определяет вашу геолокацию
| Схема | Кто разрешает DNS | Шифрует трафик | Когда использовать |
|---|---|---|---|
socks5:// |
ваша машина | нет | локальное разрешение DNS приемлемо |
socks5h:// |
прокси | нет | вы хотите, чтобы запросы и геолокация соответствовали прокси |
префикс http:// |
ваша машина | нет | вы используете HTTP-прокси, а не SOCKS |
префикс https:// |
ваша машина | TLS до прокси | провайдер предлагает прокси-эндпоинт, обёрнутый в TLS |
h означает, что имя хоста разрешается прокси. Использование socks5://, когда вам нужен socks5h://, — самая распространённая причина ситуации, когда прокси работает, но всё равно показывает неверный регион; это также может раскрыть посещаемые вами имена хостов вашему локальному резолверу. Только некоторые инструменты — curl, git через libcurl и определённые библиотеки Python — соблюдают соглашение socks5h; GUI-приложения обычно предоставляют это в виде флажка.
Настройка SOCKS5 в Firefox
Firefox — самый простой из распространённых браузеров для указания SOCKS5-прокси, потому что он хранит собственные настройки прокси, а не наследует настройки операционной системы.
- Откройте Настройки и найдите Настройки сети, или перейдите в Настройки, затем Общие, затем Настройки сети.
- Выберите Ручная настройка прокси.
- Введите хост и порт в поле SOCKS-хост и выберите SOCKS v5.
- Отметьте Проксировать DNS при использовании SOCKS v5, если прокси должен разрешать имена хостов.
- Оставьте поля HTTP-прокси пустыми, если у вас нет также HTTP-прокси.
- Нажмите ОК, затем загрузите страницу, которая показывает ваш IP-адрес, чтобы подтвердить изменение.
Chrome, Edge и другие браузеры на Chromium
Браузеры на основе Chromium читают настройки прокси операционной системы. Для изолированного тестирования запустите один из них с флагом и одноразовым профилем:
# macOS
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome \
--proxy-server="socks5://127.0.0.1:1080" \
--user-data-dir=/tmp/chrome-socks-test
# Linux
google-chrome --proxy-server="socks5://127.0.0.1:1080" --user-data-dir=/tmp/chrome-socks-test
Два предостережения. Отдельный --user-data-dir изолирует тест от вашего обычного профиля, а флаг — ненадёжное место для учётных данных. Если ваш прокси требует аутентификации, настройте её в параметрах операционной системы или направьте трафик через локальный перенаправляющий прокси вместо того, чтобы встраивать имя пользователя и пароль во флаг.
macOS: настройка SOCKS5 из терминала
Утилита networksetup записывает ровно ту же настройку, которую предоставляет панель Сетевые настройки.
# Список доступных сетевых сервисов, если вы не уверены в названии
networksetup -listallnetworkservices
# Замените "Wi-Fi" на имя вашего активного сервиса
sudo networksetup -setsocksfirewallproxy "Wi-Fi" 127.0.0.1 1080
sudo networksetup -setsocksfirewallproxystate "Wi-Fi" on
# Выключить обратно
sudo networksetup -setsocksfirewallproxystate "Wi-Fi" off
Многие инструменты командной строки полностью игнорируют системные настройки прокси macOS и требуют собственной настройки, поэтому не предполагайте, что терминал будет охвачен после успешного выполнения этой команды.
Linux и инструменты CLI: переменные окружения
export ALL_PROXY="socks5h://user:[email protected]:1080"
export all_proxy="$ALL_PROXY"
Большое количество инструментов командной строки читают ALL_PROXY или его вариант в нижнем регистре. Проверьте текущие значения с помощью env | grep -i proxy. Графические приложения в Linux обычно следуют настройкам прокси окружения рабочего стола, а не этим переменным, поэтому настройте оба пути или используйте обёртку, такую как proxychains, для упрямых бинарников.
SSH: превратите контролируемый сервер в SOCKS5-прокси
# -D включает динамическое (SOCKS) перенаправление, -N не выполняет удалённую команду, -C сжимает
ssh -N -C -D 1080 [email protected]
# Добавьте -f, чтобы отправить его в фоновый режим
ssh -f -N -C -D 1080 [email protected]
Часто это самый быстрый способ получить работающий SOCKS5-эндпоинт. На удалённом сервере ничего не нужно устанавливать, не требуются повышенные привилегии, а переход между вашей машиной и сервером шифруется SSH — что устраняет один из недостатков SOCKS5. Направьте браузер или CLI на 127.0.0.1:1080, когда туннель будет поднят.
curl, git и Python
# Разрешить DNS локально
curl --socks5 127.0.0.1:1080 https://api.ipify.org
# Разрешить DNS на прокси
curl --socks5-hostname 127.0.0.1:1080 https://api.ipify.org
# С аутентификацией по имени пользователя и паролю
curl --socks5-hostname 127.0.0.1:1080 \
--proxy-user "USER:PASS" \
https://api.ipify.org
# Направьте git через SOCKS5-прокси; git использует libcurl под капотом
git config --global http.proxy socks5h://127.0.0.1:1080
git config --global https.proxy socks5h://127.0.0.1:1080
# Отмените, когда закончите
git config --global --unset http.proxy
git config --global --unset https.proxy
# Требуется: pip install "requests[socks]"
import requests
proxies = {
"http": "socks5h://user:[email protected]:1080",
"https": "socks5h://user:[email protected]:1080",
}
response = requests.get("https://api.ipify.org", proxies=proxies, timeout=15)
print(response.status_code, response.text)
Библиотеке requests нужна зависимость PySocks, чтобы понимать SOCKS-прокси. Без неё вы получите ошибку об отсутствующих зависимостях, возникающую до попытки любого соединения, что легко принять за сбой прокси.
Устранение неполадок, с которыми вы действительно столкнётесь
| Симптом | Вероятная причина | Исправление |
|---|---|---|
| В соединении отказано | На этом порту ничего не прослушивается | Проверьте порт и что прокси или SSH-туннель запущен |
| Ошибка аутентификации SOCKS5 | Неверные учётные данные или прокси ожидает IP из списка разрешённых | Перепроверьте учётные данные; уберите их, если ваш IP в списке разрешённых |
| Сайт по-прежнему показывает неверный регион | DNS разрешён локально, потому что вы использовали socks5:// |
Переключитесь на socks5h:// или включите удалённый DNS |
| 407 Proxy Authentication Required | Вы направлены на порт HTTP-прокси, а не SOCKS | Проверьте список портов провайдера |
| Работает в curl, но не работает в браузере | Браузер использует системные настройки, или расширение переопределяет их | Отключите расширения для прокси и проверьте системные настройки |
| UDP-приложения не работают | UDP-ассоциация SOCKS5 редко реализована на стороне клиента | Используйте VPN для UDP-трафика |
Проверьте, прежде чем доверять
# Сравните сообщаемый IP с прокси и без него
curl -sS https://api.ipify.org; echo
curl -sS --socks5-hostname 127.0.0.1:1080 https://api.ipify.org; echo
Если оба адреса идентичны, трафик не идёт через прокси. Когда важна точность геолокации, также запустите тест на утечку DNS в браузере, чтобы убедиться, что запросы уходят через прокси, а не через ваш локальный резолвер.
Вывод
Конфигуратор SOCKS5 — это на самом деле всего четыре значения, применённые в нужном месте: хост, порт, учётные данные и решение о том, где разрешается DNS. Настройте браузер или инструмент CLI, которым вы действительно пользуетесь, подтвердите выходной IP с помощью сравнения в curl выше и по умолчанию используйте socks5h://, когда важна точность геолокации или приватность DNS.