As pessoas tratam socks5h como socks5 com uma ortografia mais amigável, e esperam que ambos enviem o mesmo pedido para o mesmo lugar. A letra extra move a consulta DNS em vez disso. Numa máquina cujo resolver e cujo proxy estão em redes diferentes, essa é a diferença entre um pedido que funciona e um que falha.

Uma letra, dois resolvers

O esquema decide onde o nome de destino se torna um endereço. A resolução local usa o resolver configurado na sua máquina. A resolução remota coloca o nome do host dentro do pedido SOCKS, e o proxy procura-o com o seu próprio resolver e a sua própria visão da rede. Ambas as formas continuam a ligar ao mesmo endereço de proxy na mesma porta, pelo que a diferença está no corpo do pedido, não no caminho.

Nada no esquema altera a encriptação ou a autenticação; só o caminho DNS se move. É por isso que a letra é fácil de ignorar e cara de errar.

Mesmo proxy, pedido diferente

As duas invocações diferem num único carácter. Todo o resto é idêntico:

curl --proxy socks5://proxy.example:1080 https://service.example/
curl --proxy socks5h://proxy.example:1080 https://service.example/

A referência do proxy do curl documenta estes esquemas separadamente, e essa é a razão com autoridade para não os tratar como aliases. Execute ambos contra um ponto final inofensivo que tenha autorização para usar e leia a diferença. Uma pesquisa remota bem-sucedida não diz nada sobre outras aplicações, porque navegadores, gestores de pacotes e ambientes de execução das linguagens escolhem cada um por si.

O nome do próprio proxy é resolvido localmente

Nesse comando, proxy.example tem de se tornar um endereço antes de acontecer mais alguma coisa, e essa pesquisa é sempre local. Mover a resolução de service.example para o proxy não faz nada pelo nome do próprio proxy, que ainda precisa de um resolver que a sua máquina consiga alcançar. É aqui que uma VPN muda o quadro.

Se o nome do proxy só for resolvido dentro do túnel, a ligação depende de o túnel estar de pé antes de o curl arrancar. Qual esquema ganha então depende de que lado consegue responder. Quando a sua máquina não consegue resolver o destino mas o proxy consegue, socks5 falha e socks5h tem sucesso. Quando a sua máquina o resolve através do túnel e o proxy não consegue, socks5 funciona e socks5h falha.

O esquema não coloca a ligação ao proxy dentro ou fora da VPN; é a tabela de encaminhamento que o faz, e o esquema nunca a vê. É por isso que um túnel pode corrigir um esquema e quebrar o outro na mesma máquina. A letra decide apenas quem faz a pergunta.

O que cada lado consegue resolver

Um proxy público não consegue resolver um nome que só existe na empresa, por isso enviar-lhe o nome do host falha no proxy e aparece como erro de proxy em vez de erro DNS local. Um proxy dentro da mesma rede privada normalmente consegue resolver esses nomes, e é aí que socks5h se justifica. Escolha a localização do resolver segundo a política de que realmente precisa, porque o DNS remoto não é automaticamente mais capaz e entrega mesmo o nome a um terceiro. Para um destino público ambas as formas funcionam, por isso prefira a que as suas outras ferramentas já usam.

Escreva essa escolha no runbook e não num comentário, e mantenha as credenciais fora do histórico partilhado e da saída de diagnóstico. Depois mude uma variável de cada vez: mesmo destino, mesmo binário, mesmo resolver, uma letra.

Qual binário respondeu

Dois binários curl na mesma máquina podem diferir em versão e funcionalidades de compilação. Numa shell do tipo Unix, type -a curl lista cada correspondência no caminho e curl --version mostra as funcionalidades do que seria executado. Um script envolvente ou um alias mais acima no caminho é uma causa comum de os resultados não corresponderem ao binário que pensa estar a testar.

Um esquema não suportado, um proxy que não consegue resolver o nome e um destino inalcançável são três erros diferentes, por isso leia a mensagem antes de mudar a letra. Uma compilação sem a sintaxe socks5h reporta a cadeia de proxy como não suportada, o que não é o mesmo que um nome que falhou a resolução. Não transforme um relatório antigo sobre um curl do sistema numa regra permanente para todas as plataformas.

Artigos relacionados