Usar un proxy con cURL implica especificar la dirección y el puerto del servidor proxy utilizando la opción de línea de comandos -x o --proxy, lo que permite enrutar las solicitudes de cURL a través de un servidor intermediario.
Este artículo detalla los diversos métodos y opciones de línea de comandos disponibles en cURL para interactuar con servicios proxy, cubriendo proxies HTTP/HTTPS básicos, proxies autenticados, proxies SOCKS y configuración a través de variables de entorno.
Configuración Básica del Proxy
El método más común para indicar a cURL que use un proxy es con la opción -x o --proxy, seguida de la dirección y el puerto del servidor proxy.
Proxy HTTP/HTTPS
Para enrutar una solicitud HTTP o HTTPS a través de un proxy HTTP/HTTPS, especifique la dirección y el puerto del proxy.
Sintaxis:
curl -x [protocolo://][usuario:contraseña@]hostproxy[:puerto] [URL]
Ejemplos:
-
Usando un proxy HTTP para un destino HTTP:
bash curl -x http://tu.servidor.proxy:8080 http://example.com
Este comando dirige a cURL para enviar la solicitud dehttp://example.coma través detu.servidor.proxyen el puerto8080usando el protocolo proxy HTTP. -
Usando un proxy HTTP para un destino HTTPS:
bash curl -x http://tu.servidor.proxy:8080 https://secure.example.com
Al usar un proxy HTTP para un destino HTTPS, cURL típicamente usa el métodoCONNECTpara establecer un túnel a través del proxy hacia el servidor de destino. El handshake SSL/TLS ocurre entonces directamente entre cURL ysecure.example.com, sin involucrar al proxy HTTP en el cifrado. -
Usando un proxy HTTPS para un destino HTTP:
bash curl -x https://tu.servidor.proxy.seguro:8443 http://example.com
Esto enruta la solicitud a través de un proxy que a su vez usa HTTPS. La conexión entre cURL ytu.servidor.proxy.seguroestá cifrada.
Proxies Autenticados
Muchos servicios proxy requieren autenticación. cURL soporta varios métodos de autenticación para proxies, principalmente Basic, NTLM y Digest.
Autenticación Básica
Para proxies que requieren un nombre de usuario y contraseña, use la opción --proxy-user o incruste las credenciales directamente en la URL del proxy.
Sintaxis:
curl -x [protocolo://]hostproxy[:puerto] --proxy-user "usuario:contraseña" [URL]
curl -x [protocolo://]usuario:contraseña@hostproxy[:puerto] [URL]
Ejemplos:
-
Usando
--proxy-user:
bash curl -x http://tu.servidor.proxy:8080 --proxy-user "usuarioproxy:contraseñaproxy" http://example.com -
Incrustando credenciales en la URL:
bash curl -x http://usuarioproxy:contraseñaproxy@tu.servidor.proxy:8080 http://example.com
Se requiere codificación URL para caracteres especiales en el nombre de usuario o contraseña si están presentes. Por ejemplo, una contraseñap@ssworddebería serp%40ssword.
Otros Métodos de Autenticación
Aunque la autenticación Básica es común, cURL soporta otros métodos para entornos específicos.
--proxy-ntlm: Habilita la autenticación NTLM para el proxy.--proxy-digest: Habilita la autenticación Digest para el proxy.
Ejemplo (NTLM):
curl -x http://tu.servidor.proxy:8080 --proxy-ntlm --proxy-user "DOMINIO\usuarioproxy:contraseñaproxy" http://example.com
Proxies SOCKS
Los proxies SOCKS (Socket Secure) operan a un nivel inferior que los proxies HTTP, manejando varios protocolos de red. cURL soporta SOCKS4, SOCKS4a y SOCKS5.
Proxy SOCKS5
SOCKS5 es el protocolo SOCKS más versátil, soportando IPv4, IPv6, UDP y autenticación.
Sintaxis:
curl --socks5 [usuario:contraseña@]hostproxy[:puerto] [URL]
Ejemplos:
-
Proxy SOCKS5 básico:
bash curl --socks5 tu.servidor.socks5:1080 http://example.com
Por defecto, cURL resuelve el nombre de hostexample.comlocalmente antes de enviar la dirección IP al proxy SOCKS5. -
Proxy SOCKS5 con resolución DNS remota:
bash curl --socks5-hostname tu.servidor.socks5:1080 http://example.com
La opción--socks5-hostnameindica a cURL que envíe el nombre de hostexample.comal proxy SOCKS5, permitiendo que el proxy realice la resolución DNS. Esto es crucial para el anonimato y para eludir restricciones geográficas donde la resolución DNS local podría revelar su ubicación. -
Proxy SOCKS5 con autenticación:
bash curl --socks5-hostname usuariosocks:contraseñasocks@tu.servidor.socks5:1080 http://example.com
Proxy SOCKS4/SOCKS4a
SOCKS4 es un protocolo más antiguo, principalmente para IPv4, y no soporta autenticación. SOCKS4a extiende SOCKS4 para permitir que el proxy resuelva nombres de host.
Sintaxis:
curl --socks4 hostproxy[:puerto] [URL]
curl --socks4a hostproxy[:puerto] [URL]
Ejemplo (SOCKS4a):
curl --socks4a tu.servidor.socks4:1080 http://example.com
Similar a --socks5-hostname, --socks4a asegura que el proxy resuelva el nombre de host de destino.
Uso de Proxy para Destinos HTTPS con SSL/TLS
Cuando cURL usa un proxy para una solicitud HTTPS a través de un proxy HTTP, inicia una solicitud CONNECT al proxy. El proxy luego establece un túnel TCP al servidor HTTPS de destino. cURL realiza el handshake SSL/TLS directamente con el servidor de destino a través de este túnel.
Verificación de Certificado SSL
Por defecto, cURL verifica el certificado SSL del servidor de destino. Si el certificado es inválido, ha caducado o es autofirmado, cURL abortará la conexión.
-
--insecureo-k: Deshabilita la verificación del certificado SSL. Úselo con precaución, principalmente para pruebas o entornos de confianza conocidos con certificados autofirmados.
bash curl -x http://tu.servidor.proxy:8080 https://autofirmado.example.com -k -
--cacert [archivo]: Especifica un paquete de certificados CA personalizado para la verificación.
bash curl -x http://tu.servidor.proxy:8080 https://secure.example.com --cacert /ruta/a/ca_personalizada.pem
Variables de Entorno para la Configuración del Proxy
cURL también puede tomar la configuración del proxy de variables de entorno. Esto es útil para configuraciones de proxy a nivel de sistema o de sesión sin especificar la opción -x para cada comando.
Variables de Entorno Comunes
http_proxy: Proxy para solicitudes HTTP.https_proxy: Proxy para solicitudes HTTPS.all_proxy: Un proxy de respaldo para todos los protocolos sihttp_proxyohttps_proxyno están configurados.no_proxy: Una lista separada por comas de nombres de host, dominios o direcciones IP que deben omitir el proxy.
Sintaxis:
export http_proxy="http://tu.servidor.proxy:8080"
export https_proxy="http://tu.servidor.proxy:8080" # Nota: a menudo se usa un proxy HTTP para destinos HTTPS
export no_proxy="localhost,127.0.0.1,.dominio_local"
Ejemplos:
-
Configurando proxy HTTP:
bash export http_proxy="http://usuarioproxy:contraseñaproxy@tu.servidor.proxy:8080" curl http://example.com -
Configurando proxy HTTPS (a través de proxy HTTP):
bash export https_proxy="http://tu.servidor.proxy:8080" curl https://secure.example.com -
Omitiendo el proxy para hosts específicos:
bash export http_proxy="http://tu.servidor.proxy:8080" export no_proxy="interno.example.com" curl http://interno.example.com # Esta solicitud omitirá el proxy curl http://externo.example.com # Esta solicitud usará el proxy
Precedencia
Las opciones de línea de comandos tienen precedencia sobre las variables de entorno. Si se especifica -x, anula cualquier variable de entorno http_proxy, https_proxy o all_proxy.
Solución de Problemas de Conexiones Proxy
Al encontrar problemas con cURL y proxies, varias opciones pueden ayudar en el diagnóstico.
-
--verboseo-v: Proporciona información detallada sobre la solicitud y la respuesta, incluidos los intentos de conexión proxy, encabezados y negociación SSL/TLS. Este suele ser el primer paso en la depuración.
bash curl -v -x http://tu.servidor.proxy:8080 http://example.com -
--trace [archivo]: Vuelca un rastreo completo de todos los datos entrantes y salientes, incluidos encabezados y cuerpo, a un archivo especificado.
bash curl --trace depuracion.log -x http://tu.servidor.proxy:8080 http://example.com -
Registros del Servidor Proxy: Verifique los registros de su servidor proxy en busca de intentos de conexión, fallos de autenticación o mensajes de error relacionados con sus solicitudes cURL.
-
Conectividad de Red: Verifique que la máquina que ejecuta cURL pueda alcanzar el servidor proxy en el puerto especificado utilizando herramientas como
ping,telnetonetcat.
bash telnet tu.servidor.proxy 8080
Una conexióntelnetexitosa indica una accesibilidad de red básica.
Comparación de Opciones Clave de Proxy
| Opción de cURL | Descripción | Protocolos | Autenticación | Resolución DNS |
|---|---|---|---|---|
-x, --proxy |
Especificación genérica de proxy (proxy HTTP/HTTPS) | HTTP, HTTPS | Sí | Local |
--proxy-user |
Especifica nombre de usuario y contraseña para la autenticación del proxy | HTTP, HTTPS | Sí | N/A |
--socks5 |
Proxy SOCKS5, resolución DNS local por defecto | Todos | Sí | Local |
--socks5-hostname |
Proxy SOCKS5, resolución DNS remota | Todos | Sí | Remota (proxy) |
--socks4 |
Proxy SOCKS4, resolución DNS local | Todos | No | Local |
--socks4a |
Proxy SOCKS4a, resolución DNS remota | Todos | No | Remota (proxy) |
http_proxy (env) |
Variable de entorno para proxy HTTP | HTTP | Sí | Local |
https_proxy (env) |
Variable de entorno para proxy HTTPS (a menudo un proxy HTTP para túnel) | HTTPS | Sí | Local |
all_proxy (env) |
Variable de entorno para todos los protocolos si no se configuran otros | Todos | Sí | Local |
no_proxy (env) |
Variable de entorno para especificar hosts que deben omitir el proxy | N/A | N/A | N/A |