mac下宿主机和docker内go get代理设置

144
作者 手小
2016.08.10 12:44* 字数 1410

学golang很痛苦的一点是go get不成功,虽然有github.com/golang镜像和gopm.io,但如果是做一些开源项目,想直接编译代码,老外直接用官网的包,所以我们还是得go get golang.com/x/

下面介绍一些我尝试过的代理方法:

我直接用的shadowsocks付费服务,本地安装了shadowsocks客户端,对于mac和windows系统,安装client之后浏览器就能直接上网,linux还需要对浏览器做配置。

先说我遇到的场景:

mac,安装了docker,docker里跑的是ubuntu,现在想在ubuntu里go get编译golang代码。

我以前在linux下成功配置过redsocks+shadowsocks做全局代理,试了发现原来的办法不行了,原因是docker内没法用iptabels设置请求转发,因为对docker不熟,花了很长时间没成功,决定放弃,就在本地mac下开发。

以下是我以前的方法:

linux全局代理redsocks+shadowsocks

在本地,我任然是想用redsocks+shadowsock进行配置,redsocks可以直接

brew install redsocks

但运行的时候抱解析配置文件错误:

file parsing error at line 73: invalid `redirector` set

file parsing error at line 73: section->onexit failed

发现这下面这行代码:

/* possible `redirector' values are:

*  iptables  - for Linux

*  ipf        - for FreeBSD

*  pf        - for OpenBSD

*  generic    - some generic redirector that MAY work

*/

redirector = iptables;

从这儿可以看出redsocks没有直接支持mac,发现mac下有pfctl可以做请求转发,于是我简单地把iptables改为pf,报同样的错误。

看起来想用redsocks没那么简单,我又发现mac下可以用proxychains代理请求

brew install proxychains

安装成功,按照网上的教程在配置文件/usr/local/etc/proxychains.conf里添加了:

socks5  127.0.0.1 1080

使用命令proxychains4 go get... 

仍然找不到相应的包,后来发现proxychains4对除了go get以外的其他命令都生效,git、curl、wget等,但就是go get不行,因为go get先要获取一个东西,然后再用git下载代码,前面的那一步proxychains4没有处理,所以会失败。

这篇文章里说了原因: go get socks proxy设置

proxychains和proxychains-ng无法代理go get,通过抓包,go get并没有使用proxychains的代理,根据我的分析,这是由于proxychains是通过修改动态加载库来实现代理,但go是静态编译的,因此,proxychains无法代理go。go get获取包信息后,使用git来下载代码时,git是可以使用proxychains的。

同时,里面介绍了另外一种方法:privoxy,可以把socks代理转换为http代理 

brew install privoxy

编辑配置文件:vi /usr/local/etc/privoxy/config;保证下面的内容正确:

forward-socks5 / 127.0.0.1:1080 .

listen-address 127.0.0.1:8118

# local network do not use proxy

forward 192.168.*.*/ .

forward 10.*.*.*/ .

forward 127.*.*.*/ .

最后重启privoxy服务: 

brew services restart privoxy

使用的时候,先设置代理:

export http_proxy=http://127.0.0.1:8118

export https_proxy=http://127.0.0.1:8118

!!! 终于,可以 go get了。


用付费shadowsocks已经一年多了,其实一直有一些疑问:

1  为什么安装好之后,浏览器可以上网,但终端不行?

官方解释mac和windows下使用了系统代理,但我还是不清楚,ShadowSocks(影梭)不完全指南里说faq里有,但没找到。我猜测,要么是我用的定制版shadowsocks client里面做了一些设置,要么是mac或windows系统代理可以单独处理浏览器的请求。

2  为什么没有一个客户端可以直接把redsocks+shadowsock client 或 privoxy + shadowsocks client的功能集成在一起,每次都要设置两个软件太麻烦了。

以下是shadowsocks的原理相关文章:

写给非专业人士看的shadowsocks简介

shadowsocks 源码解释

ShadowSocks协议的弱点分析和改进

另外,还有其他一些代理工具,比如 Proxifier,还没试过,以后有机会试试。

tsocks代理


20160813更新...

上次docker里go get不成功,今天换了一种思路成功了。

之前的逻辑是在ubuntu docker里配置redsocks+shadowsocks做全局代理,但因为iptables的原因没成功。

现在我的mac上已经通过privoxy+shadowsocks配置了http proxy。只需要在container里把请求转发这个proxy的端口上就行了,http proxy只需要在命令行set http_proxy=就OK,

现在的问题是对于docker中的container来说,它的宿主机的IP是多少。因为我用的默认方式运行run container【默认network选项是--net=bridge】,查IP

/sbin/ip route|awk '/default/ { print $3 }’

这个方法查出来的IP用不了,原因不明。这种方式查出来的IP是 172.17.0.2/16,还可以用这个命令查看IP:

ip addr show eth0

后来发现官网还可以配置另一种连网方式,run container的时候加上参数:

--net=host, 这样的话查IP发现是 192.168.xxx,设置代理的时候:

export http_proxy=http://192.168.65.1:8118

export https_proxy=http://192.168.65.1:8118

这就OK了,go get



本文参考文章已加链接

点滴