如何在 yum 中使用 SOCKS 代理?

max*_*zig 15 yum

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
Run Code Online (Sandbox Code Playgroud)

但是如何指定 SOCKS 代理呢?

我认为以上仅适用于普通的 HTTP 代理......

小智 25

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

proxy=socks5://ip:port

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

proxy=socks5h://ip:port

在 Fedora 21 上使用 yum 3.4.3 对我有用。


max*_*zig 7

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

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

$ export TSOCKS_CONF_FILE=$HOME/.tsocks.conf
$ cat .tsocks.conf
server = 127.0.0.1
server_port = 1080
$ tsocks yum ...
Run Code Online (Sandbox Code Playgroud)

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


小智 5

我正在使用 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
Run Code Online (Sandbox Code Playgroud)

我在 yum python 源代码中闲逛,看到它们使用包装 libcurl 的 pycurl(还请注意所有代理环境变量——http_proxy、HTTP_PROXY、all_proxy、ALL_PROXY 等——最初是未定义的)。此外,我确认 ~/.curlrc 是空的,所以它没有污染我的测试结果。

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

curl --socks5 127.0.0.1:40000 http://some-server/some-url
Run Code Online (Sandbox Code Playgroud)

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

http_proxy=socks5://127.0.0.1:40000 
Run Code Online (Sandbox Code Playgroud)

还不够:

http_proxy=socks5://127.0.0.1:40000 curl http://some-server/some-url
Run Code Online (Sandbox Code Playgroud)

失败的。

此时,我切换到使用 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()
Run Code Online (Sandbox Code Playgroud)

现在,运行

./test.py
Run Code Online (Sandbox Code Playgroud)

将无法获取,但正在运行

http_proxy=socks5://127.0.0.1:40000 ./test.py
Run Code Online (Sandbox Code Playgroud)

成功获取http://some-server/some-url。所以在我看来,CentOS6 附带的这个(公认的古老)yum/libcurl 组合没有正确设置 libcurl 中的代理类型。我认为正在发生的事情是 PROXYTYPE 默认为标准 HTTP 代理,而不是在http_proxy环境变量中指定的 URL 中识别 socks5:// 方案。

无论如何,/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)
Run Code Online (Sandbox Code Playgroud)

在 1205 行附近,就在之前

# ssl options
if self.scheme == 'https':
Run Code Online (Sandbox Code Playgroud)

有了这个变化,

http_proxy=socks5://127.0.0.1:40000 yum install <package_name>
Run Code Online (Sandbox Code Playgroud)

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

当然,可以在自己的 shell 中导出http_proxy环境变量,以避免在每次调用yum之前指定它。


enz*_*tib 3

tsocks应用程序可以sockify所有其他应用程序

tsocks app args
Run Code Online (Sandbox Code Playgroud)