命令行下使用代理

proxy

对于经常需要依赖国外资源的开发者,终端的下载速度让人抓狂,诸如常见的 wget、curl、git、brew 等命令行工具超慢,甚至无法获取资源,这就需要搭建一个科学上网利器,例如目前流行的shadowsocks,我们配置好 shadowsocks 服务器端后,安装对应系统的客户端便可,然而当你构建的时候还是会很慢,这时你发现系统自带的终端或 iTerm 2 是不走 Socks5 。

因在终端下不支持Socks5代理,只支持http代理,这就需要曲径通幽了。

Mac平台下安装

环境:
OS X 10.12.5
ShadowsocksX-NG 1.5.0

OS X 10.11之后较新的系统默认设置下不会安装成功。苹果在新系统中加入了SIP安全机制,他会阻止第三方程序向系统目录内(/System,/bin,/sbin,/usr(除了/usr/local))进行写操作,sudo也不行。办法是先把SIP关了,等装好软件配置好后再打开SIP。或者改用其他软件。

关闭SIP也麻烦,遂用privoxy这个经典软件,它刚好就是安装在/usr/local内,不需要关闭SIP也可以正常使用。

1. privoxy安装

brew install privoxy

2. privoxy配置

vim /usr/local/etc/privoxy/config
在文件末尾输入:

1
2
listen-address 0.0.0.0:8118
forward-socks5 / localhost:1086 .

第一行设置privoxy监听任意IP地址的8118端口(privoxy的默认端口)。第二行设置本地socks5代理客户端端口,注意不要忘了最后有一个空格和点号。
旧版 ShadowsocksX 创建的 「SOCKS5 代理」端口 默认是 1080,新版 ShadowsocksX-NG 创建的 「SOCKS5 代理」端口 默认改成 1086 升级后别忘了修改代理插件对应的端口。

3. 启动privoxy

因为没有安装在系统目录内,所以启动的时候需要打全路径。
sudo /usr/local/sbin/privoxy /usr/local/etc/privoxy/config

4. 测试shadowsocks

1
2
telnet 127.0.0.1 1086
telnet 127.0.0.1 8118

5. privoxy使用

~/.bashrc~/zshrc中加入以下开关函数,方便使用:

1
2
3
4
5
6
7
8
9
10
11
12
function proxy_off(){
unset http_proxy
unset https_proxy
echo -e "已关闭代理"
}

function proxy_on() {
export no_proxy="localhost,127.0.0.1,localaddress,.localdomain.com"
export http_proxy="http://127.0.0.1:8118"
export https_proxy=$http_proxy
echo -e "已开启代理"
}

执行source ~/.bashrcsource ~/.zshrc使配置立即生效。

7. 开启代理测试

1
2
3
4
~  proxy_on
已开启代理
~  curl ip.cn
当前 IP8.8.8.8 来自:美国

Linux下的安装

环境:
CentOS 7.3.1611

1. 安装shadowsocks、pip、privoxy

请先确保你已经添加了EPEL源,yum repolist

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[root@localhost ~]# yum repolist
已加载插件:fastestmirror
Loading mirror speeds from cached hostfile
* base: mirrors.nju.edu.cn
* elrepo: mirrors.ircam.fr
* epel: mirrors.tuna.tsinghua.edu.cn
* extras: mirrors.njupt.edu.cn
* updates: mirrors.njupt.edu.cn
源标识 源名称 状态
base/7/x86_64 CentOS-7 - Base 9,363
elrepo ELRepo.org Community Enterprise Linux Repository - el 194
epel/x86_64 Extra Packages for Enterprise Linux 7 - x86_64 11,873
extras/7/x86_64 CentOS-7 - Extras 446
updates/7/x86_64 CentOS-7 - Updates 2,089
repolist: 23,965

如果尚未添加,则使用sudo yum -y install epel-release添加EPEL。

使用以下命令安装shadowsocks、pip、privoxy:
$ sudo yum -y install python-pip privoxy
$ sudo pip install shadowsocks

2. 配置

2.1 配置ss

$ sudo mkdir -p /etc/shadowsocks
$ sudo vi /etc/shadowsocks/config.json
config.json配置内容为:

1
2
3
4
5
6
7
8
{
"server":"bot02.rom.mk",(你的代理服务器IP或域名地址)
"server_port":443,(代理服务器上监听的端口号)
"local_port":1080,(本地的监听端口号)
"password":"xxxx",(代理服务器的密码)
"timeout":600,
"method":"aes-256-cfb(加密方式)"
}

若未配置local_port,则默认为1080

2.2 启动ss

后台运行shadowsocks:
启动:sslocal -c /etc/shadowsocks/config.json -d start
停止:sslocal -c /etc/shadowsocks/config.json -d stop

但这样每次重启系统的时候都需要执行启动命令来启动ss,我们可以通过以下方法设置开机自动启动:
vi /usr/lib/systemd/system/sslocal.service
内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=Shadowsocks Server
After=network.target

[Service]
PermissionsStartOnly=true
ExecStartPre=/bin/mkdir -p /run/shadowsocks
ExecStartPre=/bin/chown nobody:nobody /run/shadowsocks
ExecStart=/usr/bin/sslocal -c /etc/shadowsocks/config.json
Restart=on-abort
User=root
Group=root
UMask=0027

[Install]
WantedBy=multi-user.target

执行命令systemctl start sslocal启动ss,
执行命令systemctl status sslocal查看ss状态,如果是active,执行systemctl enable sslocal设置开机自启。
执行reboot重启系统,然后使用systemctl status sslocal查看启动情况,如有异常请根据日志提示解决。

这样我们就能很方便的通过系统命令systemctl来管理ss进程了。

2.2 privoxy配置

$ sudo vi /etc/privoxy/config
在文件末尾输入:
forward-socks5 / 127.0.0.1:1080 .

启动privoxy
$ sudo service privoxy restart

同样的,执行systemctl enable privoxy设置开机启动privoxy

3. 测试

参照Mac下的配置设置开关函数。
使用Telnet测试shadowsocks和privoxy是否正常
telnet 127.0.0.1 1080
telnet 127.0.0.1 8118
可以连接成功说明正常运行。

执行以下命令查看实际效果

1
2
3
4
5
6
7
8
~  proxy_on
已开启代理
~  curl ip.cn
当前 IP8.8.8.8 来自:美国
~  proxy_off
已开启代理
~  curl ip.cn
当前 IP121.69.50.42 来自:北京市 电信通

原理解析

我们终端中的http和https请求通过开关函数转发到了privoxy的8118端口,然后被privoxy转换为socks5协议转发到shadowsocks的1080或1086端口,最后本地运行的shadowsocks客户端与远程shadowsocks服务器通信,从而实现命令下的代理功能。


参考文章:

  1. shadowsocks on Mac OS X
  2. Mac命令行终端下使用shadowsocks翻墙
  3. Shadowsocks+Privoxy打造Linux / Mac socks和http代理
  4. 使用 shadowsocks 加速 Mac 自带终端或 iTerm 2
  5. Mac终端环境走代理
  6. Linux终端下翻墙教程
因为热爱,所以执着。