如何通过 yum 使用 SOCKS 代理?

如何通过 yum 使用 SOCKS 代理?

yum.conf 的手册页描述了几个与代理相关的变量:

          proxy URL to the proxy server that yum should use.
          proxy_username username to use for proxy
          proxy_password password for this proxy

但如何指定 SOCKS 代理呢?

我假设以上内容仅适用于普通 HTTP 代理...

答案1

添加此行/etc/yum.conf(从 DaPillow 的帖子中得到想法)

proxy=socks5://ip:port

如果需要通过代理进行主机名解析,感谢评论中的丹尼,这将做到这一点:

proxy=socks5h://ip:port

它对我来说在 Fedora 21 上使用 yum 3.4.3 有效。

答案2

正如 enzitib 所指出的,tsocks可用于将 SOCKS 代理与yum.

更详细地说,可以这样使用它:

$ export TSOCKS_CONF_FILE=$HOME/.tsocks.conf
$ cat .tsocks.conf
server = 127.0.0.1
server_port = 1080
$ tsocks yum ...

默认情况下,tsocks 使用 SOCKS 版本 4 - 但您可以通过“server_type”指令配置 5。对于用户/密码选项,有“default_user”/“default_pass”指令和 TSOCKS_USERNAME/TSOCKS_PASSWORD 环境变量。

答案3

我正在使用 CentOS6.x 和 yum-3.2.29-81、curl/libcurl 7.19.7-53 并遇到同样的问题。我的 yum 服务器位于防火墙后面,并且希望通过使用 ssh 的 SOCKS5 代理设置来使用 yum。理想情况下,我想在不需要 tsocks、proxychains 或任何其他“socksification”实用程序的情况下执行此操作。

我使用以下命令设置 SOCKS5 连接:

ssh -D 40000 dmz-server

我浏览了 yum python 源代码,发现它们使用了 pycurl 来包装 libcurl(另请注意,所有代理环境变量——http_proxy、HTTP_PROXY、all_proxy、ALL_PROXY 等——最初都是未定义的)。此外,我验证了 ~/.curlrc 是空的,因此它不会污染我的测试结果。

我想看看是否可以让curl 通过socks5 代理进行通信:

curl --socks5 127.0.0.1:40000 http://some-server/some-url

成功返回远程网页,这是一个好兆头——显示 libcurl使用 SOCKS5 代理。但是,定义一个环境变量

http_proxy=socks5://127.0.0.1:40000 

还不够:

http_proxy=socks5://127.0.0.1:40000 curl http://some-server/some-url

失败的。

此时,我改用Python测试程序测试.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()

现在,跑步

./test.py

将无法获取,但正在运行

http_proxy=socks5://127.0.0.1:40000 ./test.py

将要成功获取http://some-server/some-url。所以在我看来,CentOS6 附带的这个(诚然古老的)yum/libcurl 组合没有正确设置 libcurl 中的代理类型。我认为发生的情况是 PROXYTYPE 默认为标准 HTTP 代理,而不是在http_代理环境变量。

无论如何,/usr/lib/python2.6/site-packages/urlgrabber/grabber.py 的以下补丁允许我通过 SOCKS5 代理访问 http:// yum 存储库。在 PyCurlFileObject#_set_opts(self, opts={}) 中,添加:

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)

1205 号线附近,就在之前

# ssl options
if self.scheme == 'https':

随着这一变化,

http_proxy=socks5://127.0.0.1:40000 yum install <package_name>

通过 SOCKS5 ssh 代理成功连接到防火墙另一侧的所有 http:// yum 存储库。

当然,可以导出http_代理shell 中的环境变量,以避免在每次调用之前指定它

答案4

Proxychaines也是您不错的选择!

proxychains.conf首先下载它并在文件中设置您的袜子信息,然后proxyxhanes在您想要使用袜子代理的任何命令之前输入!

相关内容