Linux使用Proxychains实现终端代理
在Linux上搭建代理工具服务端实现代理,网上有大量的教程文章,相信很多人都有试过。但是将代理工具作为linux的客户端代理可能很多人都没太弄明白。恰好最近和朋友在交流时遇到了这个问题。
情况大致:有一台阿里/腾讯云国内的vps,或者自己内网的一台linux主机。想用代理工具作为linux客户端实现者代理加速下载资源的情况。
前提:本文适合已经搭建了代理工具服务端或有现成节点的小伙伴。
假设大家平时都是经常使用v2rayN作为windows上的代理客户端工具。
其他的客户端工具应该也有类似导出功能。
现在在vps上安装v2ray程序。现在安装v2ray和以前的一键脚本有所不同。补充一下在linux上v2ray的client和server是一体,只是根据不同配置执行而已。
github地址: https://github.com/v2fly/fhs-install-v2ray
直接执行下面的命令进行安装。
bash <(curl -L https://raw.githubusercontent.com/v2fly/fhs-install-v2ray/master/install-release.sh)
这样就表示安装成功了,脚本是把v2ray添加到了环境变量了的。默认的v2ray配置文件是在 /usr/local/etc/v2ray/config.json 目录下。
所以我们把上面我们在V2rayN上面导出的客户端配置文件进行替换即可。
然后启动v2ray即可,因为是导出的客户端配置文件通常不会出现什么问题。
systemctl start v2ray
systemctl status v2ray
查看端口监听状态。
netstat -antup | grep 1080
说明linux上的v2ray客户端已经启动成功了。因为v2ray默认是代理的socks的流量。所以linux上其他的程序要想实现代理都要把流量转发到1080端口才行。当然有些程序是支持socks代理的比如curl。
但是这种方式也有局限,就是我每次代理都需要指定socks代理。这里有另外一种让终端走代理(不推荐)。
export http_proxy=”socks5://127.0.0.1:1080″
export https_proxy=”socks5://127.0.0.1:1080″
通过这种方式设置之后像curl这种支持socks代理的就会直接转发,但是也存在局限,以curl和wget对比。
可以看到这种方式curl是代理成功了的,但是wget却报错了不支持socks5。这很显然并没有达到我们的目的。而我们想要实现的不就是让linux上的大部分程序都走代理吗,不然也太鸡肋了。
所以让V2ray配合Proxychains就是非常棒的实现方式。就需要先安装Proxychains。
但很多国内的主机本身从github上下载的速度就巨慢,所以在使用Proxychains之前可以可以给git配置代理。
yum install -y git
git config –global http.proxy ‘socks5://127.0.0.1:1080’
git config –global https.proxy ‘socks5://127.0.0.1:1080’
先让git用上代理。
git clone https://github.com/rofl0r/proxychains-ng.git
cd proxychains-ng/
make && make install && make install-config
yum -y install proxychains-ng
现在已经能支持yum安装了
此时proxychains安装成功了,修改对应的配置文件。
vim /usr/local/etc/proxychains.conf
在文件的末尾添加上 socks5 127.0.0.1 1080 保存即可。
在我们想要代理的程序前面加上proxychains4即可实现代理,不管程序本身是否支持代理都可以代理转发。
另外我还写了一个简单的Python脚本验证了可用性。
经过一番测试发现proxychains对大部分程序都是可以正常代理的,但golang写的程序竟然不行,小伙伴可以自己试试。
proxychains的原理:
简单的说就是这个程序 Hook 了 sockets 相关的操作,让普通程序的 sockets 数据走 SOCKS/HTTP 代理。其核心就是利用了 LD_PRELOAD 这个环境变量(Mac 上是 DYLD_INSERT_LIBRARIES)。在 Unix 系统中,如果设置了 LD_PRELOAD 环境变量,那么在程序运行时,动态链接器会先加载该环境变量所指定的动态库。也就是说,这个动态库的加载优先于任何其它的库,包括 libc。ProxyChains 创建了一个叫 libproxychains4.so的动态库。里面重写了 connect、close 以及 sendto 等与 socket 相关的函数,通过这些函数发出的数据将会走代理,详细代码可以参考 libproxychains.c。
其实对于LD_PRELOAD预加载劫持的trick我在以前也简单研究过。
赞赏微信赞赏支付宝赞赏
6条评论