Estoy usando CentOS6.x con yum-3.2.29-81, curl / libcurl 7.19.7-53 y tengo este mismo problema. Tengo servidores yum detrás de un firewall y quiero usar yum sobre una configuración de proxy SOCKS5 usando ssh. Idealmente, quiero hacer esto sin requerir tsocks, proxychains o cualquier otra utilidad de "socksification".
Configuré la conexión SOCKS5 usando:
ssh -D 40000 dmz-server
Busqué en las fuentes de yum python y vi que usan pycurl que envuelve libcurl (también tenga en cuenta que todas las variables de entorno proxy - http_proxy, HTTP_PROXY, all_proxy, ALL_PROXY, etc., estaban inicialmente indefinidas). Además, verifiqué que ~ / .curlrc estaba vacío, por lo que no contaminó los resultados de mi prueba.
Quería ver si podía obtener curl para hablar a través del proxy socks5:
curl --socks5 127.0.0.1:40000 http://some-server/some-url
devolvió con éxito la página web remota, por lo que fue una buena señal: mostrar que libcurl puede usar los servidores proxy SOCKS5. Sin embargo, definir una variable de entorno
http_proxy=socks5://127.0.0.1:40000
no fue suficiente:
http_proxy=socks5://127.0.0.1:40000 curl http://some-server/some-url
ha fallado.
En este punto, cambié a usar un programa de prueba de Python test.py :
import pycurl
import sys
sys.stderr.write("Testing %s\n" % pycurl.version)
c = pycurl.Curl()
c.setopt(c.URL, 'http://some-server/some-url')
c.setopt(c.WRITEFUNCTION, sys.stdout.write)
c.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)
c.perform()
c.close()
Ahora corriendo
./test.py
fallará al buscar, pero se ejecuta
http_proxy=socks5://127.0.0.1:40000 ./test.py
buscará con éxito http: // some-server / some-url . Entonces, me parece que esta combinación yum / libcurl (ciertamente antigua) que se envía con CentOS6 no está configurando correctamente el tipo de proxy dentro de libcurl. Creo que lo que está sucediendo es que el PROXYTYPE está predeterminado a un proxy HTTP estándar en lugar de identificar el esquema socks5: // dentro de la URL especificada en la variable de entorno http_proxy .
En cualquier caso, el siguiente parche para /usr/lib/python2.6/site-packages/urlgrabber/grabber.py funcionó para permitirme acceder a http: // repositorios yum a través de un proxy SOCKS5. Dentro de PyCurlFileObject # _set_opts (self, opts = {}), agregue:
if self.scheme == 'http':
proxy = os.getenv('http_proxy') or os.getenv('HTTP_PROXY') or os.getenv('all_proxy') or os.getenv('ALL_PROXY')
if proxy and proxy.find("socks5://") != -1:
self.curl_obj.setopt(pycurl.PROXYTYPE, pycurl.PROXYTYPE_SOCKS5)
alrededor de la línea 1205, justo antes
# ssl options
if self.scheme == 'https':
Con este cambio,
http_proxy=socks5://127.0.0.1:40000 yum install <package_name>
se conecta con éxito a todos mis repositorios http: // yum en el otro lado del firewall a través del proxy SOCKS5 ssh.
Por supuesto, uno podría exportar la variable de entorno http_proxy dentro de su shell para evitar especificarla antes de cada invocación de yum .