站内链接:

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 翻墙

Shadowsocks

Shadowsocks

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

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

Privoxy

ssr

让终端也能实现 PAC 流量分发.
在设置 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, 连接谷歌测试, 当然, 也可以使用第四章
的方法进行测试.

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

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

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

Shadowsocks 配置

浏览器代理插件

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

AutoSwitch

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

  • 负载均衡
  • 多个 IP

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

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

参考