Permalink
Find file
Fetching contributors…
Cannot retrieve contributors at this time
140 lines (87 sloc) 6.19 KB
layout title date categories tags
post
命令行利用代理执行命令-proxychains
2016-10-23 20:07:36 -0700
IT
Internet Shell Software Proxy Ubuntu Mac

回国后, 用 git 在 github下载上传都慢得像翔一样.. 有些访问amazon云,SourceForge 的也是慢得要死. 很奇怪, 号称100M的电信上这些东西速度只有几十kB/s.. 而家里12M的移动反而很快.. 这个在mac重启后command + R进入网络恢复时也很明显了. 移动很多网站上不去, 但反而很多下载速度可以..

一般地, 使用了SS代理后浏览器上网可以切换代理比较方便, 但是呢, 命令行依然是很尿性.. 有时设了全局代理依然不管用 (尤其在SS客户端上). 然后搜索发现了这个程序proxychains, 他可以在原命令前面另加一个代理程序来运行该命令, 从而使得本来不能配置运行代理的程序可以使用代理运行.

该程序原理是通过和网络相关libc动态相关库的函数进行绑定(hook), 使这些函数走一个预加载的动态库并重定向链接. 因为这个工作原理, 他只能对动态连接的程序起效(就是调用动态库的), 另外proxychains和被代理程序需要调用同一个动态连接库.

该程序如名字, 可以使用代理链(一般我们只采用一个代理), 即可以代理接一个代理传输信号, 这样可以使得使用身份更隐蔽. 另外这种代理链可以混杂各种不同的协议, 如HTTP+SOCKS4+SOCKS5的混合. 这种"代理链"的方式可以轻松帮你解决 外网 -> 网关机 -> 内网机 的internet 访问 intranet的功能.

该程序现在主要在Github上维护, 新版本为 ng 版(更新到4.X), 另外也可以从SourceForge下载. 另外原版旧版的Github也有到4.2的, 旧版的sourceforge 上有旧的3.1版. 不过推荐使用最新版本啦~

安装

proxychains: 执行命令时

  • Ubuntu 里面: sudo apt-get install proxychains 装的是3.1的旧版.
  • Mac 里面: brew install proxychains-ng
# needs a working C compiler, preferably gcc
./configure
make
# install proxychains4 and dy-lib
# /usr/local/bin/proxychains4
# /usr/local/lib/libproxychains4.dylib
sudo make install
# installs /etc/proxychains.conf
sudo make install-config 

配置

配置文件

如果是ubuntu或者直接安装, 配置文件一般是 /etc/proxychains.conf , 如果是Mac用brew安装, /usr/local/Cellar/proxychains-ng/4.11/etc/proxychains.conf. (其中版本号会有区别,这里是4.11)

一般地, 配置文件查找顺序为:

  1. ${PROXYCHAINS_SOCKS5} 环境变量定义的端口
  2. ${PROXYCHAINS_CONF_FILE} 定义的配置文件或者-f 选项指定的文件
  3. ./proxychains.conf
  4. ${HOME}/.proxychains/proxychains.conf
  5. ${sysconfdir}/proxychains.conf (e.g. /etc/proxychains.conf or /usr/local/etc/proxychains.conf or /usr/local/.../etc/proxychains.conf)

代理模式

代理模式在配置文件最开头, 有四种模式供选择, 关闭某模式就是注释掉就可以了. 默认模式是strict_chain

  • dynamic_chain,按照列表中出现的代理服务器的先后顺序组成一条链,如果有代理服务器失效,则自动将其排除,但至少要有一个是有效的。
  • strict_chain,按照后面列表中出现的代理服务器的先后顺序组成一条链,要求所有的代理服务器都是有效的
  • round_robin_chain, 类似dynamic_chain, 但是只读取chain_len 长度
  • random_chain,列表中的任何一个代理服务器都可能被选择使用,这种方式很适合网络扫描操作(参数chain_len对random_chain有效)。

默认是选择的strict_chain,一般我们不用多个代理造成链, 只要一个就好了, 所以一般不改变代理模式部分。

配置代理服务器

在最下面的部分就是代理服务器列表配置了, 支持HTTP, SOCKS4, SOCKS5, 貌似新版本还支持HTTPS.

例如:

对于SS代理, 在最后一行加入这句话 socks5 127.0.0.1 1080. 另外把socks4 127.0.0.1 9050 一行# 注释掉或者直接删掉.

http 12.34.56.78 8080 user passwd 可以配置有用户名密码验证的HTTP代理.

一般地, http 采用8080端口, 而 socks4/socks5 采用1080 端口.

使用

使用就很简单了, 就是在原有的运行命令前面加入proxychains4, 例如我要wget 进行代理抓取

proxychains4 wget www.google.com

指定配置文件的话, 是:

proxychains4 -f proxy.conf wget www.google.com

例如结合ssh隧道:

ssh -fN -D 4321 some.example.com
PROXYCHAINS_SOCKS5=4321 proxychains zsh

这个例子使用ssh隧道来用某个服务端4321端口作动态代理, 然后用 PROXYCHAINS_SOCKS5 来指明端口后直接用proxycains 来代理一个zsh, zsh所有命令均走这个ssh代理. 注意这里走的都是 SOCKS5 代理.

如果嫌打那么长命令很麻烦, 那还可以在启动sh配置文件.bashrc 里面加入:

alias pc4=proxychains4

这样只要用pc4 wget www.google.com 就可以进行代理咯.

附录: 一些常用命令自带的代理使用

git

电信访问git来下载那就是一个慢! 所以代理是需要的!

做法很简单, 运行两条命令将代理加到配置.gitconfig 就可以了.

git config --global http.proxy 'socks5://127.0.0.1:1080'
git config --global https.proxy 'socks5://127.0.0.1:1080'

注意这是对git全局都使用代理, 但如果使用gitcafe 或者coding.io 这些国内的git仓库, 代理反而走远路了. 这时proxychains就起到作用啦.

wget 和 curl

wget 使用 -Y on 来打开代理设置, 用 -e "http_proxy=http://ip_address:port" 来指定代理地址.

wget -Y on -e "http_proxy=http://10.0.0.172:8080" "www.google.com"

遗憾的是, wget 只能采用http代理, 不能使用 socks5 代理.

curl 使用 -x ip_address:port 来指定代理服务器IP和端口.

curl -x 10.0.0.172:8080 www.google.com

--socks5 ip:port--socks5-hostname hostname:port 可以使用socks5 来代理

TODO: 更多方式请待续..