通过树莓派使局域网设备访问 shadowsocks 代理
目录
光这篇文章的名字我就觉得很拗口,不过想来想去也没太好的句子组织方式 …
言归正传,这篇博文主要目的是描述如何在局域网内通过树莓派来搭建一个代理服务器,之后使得像手机或者 iPad 这类的设备可以通过设置代理到树莓派来实现科学上网。这篇教程主要包含了以下几个步骤:
- 在墙外设置一个 shadowsocks 服务器端;
- 将树莓派作为一个 shadowsocks 客户端并且连接到上面的服务端上;
- 通过 polipo 把 shadowsocks 的 socks5 代理转成 HTTP 代理;
- 配置 PAC 文件,使得终端设备(此处指手机或者iPad)可以实现智能域名代理功能。
1. 配置shadowsocks服务器
这一步的选择其实比较多:
- 如果你不想自己购买服务器,那么可以直接购买别人提供的 shadowsocks 服务,一般出售 shadowsocks 服务的人都会提供给你服务器的地址、端口号、shadowsocks 密码等等信息,获取到这些信息之后,你就算拥有了一个 shadowsocks 服务了。
- 如果你拥有了一台墙外的服务器并且想自己搭建 shadowsocks 服务,那么可以参考这里,这一部分的教程相当多,不多说了。
2. 设置树莓派作为 shadowsocks 客户端
我的树莓派是连在无线路由器上的,我可以直接在局域网内通过 SSH 连接到树莓派上进行相关的操作。
安装 Python 的包管理工具 pip,如果已安装,则略过这一步:
apt-get install python-pip安装 shadowsocks 客户端:
pip install shadowsocks新建一个文件,位置和名称没有限制(文件后缀名最好为 json),比如我在
/home/pi下新建一个文件 ss.json,在文件中输入如下内容:{ "server": "xxx.xxx.xxx.xxx", "server_port": 1080, "local_address": "127.0.0.1", "local_port": 1080, "password": "xxxxxx", "timeout": 300, "method": "aes-256-cfb", "fast_open": false }
server 是服务器的地址;server_port 是服务器运行的 shadowsocks 的端口号;local_address 和 local_port 是本地的地址和端口号;password 是密码;method 是加密方式,需要和服务器保持一致。
启动本地的 shadowsocks 客户端,本地客户端启动命令如下所示:
sslocal -c /home/pi/ss.json如果想要让客户端在后台执行,可以执行:
nohup sslocal -c /home/pi/ss.json &
此时,树莓派上的 shadowsocks 应该已经成功启动了,但是还没没有办法直接使用,因为这里的 shadowsocks 客户端使用的是 SOCK5 代理,我们需要通过 polipo 把其转换成 HTTP 代理后才能让其他设备访问。
3. 通过 polipo 把 socks5 代理转成 HTTP 代理
安装 polipo:
apt-get install polipo打开文件
/etc/polipo/config,修改成如下样式,这里的 1080 端口就是上面我们所设置 shadowsocks 客户端所运行的端口,可以根据需要灵活更改:proxyAddress = "0.0.0.0" socksParentProxy = "127.0.0.1:1080" socksProxyType = socks5 chunkHighMark = 50331648 objectHighMark = 16384 serverMaxSlots = 64 serverSlots = 16 serverSlots1 = 32重启 polipo 服务:
/etc/init.d/polipo restartpolipo 默认运行在 8123 端口,你可以通过下面这样的方式来测试其与 shadowsocks 的搭配是否正常工作:
export http_proxy="http://127.0.0.1:8123/" curl ifconfig.me
如果一切正常工作的话,你应该可以看到的是 shadowsocks 远程服务器的 IP 地址。
此时,你已经可以在其他设备上通过设置代理到树莓派来科学上网了,下面以 iPad 为例来讲解:
- 打开 设置 → 无线局域网 ,之后点击你所连接的无线网,在最下方的 HTTP 代理中选择
手动,输入服务器为树莓派的 IP 地址,端口为 8123(即前面的 polipo 的运行端口),鉴定默认关闭就行,之后返回到主界面,一切正常的话,此时你已经能够在浏览器中进行科学上网了。
但是我们也能发现,此时我们默认是对所有的域名进行了代理,这对国内的网站访问来说不仅速度变慢了,而且也浪费了 shadowsocks 的流量。下面介绍通过 PAC 实现域名的智能分类,保证只有指定的域名才会通过代理访问,其余还是通过原来的网络进行访问。
4. 通过 PAC 实现代理域名的分类
PAC(Proxy auto-config)就是一个实现了一套代理规则的 JS 文件,它的语法通过 JavaScript 实现,这里给出了一个 PAC 文件示例,你可以直接拿去用。只需要修改以下几个地方:
- 第 4 行的代理规则,
PROXY代表了使用的是 HTTP 代理,后面跟随着的是代理设备的 IP 地址和端口号,在这里就是树莓派的 IP 地址和 polipo 的端口号。 - rules 列表的值,如果想要自定义需要代理的域名,把这个域名添加到此列表中去即可,需要注意列表中的域名规则。
我们把示例的文本保存在一个名为gfwlist.js的文件中,然后我们要保证 iPad 能够访问这个JS文件,在这里我是在树莓派上通过 Nginx 搭建了一个静态文件服务器,然后把gfwlist.js放在 Nginx 中所设定好的文件夹之下,就可访问到这个文件了。Nginx 的配置我也在下面给出来了:
server {
client_max_body_size 4G;
listen 80;
server_name 192.168.1.108;
root /home/pi/gfw;
location / {
autoindex on;
autoindex_exact_size on;
autoindex_localtime on;
}
}
这里我的gfwlist.js文件放在了/home/pi/gfw文件夹下,启动 Nginx,访问 192.168.1.108/gfwlist.js,正常的话应该能够访问到gfwlist.js的内容。之后,再次打开 iPad 的无线网设置中的 HTTP 代理功能,这一次我们选择自动选项,然后在URL中填入:
http://192.168.1.108/gfwlist.js
回到首页,打开浏览器,发现此时上网是已经实现了智能代理。只有在访问 rules 中的域名的时候才会通过代理访问,其余域名将直接访问,至此已经实现了我们的需求。
实际上,自动代理的时候,iPad 会先获取gfwlist.js文件,然后根据里面设置好的规则来实现代理的功能。因为我们在 PAC 文件中已经写好了代理设备的主机和端口号以及代理域名的规则,所以 iPad 自然可以通过我们写好的规则来实现其代理功能。