命令行翻墙

痛点

啥也不说,先上图。这样的痛苦 国内程序员应该都体会过
git clone

共具介绍

1
2
3
对于技术人员shadowsocks应该不陌生,shadowsocks实质上也是一种socks5代理服务,类似于ssh代理。

与vpn的全局代理不同,shadowsocks仅针对浏览器代理,不能代理应用软件,比如curl、wget等一些命令行软件。如果要让终端下的命令行工具都能支持代理,这时我们就要用上proxychains-ng这款神器了。

什么是 proxychains-ng

项目主页:https://github.com/rofl0r/proxychains-ng

proxychains-ng 介绍

proxychains ng (new generation) - a preloader which hooks calls to sockets in dynamically linked programs and redirects it through one or more socks/http proxies. continuation of the unmaintained proxychains project.

proxychains-ng是proxychains的加强版,主要有以下功能和不足:

  • 支持http/https/socks4/socks5
  • 支持认证
  • 远端dns查询
  • 多种代理模式
  • 不支持udp/icmp转发
  • 少部分程序和在后台运行的可能无法代理

proxychains-ng 原理

简单的说就是这个程序 Hook 了 sockets 相关的操作,让普通程序的 sockets 数据走 SOCKS/HTTP 代理。

其核心就是利用了 LD_PRELOAD 这个环境变量(Mac 上是 DYLD_INSERT_LIBRARIES)。

在 Unix 系统中,如果设置了 LD_PRELOAD 环境变量,那么在程序运行时,动态链接器会先加载该环境变量所指定的动态库。也就是说,这个动态库的加载优先于任何其它的库,包括 libc。

ProxyChains 创建了一个叫 libproxychains4.so(Mac 上是 libproxychains4.dylib)的动态库。里面重写了 connect、close 以及 sendto 等与 socket 相关的函数,通过这些函数发出的数据将会走代理,详细代码可以参考 libproxychains.c。

在主程序里,它会读取配置文件,查找 libproxychains4 所在位置,把这些信息存入环境变量后执行子程序。这样子程序里对 socket 相关的函数调用就会被 Hook 了,对子程序来说,跟代理相关的东西都是透明的。

安装 proxychains-ng

源代码安装

1
2
3
4
5
git clone https://github.com/rofl0r/proxychains-ng
./configure --prefix=/usr --sysconfdir=/etc
make
make install
make install-config (安装proxychains.conf配置文件)

MAC下安装

1
brew install proxychains-ng

配置 proxychains-ng

proxychains-ng默认配置文件名为proxychains.conf

  • 通过源代码编译安装的默认为/etc/proxychains.conf
  • Mac下用Homebrew安装的默认为/usr/local/etc/proxychains.conf

proxychains-ng的配置非常简单,只需将代理加入[ProxyList]中即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ vim proxychains.conf

quiet_mode
dynamic_chain
chain_len = 1 #round_robin_chain和random_chain使用
proxy_dns
remote_dns_subnet 224
tcp_read_time_out 15000
tcp_connect_time_out 8000
localnet 127.0.0.0/255.0.0.0
localnet 10.0.0.0/255.0.0.0
localnet 172.16.0.0/255.240.0.0
localnet 192.168.0.0/255.255.0.0

[ProxyList]
socks5 127.0.0.1 1086
http 127.0.0.1 1087

proxychains-ng支持多种代理模式,默认是选择 strict_chain。

  • dynamic_chain :动态模式,按照代理列表顺序自动选取可用代理
  • strict_chain :严格模式,严格按照代理列表顺序使用代理,所有代理必须可用
  • round_robin_chain :轮询模式,自动跳过不可用代理
  • random_chain :随机模式,随机使用代理

    proxychains-ng 使用

proxychains-ng用法非常简单,使用格式如下:

1
proxychains4 程序 参数

proxychains-ng 测试

1
proxychains4 curl ip.sb

proxychains-ng 优化

给proxychains4增加一个别名,在 /.zshrc或/.bashrc末尾加入如下行:

1
alias pc='proxychains4'

以后就可以类似$ pc curl http://www.google.com 这样调用proxychains4,简化了输入。

效果