命令行工具都使用shadowsocks代理上网

    shadowsocks是一款使用socks5协议的加密代理工具,它配合chrome的SwitchyOmega插件,可以很完美的进行浏览器科学上网,但是有些时候需要在命令行下科学上网,用来更新一些软件包或者下载一些软件。我目前从网络上整理出2种方式可用在终端下使用shadowsocks进行科学上网。

准备工作

  1. 操作系统:OSX 10.X.X。
  2. 已经安装shadowsocks并且登陆可用的帐号。

第一种方式

使用proxychains-ng工具搭配shadowoskcs

安装

  • 使用brew安装proxychains=ng
1
brew install proxychains-ng
  • 更改proxychains-ng配置文件
1
vim /usr/local/Cellar/proxychains-ng/4.11/etc/proxychains.conf

在文件末尾增加:socks5 127.0.0.1 1080

  • 软连接配置文件位置
1
ln -s /usr/local/Cellar/proxychains-ng/4.11/etc/proxychains.conf /etc/proxychains.conf

使用对比

  • 使用proxychains4 访问ip.gs
1
2
➜ ~ proxychains4 curl ip.gs
当前 IP:106.x87.x3.xx 来自:日本东京都东京linode.com kddi.com
  • 不使用proxychains 访问ip.gs
1
2
➜ ~ curl ip.gs
当前 IP:10x.8x.5x.4x 来自:中国上海上海 电信

局限性

必须使用proxychains4 command 来使用,不可以让整个终端程序自动使用shadowsocks流量

第二种方式

前面说到shadowosocks的基于socks5协议的,我们可以把socks5协议转换为http协议,并且在终端下设置如下常量, export http_proxy=http代理地址, export https_proxy=http代理地址,说明一下,如果终端环境存在上面两个环境变量,那么大部分程序会在访问网络的时候自动使用上面代理地址,达到我们的科学上网目的。

使用polipo转换shadowsocks为http代理

安装

  • 使用brew 安装 polipo
1
brew install polipo
  • 更改配置文件
1
vim /usr/local/opt/polipo/homebrew.mxcl.polipo.plist
  • 增加了一行配置
1
<string>socksParentProxy=localhost:1080</string>
  • 修改后的配置文件如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>homebrew.mxcl.polipo</string>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>
<key>ProgramArguments</key>
<array>
<string>/usr/local/opt/polipo/bin/polipo</string>
<!--增加了如下一行-->
<string>socksParentProxy=localhost:1080</string>
</array>
<!-- Set `ulimit -n 65536`. The default macOS limit is 256, that's
not enough for Polipo (displays 'too many files open' errors).
It seems like you have no reason to lower this limit
(and unlikely will want to raise it). -->
<key>SoftResourceLimits</key>
<dict>
<key>NumberOfFiles</key>
<integer>65536</integer>
</dict>
</dict>
</plist>
  • 启动polipo服务
1
brew services start polipo
  • 当前终端会话**全局设置

我使用的是zsh所以在~/.zshrc 中加入两行配置:

1
2
export http_proxy=http://localhost:8123
export https_proxy=$http_proxy

使用其他shell的用户请自行添加到对应的终端配置文件

  • 在终端下临时配置
1
2
3
vim ~/.zsh
## 添加如下一行在文件末尾
alias hp="http_proxy=http://localhost:8123"

重新载入配置

1
source ~/.zshrc

使用

  • 会话全局配置使用
1
2
3
4
5
6
7
8
wget https://www.google.com
# 看是否可以正常下google首页
curl ip.gs
# 当前 IP:106.x87.x3.xx
# 来自:日本东京都东京linode.com kddi.com
curl --noproxy '*' ip.gs
#加上 --noproxy 参数为不使用代理访问ip.gs
# 当前 IP:10x.8x.5x.4x 来自:中国上海上海 电信
  • 会话临时配置使用
1
2
3
4
5
hp curl ip.gs #使用代理
# 当前 IP:106.x87.x3.xx 来自:日本东京都东京linode.com kddi.com
curl ip.gs
# 当前 IP:10x.8x.5x.4x 来自:中国上海上海 电信

总结

  • polipo 是将shadowsocks的socks5转换成常用的http代理,终端下大部分软件都约定俗称的使用http_proxy和https_proxy环境变量,所以在终端下使用这种方式做代理更为灵活。
  • proxychains-ng 本质上是一个预载入程序,hook程序中的网络相关libc函数,并且通过socks4/5, http来代理执行程序的网络流量。
  • 以上两种方式都可以使终端能够访问墙外资源,并且根据自己需要合理搭配使用。