1 Introduction

环境: ubuntu, mac

代理中有介绍过代理相关知识, 那么如何让浏览器和终端都
能成功的访问国外网站呢? 如何将PAC和终端结合在一起, 实现可控的终端翻墙呢?

考虑如下的终端应用场景1:

  • 在国内运行服务器
  • 抓取国外的数据
  • 没有专用的正规的VPN, 或者说买不起

考虑大部分人通用的应用场景2:

  • 我有一个浏览器
  • 我想上谷歌

是不是想起使用http proxy, 对不起, 你太小看我们伟大的GFW了, 分分钟给你RESET掉, 有时候
又是正常访问, 让你一开始以为是自己的配置有问题.

对于第二个需求, 目前通常使用浏览器/app + socks5的方式来实现科学上网, 这个在后面章节讲述.
对于第一个需求, 也是使用SSR方式来实现, 因为无奈, 因为没办法(VPN太贵, HTTP代理不让走),
也许有其他方式(比如隧道IP技术?), 但是本人不是运维出身(我去问公司的运维, 也不知道, 哭泣..), 所以
目前都是采用socks5加密的方式来进行翻墙操作.

在终端上翻墙, 必须提供专门的socks5转http的应用, 浏览器则默认可以使用socks5进行流量转发操作.
这时候就是polipo, privoxy等工具闪亮登场的时刻了.

为了上面的两个需求, 我前后总共使用了两种方案:polipo+自动切换SSR, privoxy+自动切换SSR,
来进行翻墙:

  • 全局代理: shadowsocks, polipo, http_proxy环境变量设置
  • 自动代理: shadowsocks, privoxy, gfwlist, http_proxy环境变量设置

当然, 如果你只是想用浏览器进行翻墙操作, 安装一个Shadowcosks或者Shadowsocks-NG, 然后就
可以安心的输入谷歌了.

下文将从0开始, 一步步为你实现:

  • 浏览器全局翻墙
  • 浏览器PAC翻墙
  • 终端翻墙
  • 终端PAC翻墙
  • 终端自动切换SSR翻墙

2 Shadowsocks

2.1 Shadowsocks

犹记得, 第一次接触ubuntu系统, 那时候对代理相关知识一点都不理解, 当然现在也是一知半解, 那时候就是
使用python安装了shadowsocks, 然后直接在终端运行sslocal命令, 然后在浏览器配置一个socks5, 实现
了一个最简单的翻墙: 浏览器 + socks5 全局代理.

关于ssserversslocal的命令见vps中的介绍.

2 Privoxy

让终端也能实现PAC流量分发

2.1 ssr

在设置PAC之前, 当然需要先配置SSR, 对于MAC, 则下载一个客户端即可, 对于ubuntu, 最好还是使用
sslocal客户端, shadowsocks-qt5太不稳定了, 流量一大, 可能会奔溃, 具体原因我不太清楚.

这里就简单的说一下ubuntu上的配置, 更加详细的说明见vps说明.

首先, 你肯定有一个SSR服务器, 而且在墙外, 这个我就不介绍了, 请自行谷歌或者看我相关文章.

然后, 配置一个SSR Local连接配置文件, 取名为: hk_1.json

1
2
3
4
5
6
7
8
9
10
{
"server": "1.2.3.4",
"server_port": 8989,
"method": "aes-128-cfb",
"password": "123456",
"local_address": "127.0.0.1",
"local_port": 1080,
"fast_open": true,
"workers": 4
}

最后, 利用sslocal, 连接远端SSR 服务器, 配置浏览器, 看看是否能够正常翻墙:

1
sslocal -c /etc/ssr/hk_1.json >> /data/ssr/sslocal.log 2>&1 &

在火狐或者谷歌上设置代理, 127.0.0.1:1080, 连接谷歌测试, 当然, 也可以使用第四章
的方法进行测试.

2.2 privoxy

在能够正常翻墙之后, 此时使用终端仍旧不能正常的翻墙, 即使浏览器也是走全局代理(MAC用户忽略).
那么, 如何让终端也能够翻墙呢? 如何能够基于PAC走自动代理呢? 不急, 让我们一步步来.

首先, 让终端走代理, 类似polipo, 但是polipo是类似Squid, 本身目的是作为http代理而存在的,
通过一些配置, 可以通过配置, 转化SOCKS流量, 这点类似privoxy.
另外, 在MAC下使用shadowsocksX-NG并且配置环境变量export http_proxy=http://127.0.0.1:1087,
此时终端所有流量也是走全局的.

这里仅仅介绍privoxy配置:

1
2
3
4
5
6
7
8
9
10
# 安装
sudo apt-get install privoxy

# 添加socks5转发
echo 'forward-socks5 / 127.0.0.1:1080 .' >>/etc/privoxy/config

# Linux 启动
systemctl restart privoxy.service
systemctl -l status privoxy.service
netstat -an | grep 8118

另外, Mac下的配置

1
2
3
4
5
6
7
brew install privoxy
echo 'forward-socks5 / 127.0.0.1:1080 .' >>/usr/local/etc/privoxy/config
# 对于shadowsocksX-NG, socks5监听端口为1086, 所以应该更改上面配置为
echo 'forward-socks5 / 127.0.0.1:1086 .' >>/usr/local/etc/privoxy/config
privoxy /usr/local/etc/privoxy/config
ps aux | grep privoxy
netstat -an | grep 8118

完成上面的配置, 那就只要配置环境变量http_proxy就能设置一个全局代理了.

1
2
3
4
5
6
7
proxy="http://127.0.0.1:8118"
export http_proxy=$proxy
export https_proxy=$proxy
alias unsetproxy='unset http_proxy; unset https_proxy'
alias setproxy='export http_proxy='$proxy'; export https_proxy='$proxy''
# 表示不仅过privoxy代理的地址或者域名, 通过,分隔, 类似PAC
export no_proxy="localhost, 127.0.0.1, ::1"

之后就可以使用第四张方法测试代理IP, 或者直接访问curl -s ip.sb获取代理IP

2.3 gfwlist

gfwlist是由AutoProxy官方维护的,
由众多网民手机的防火墙屏蔽列表, 在终端上需要经过提供shell转换脚本, 以便终端
能够基于PAC进行自动代理.
注意, macos版本和linux因为命令的不同, 生成gfwlist.action的命令是不同的

macOS配置:

1
2
3
4
5
6
7
8
9
10
11
# 下载转换脚本
curl -4sSkLO https://raw.github.com/zfl9/gfwlist2privoxy/master/gfwlist2privoxy-mac-zsh
# 生成action
zsh gfwlist2privoxy-mac-zsh 127.0.0.1:1086
# 拷贝并配置
cp -af gfwlist.action /usr/local/etc/privoxy/
echo "actionsfile gfwlist.action" >> /usr/local/etc/privoxy/config
# 重新启动provoxy
ps -ef|grep privoxy|grep local|awk '{print $2}'|xargs kill -9
privoxy /usr/local/etc/privoxy/config
netstat -an | grep 8118

其中gfwlist.action需要增加直连配置, 这里一直有疑惑? 默认不是走直连吗? 但是有时候访问
国内流量会走代理, 这点一直有点不明白, 这里先显式的指出特定的域名需要走国内, 配置
如下:

1
2
3
4
{+forward-override{forward .}}
.baidu.com
.aliyun.com
tencentyun.com

3 Polipo配置

使用场景: 对于浏览器或者其他应用, 都可以使用socks5来进行代理访问.

  • 对于终端工具brew, curl, 一般都是基于http/https协议来进行通信, 此时就无法使用代理.
  • 对于linux上的应用, 例如python, 需要访问外部网络, 此时就需要机遇http/https进行包的请求获取.

对于此类基于shadowsocks非图形化版本, 本身不内置http/https网页代理配置的情况, 需要增加一个额外的适配器,
以能合理的兼容socks5和http, 这里需要在终端应用和socks5之间建立一个http/https和socks5互相通信的桥梁:
polipo.
注意, 这里仍旧使用SOCKS5作为外部通信出口(shadowsocks-ng中的全局配置), 而在shadowsocks-ng等图形化应用中, 则直接
更改系统代理配置, 提供自动代理配置, 作为流量出口.
当然, 对于自动代理配置的部分访问外部网络的流量, 最终还是通过socks5来完成, 这其中shadowsocks-ng则默认做了
http->socks5的流量转换工作.

适配器–结构型模式, 作为两个不兼容接口之间的桥梁, 结合两个独立的功能, 以便一起工作.
关于polipo的安装等详细配置具体见参考网址, 这里仅仅标注出重点配置:

1
2
# 设置polipo的监听端口为1080(同shadowsocks保持一致)
socksParentProxy = "localhost:1080"

polipo的默认http端口为8123, 此时需要配置环境变量:

1
export http_proxy=http://127.0.0.1:8123;export https_proxy=http://127.0.0.1:8123

如果不想设置全局作用范围, 则在相应命令的前面加上如上配置即可, 在配置全局作用范围之后,
此时可以通过curl进行测试IP: curl -s ip.cn

4 Shadowsocks配置

4.1 浏览器代理插件

4.2 Shadowsocks

对于shadowsocks-ng, 本身就支持对http/https的包转换, 无需额外的应用polipo以适配通信, 在shadowsocks-ng偏好设置
中可以得知http的通信端口为1087, 此时可以在终端配置http_proxy代理变量:

1
export http_proxy=http://127.0.0.1:1087;export https_proxy=http://127.0.0.1:1087

此时可以通过curl进行测试IP: curl -s ip.cn

5 AutoSwitch

polipo全局代理或者上面的privoxy配置结束后, 这时就已经
能够正常的在终端访问国外网页, 但是这仅仅是对个人用户而言(实际上用SSR切换对项目而言是一种
非常挫的构建方式), 对于一个建议的模拟提交项目, 需要增加多个SSR服务器, 以实现:

  • 负载均衡
  • 多个IP

关于多个SSR, 以及自动分流, 这个配置我这边暂时没有找到.
关于多个IP进行网站访问, 避免被检测出来, 这里使用取巧的方式, 通过crontab来自动
的切换SSR服务器, 但是实际上仍旧仅仅是一个出口IP, 只是定时变换而已. 其中自动切换SSR服务器的
脚本如下:
ssr-autoswitch

之后创建一个crontab定时任务即可实现自动的SSR切换了.

参考:

ss-local终端代理