Usar um proxy com o cURL consiste em informar o endereço e a porta do servidor proxy pela opção de linha de comando -x ou --proxy, permitindo rotear as requisições do cURL por um servidor intermediário.
Este artigo detalha os vários métodos e opções de linha de comando disponíveis no cURL para trabalhar com serviços de proxy, cobrindo proxies HTTP/HTTPS básicos, proxies com autenticação, proxies SOCKS e a configuração por variáveis de ambiente.
Configuração básica de proxy
O método mais comum de instruir o cURL a usar um proxy é a opção -x ou --proxy, seguida do endereço e da porta do servidor proxy.
Proxy HTTP/HTTPS
Para rotear uma requisição HTTP ou HTTPS por um proxy HTTP/HTTPS, informe o endereço e a porta do proxy.
Sintaxe:
curl -x [protocol://][user:password@]proxyhost[:port] [URL]
Exemplos:
-
Usando um proxy HTTP para um destino HTTP:
bash curl -x http://your.proxy.server:8080 http://example.com
Este comando faz o cURL enviar a requisição parahttp://example.comatravés deyour.proxy.serverna porta8080usando o protocolo de proxy HTTP. -
Usando um proxy HTTP para um destino HTTPS:
bash curl -x http://your.proxy.server:8080 https://secure.example.com
Ao passar um destino HTTPS por um proxy HTTP, o cURL normalmente usa o métodoCONNECTpara estabelecer um túnel através do proxy até o servidor de destino. O handshake SSL/TLS ocorre então diretamente entre o cURL esecure.example.com, sem envolver o proxy HTTP na criptografia. -
Usando um proxy HTTPS para um destino HTTP:
bash curl -x https://your.secure.proxy.server:8443 http://example.com
Isso roteia a requisição por um proxy que usa HTTPS. A conexão entre o cURL eyour.secure.proxy.serveré criptografada.
Proxies com autenticação
Muitos serviços de proxy exigem autenticação. O cURL suporta vários métodos de autenticação para proxies, principalmente Basic, NTLM e Digest.
Autenticação Basic
Para proxies que exigem usuário e senha, use a opção --proxy-user ou embuta as credenciais diretamente na URL do proxy.
Sintaxe:
curl -x [protocol://]proxyhost[:port] --proxy-user "username:password" [URL]
curl -x [protocol://]username:password@proxyhost[:port] [URL]
Exemplos:
-
Usando
--proxy-user:
bash curl -x http://your.proxy.server:8080 --proxy-user "proxyuser:proxypass" http://example.com -
Embutindo as credenciais na URL:
bash curl -x http://proxyuser:[email protected]:8080 http://example.com
É obrigatório codificar em URL os caracteres especiais do usuário ou da senha, caso existam. Por exemplo, a senhap@ssworddeve virarp%40ssword.
Outros métodos de autenticação
Embora a autenticação Basic seja a mais comum, o cURL suporta outros métodos para ambientes específicos.
--proxy-ntlm: ativa a autenticação NTLM no proxy.--proxy-digest: ativa a autenticação Digest no proxy.
Exemplo (NTLM):
curl -x http://your.proxy.server:8080 --proxy-ntlm --proxy-user "DOMAIN\proxyuser:proxypass" http://example.com
Proxies SOCKS
Os proxies SOCKS (Socket Secure) operam em um nível mais baixo que os proxies HTTP e lidam com diversos protocolos de rede. O cURL suporta SOCKS4, SOCKS4a e SOCKS5.
Proxy SOCKS5
O SOCKS5 é o protocolo SOCKS mais versátil, com suporte a IPv4, IPv6, UDP e autenticação.
Sintaxe:
curl --socks5 [user:password@]proxyhost[:port] [URL]
Exemplos:
-
Proxy SOCKS5 básico:
bash curl --socks5 your.socks5.server:1080 http://example.com
Por padrão, o cURL resolve o hostnameexample.comlocalmente antes de enviar o endereço IP ao proxy SOCKS5. -
Proxy SOCKS5 com resolução DNS remota:
bash curl --socks5-hostname your.socks5.server:1080 http://example.com
A opção--socks5-hostnamefaz o cURL enviar o hostnameexample.comao proxy SOCKS5, permitindo que o proxy execute a resolução DNS. Isso é essencial para o anonimato e para contornar restrições geográficas, já que a resolução DNS local pode revelar sua localização. -
Proxy SOCKS5 com autenticação:
bash curl --socks5-hostname socksuser:[email protected]:1080 http://example.com
Proxy SOCKS4/SOCKS4a
O SOCKS4 é um protocolo mais antigo, voltado principalmente a IPv4, e não suporta autenticação. O SOCKS4a estende o SOCKS4 para permitir que o proxy resolva hostnames.
Sintaxe:
curl --socks4 proxyhost[:port] [URL]
curl --socks4a proxyhost[:port] [URL]
Exemplo (SOCKS4a):
curl --socks4a your.socks4.server:1080 http://example.com
De forma semelhante a --socks5-hostname, o --socks4a garante que o proxy resolva o hostname de destino.
Destinos HTTPS via proxy com SSL/TLS
Quando o cURL envia uma requisição HTTPS por um proxy HTTP, ele inicia uma requisição CONNECT ao proxy. O proxy então estabelece um túnel TCP até o servidor HTTPS de destino. O cURL executa o handshake SSL/TLS diretamente com o servidor de destino através desse túnel.
Verificação de certificado SSL
Por padrão, o cURL verifica o certificado SSL do servidor de destino. Se o certificado for inválido, estiver expirado ou for autoassinado, o cURL aborta a conexão.
-
--insecureou-k: desativa a verificação do certificado SSL. Use com cautela, principalmente em testes ou em ambientes confiáveis conhecidos com certificados autoassinados.
bash curl -x http://your.proxy.server:8080 https://self-signed.example.com -k -
--cacert [file]: informa um bundle de certificados CA personalizado para a verificação.
bash curl -x http://your.proxy.server:8080 https://secure.example.com --cacert /path/to/custom_ca.pem
Variáveis de ambiente para configuração de proxy
O cURL também pode obter as configurações de proxy a partir de variáveis de ambiente. Isso é útil para configurações de proxy válidas para todo o sistema ou toda a sessão, sem precisar informar a opção -x em cada comando.
Variáveis de ambiente comuns
http_proxy: proxy para requisições HTTP.https_proxy: proxy para requisições HTTPS.all_proxy: proxy de fallback para todos os protocolos, casohttp_proxyouhttps_proxynão estejam definidos.no_proxy: lista separada por vírgulas de hostnames, domínios ou endereços IP que devem ignorar o proxy.
Sintaxe:
export http_proxy="http://your.proxy.server:8080"
export https_proxy="http://your.proxy.server:8080" # Nota: em geral, usa-se um proxy HTTP para destinos HTTPS
export no_proxy="localhost,127.0.0.1,.localdomain"
Exemplos:
-
Definindo o proxy HTTP:
bash export http_proxy="http://proxyuser:[email protected]:8080" curl http://example.com -
Definindo o proxy HTTPS (via proxy HTTP):
bash export https_proxy="http://your.proxy.server:8080" curl https://secure.example.com -
Ignorando o proxy para hosts específicos:
bash export http_proxy="http://your.proxy.server:8080" export no_proxy="internal.example.com" curl http://internal.example.com # Esta requisição vai ignorar o proxy curl http://external.example.com # Esta requisição vai usar o proxy
Precedência
As opções de linha de comando têm precedência sobre as variáveis de ambiente. Se -x for informado, ele sobrepõe qualquer variável de ambiente http_proxy, https_proxy ou all_proxy.
Diagnóstico de conexões via proxy
Ao enfrentar problemas com cURL e proxies, várias opções ajudam no diagnóstico.
-
--verboseou-v: fornece informações detalhadas sobre a requisição e a resposta, incluindo tentativas de conexão ao proxy, cabeçalhos e negociação SSL/TLS. Costuma ser o primeiro passo na depuração.
bash curl -v -x http://your.proxy.server:8080 http://example.com -
--trace [file]: grava em um arquivo um trace completo de todos os dados de entrada e saída, incluindo cabeçalhos e corpo.
bash curl --trace debug.log -x http://your.proxy.server:8080 http://example.com -
Logs do servidor proxy: verifique os logs do seu servidor proxy em busca de tentativas de conexão, falhas de autenticação ou mensagens de erro relacionadas às suas requisições cURL.
-
Conectividade de rede: confirme que a máquina que executa o cURL consegue alcançar o servidor proxy na porta informada usando ferramentas como
ping,telnetounetcat.
bash telnet your.proxy.server 8080
Uma conexãotelnetbem-sucedida indica alcance básico de rede.
Comparação das principais opções de proxy
| Opção do cURL | Descrição | Protocolos | Autenticação | Resolução DNS |
|---|---|---|---|---|
-x, --proxy |
Especificação genérica de proxy (proxy HTTP/HTTPS) | HTTP, HTTPS | Sim | Local |
--proxy-user |
Informa usuário e senha para a autenticação no proxy | HTTP, HTTPS | Sim | N/A |
--socks5 |
Proxy SOCKS5, resolução DNS local por padrão | Todos | Sim | Local |
--socks5-hostname |
Proxy SOCKS5, resolução DNS remota | Todos | Sim | Remota (proxy) |
--socks4 |
Proxy SOCKS4, resolução DNS local | Todos | Não | Local |
--socks4a |
Proxy SOCKS4a, resolução DNS remota | Todos | Não | Remota (proxy) |
http_proxy (env) |
Variável de ambiente para o proxy HTTP | HTTP | Sim | Local |
https_proxy (env) |
Variável de ambiente para o proxy HTTPS (em geral, um proxy HTTP em túnel) | HTTPS | Sim | Local |
all_proxy (env) |
Variável de ambiente para todos os protocolos, se as outras não estiverem definidas | Todos | Sim | Local |
no_proxy (env) |
Variável de ambiente para indicar hosts que devem ignorar o proxy | N/A | N/A | N/A |
