curl socks5h против socks5: кто разрешает имя хоста
Лишняя буква переносит DNS-запрос, а не шифрование. Сравните обе формы и затем проверьте, какому имени хоста всё ещё нужен локальный резолвер.
Люди относятся к socks5h как к socks5 с более удобным написанием и ждут, что обе формы отправят один и тот же запрос в одно и то же место. Лишняя буква вместо этого переносит DNS-запрос. На машине, чей резолвер и чей прокси находятся в разных сетях, это разница между запросом, который работает, и тем, который завершается ошибкой.
Одна буква, два резолвера
Схема решает, где имя назначения становится адресом. Локальное разрешение использует резолвер, настроенный на вашей машине. Удалённое разрешение помещает имя хоста внутрь запроса SOCKS, и прокси ищет его своим резолвером и своим взглядом на сеть. Обе формы по-прежнему подключаются к одному и тому же адресу прокси на одном и том же порту, поэтому разница в теле запроса, а не в пути.
Ничто в схеме не меняет шифрование или аутентификацию; переносится только путь DNS. Поэтому букву легко не заметить, а ошибка дорого стоит.
Тот же прокси, другой запрос
Два вызова различаются одним символом. Всё остальное идентично:
curl --proxy socks5://proxy.example:1080 https://service.example/
curl --proxy socks5h://proxy.example:1080 https://service.example/В справочнике curl по прокси эти схемы описаны отдельно, и это авторитетная причина не считать их синонимами. Запустите оба против безобидной конечной точки, которую вам разрешено использовать, и прочитайте разницу. Успешный удалённый поиск ничего не говорит о других приложениях, потому что браузеры, менеджеры пакетов и среды выполнения языков выбирают каждая сама.
Собственное имя прокси разрешается локально
В этой команде proxy.example должен стать адресом прежде, чем произойдёт что-либо ещё, и этот поиск всегда локальный. Перенос разрешения service.example на прокси ничего не делает для собственного имени прокси, которому всё ещё нужен резолвер, доступный вашей машине. Здесь VPN меняет картину.
Если имя прокси разрешается только внутри туннеля, соединение зависит от того, поднят ли туннель до запуска curl. Какая схема тогда победит, зависит от того, какая сторона может ответить. Когда ваша машина не может разрешить назначение, а прокси может, socks5 терпит неудачу, а socks5h успешно. Когда ваша машина разрешает его через туннель, а прокси не может, socks5 работает, а socks5h терпит неудачу.
Схема не помещает соединение с прокси внутрь или наружу VPN; это делает таблица маршрутизации, и схема её никогда не видит. Поэтому один туннель может исправить одну схему и сломать другую на той же машине. Буква решает только, кто задаёт вопрос.
Что может разрешить каждая сторона
Публичный прокси не может разрешить имя, существующее только внутри компании, поэтому отправка ему имени хоста завершается ошибкой на прокси и выглядит как ошибка прокси, а не как локальная ошибка DNS. Прокси внутри той же частной сети обычно может разрешать такие имена, и именно там socks5h оправдывает себя. Выбирайте место резолвера исходя из политики, которая вам действительно нужна, потому что удалённый DNS не становится автоматически более способным и он действительно передаёт имя третьей стороне. Для публичного назначения работают обе формы, поэтому предпочитайте ту, которую уже используют ваши другие инструменты.
Запишите этот выбор в runbook, а не в комментарий, и держите учётные данные вне общей истории и диагностического вывода. Затем меняйте по одной переменной за раз: то же назначение, тот же бинарник, тот же резолвер, одна буква.
Какой бинарник ответил
Два бинарника curl на одной машине могут различаться версией и возможностями сборки. В Unix-подобной оболочке type -a curl перечисляет все совпадения в пути, а curl --version показывает возможности того, который был бы запущен. Скрипт-обёртка или псевдоним раньше в пути — частая причина того, что результаты не соответствуют бинарнику, который, как вы думаете, вы тестируете.
Неподдерживаемая схема, прокси, который не может разрешить имя, и недостижимое назначение — это три разные ошибки, поэтому прочитайте сообщение, прежде чем менять букву. Сборка без синтаксиса socks5h сообщает о строке прокси как о неподдерживаемой, и это не то же самое, что имя, которое не удалось разрешить. Не превращайте один старый отчёт о системном curl в постоянное правило для каждой платформы.