之前买的科学上网服务从不稳定到不可用,也没有通知一声,貌似跑路了,太没有职业道德,这年头只想稳定的上网真的这么难么?
还好,之前买过一台VPS,本想业余时间开发一些小东西,目前只部署了个爬虫在上面跑,这次先用它搭个梯子代理,至少自己动手,比别人的要稳定吧!
原理
首先说一下shadowsocks
的工作原理,正常情况下,如果你想访问外面的世界,由于有GFW的存在,直连是访问不了的,但如果你有一台外面世界的VPS,而你可以直连到这台VPS上,那么就可以通过这台VPS搭一条通道,也就是所谓的梯子,来让我们间接的连通外面的世界。
说白了就是在这台VPS上自己搭建一个服务,可以使我们的请求数据包经过这个服务转发出去,然后将响应数据包再通过这个服务正常返回给我们,但是由于我们上网都会经过GFW,它会验证我们的数据包,如果是被屏蔽的域名或IP,则会拒绝访问。怎样才能跨越屏障呢?
那就是在发送请求数据给代理服务时,先进行加密,这样就能跨越GFW到达代理服务,代理服务再通过同样的算法解密数据包,然后转发到我们请求的网站,之后得到响应后再通过先加密后解密的方式返回到我们本机,这样就能实现与外部连通。所以我们需要客户端和服务端配合来完成,大致流程如下:
明白了原理之后,我们怎样搭建这样一个服务呢?
shadowsocks
就已经实现了这些东西,我们只需要经过配置就可以轻松完成这个服务。
安装依赖
这里主要介绍Linux
系统服务器装过程,由于Linux
系统已自带Python
,我们只需要安装shadowsocks
模块搭建代理服务就可以了。
安装shadowscoks
:
Debian / Ubuntu:
1
2
3
4安装shadowsocks依赖的加密库
apt-get install python-m2crypto
安装shadowsocks
pip install shadowsocksCentOS:
1
2
3
4
5
6安装shadowsocks依赖的加密库
yum install m2crypto
安装pip
yum install python-setuptools && easy_install pip
安装shadowsocks
pip install shadowsocksWindows:
参考这里
服务端配置
安装完成后,然后进行服务端配置,例如端口、密码等信息。
创建配置文件/etc/config.json
:
1 | { |
各配置信息:
- server:服务端IP,填写你VPS的IP地址
- server_port:服务端监听端口
- local_address:客户端服务IP,一般写本机127.0.0.1
- local_port:客户端监听端口
- password:密码,服务端指定后,客户端连接需填写此密码
- method:传输数据的加密方式
这里指定了服务端的端口是9988,客户端的端口是1080,这个客户端端口最好不要修改,因为Mac的shadowsocks
客户端不能修改端口,而默认指定就是1080端口。如果是Windows客户端则可以随意修改,自己指定即可。
启动/停止服务
- 后台启动:
1 | ssserver -c /etc/config.json -d start --log-file /tmp/shadowsocks.log --pid-file /tmp/shadowsocks.pid |
- -c:指定配置文件
- -d start:模式:启动
- —log-file:日志路径
- —pid-file:
pid
进程号文件
查看日志文件,如果显示starting server at x.x.x.x:xxxx
即为启动成功。
- 停止服务:
1 | ssserver -d stop --pid-file /tmp/shadowsocks.pid |
配置防火墙
shadowsocks
服务启动成功后,就会在配置的端口监听服务,客户端要想通过此端口访问,首先配置防火墙,打开端口访问,默认端口应该都是被关闭的。如何配置防火墙,请参考iptables
文档,这里不再阐述。
客户端配置
服务端配置完成之后,就需要本地下载客户端来连接此服务了。
下载客户端:http://sourceforge.net/projects/shadowsocksgui/files/dist/
Mac和Windows平台请自行根据后缀名和日期下载最新版即可。
以为Mac客户端为例,打开客户端,找到Servers
,打开配置:
按照上面服务端的配置,填写IP、端口、密码、加密方式,保存。
选择Turn On
启动客户端即可:
试着访问google、twitter、youtube等网站,然后观察服务端的日志文件,看是否有请求进来,如果网站可以正常访问,且日志有访问记录,则说明配置正确,现在就可以愉快的科学上网了!
客户端默认是以Auto Proxy Mode
方式启动的,也就是自动分流方式,没有被屏蔽的网站,还是走本机直连方式,只有被屏蔽的网站才会走shadowsocks
代理访问。
你也可以选择Global Mode
全局代理模式,即所有流量都走代理访问。当然还是推荐使用自动分流模式,这样保证访问速度的同时还可节省VPS的流量。
配合SwitchyOmega使用
其实到上面为止,你的本机已经可以正常访问外面的世界了。
但如果你在工作中,例如访问线上服务需要使用HTTP代理来访问,例如访问线上服务http://192.168.3.22
,需要通过HTTP代理,而其他网站则不使用代理。那么你可能要用到Chrome
的插件SwitchyOmega
来进行自动分流。
一般配置为,先建立一个Proxy Profile
配置,名字叫Online Proxy
(线上服务代理),配置HTTP代理的IP和端口,例如:
然后建立一个Switch Profile
配置,名字叫Auto Switch
(自动切换),然后匹配规则如果是访问线上服务器192.168.3.22
的服务,则自动使用上面建立的Online Proxy
规则:
而默认使用的是Direct
,意为本机直连,也就是说,如果没有匹配到上面的规则,则默认使用直连方式进行访问,不会走任何代理。
如果没有使用shadowsocks
之前,按照上面的配置就可以访问线上服务和正常浏览网站了,但现在我们想访问外面的世界,按照上面shadowsocks
的配置,然后使用Chrome
还是无法访问的。问题就是因为我们配置了SwitchyOmega
,默认匹配不到任何规则,则使用直连的方式访问网络的,不会经过我们配置的shadowsocks
代理。
那么怎么才能使Chrome
既能像之前那样可以访问线上服务,又可以通过代理服务访问被屏蔽的那些网站呢?
其实,在我们打开shadowsocks
客户端时,只要代理配置正确,不管你是否开启代理服务(Turn On
),都会在本机启动2个服务,监听2个端口:1080端口、8090端口,使用命令可以查看到:
1 | 查看1080端口 |
这到底是什么情况?你可以仔细观察一下,就算你在客户端点击Turn Off
,使用上面命令查看着2个端口还是存在的。如果你撤掉关掉了客户端,那么这2个端口服务将被关闭。
打开/关闭客户端发生了什么?
打开shadowsocks
客户端,shadowsocks
会在本机启动上面2个服务,关闭客户端同时停止这2个服务。
这2个服务的功能:
- 1080端口:提供
SOCKS v5
代理,真正的请求代理入口,本机通过此端口转发请求 - 8090端口:提供
PAC
服务,shadowsocks
点击Turn On
,会配置PAC
地址到系统代理
Turn On/Off
发生了什么?
在我们的系统配置中,找到网络
-> Wi-Fi
-> 高级
-> 代理
-> 自动代理配置
,你会看到URL配置会随着你Turn On/Off
打开和关闭,然后填充配置/删除配置。
这个配置地址是:http://127.0.0.1:8090/proxy.pac
,访问这个地址,你就会得到一个proxy.pac
的文件,这个配置文件是用JavaScript
编写的,而在第一行也会看到我们熟悉的代码:
1 | var proxy = "SOCKS5 127.0.0.1:1080; SOCKS 127.0.0.1:1080; DIRECT;"; |
后面的逻辑大致就是,配置了一系列的域名,还有一些逻辑判断,意思为,如果我们访问的域名能匹配到这一些列域名,则使用SOCK5 127.0.0.1:1080
代理访问,否则直连访问,这个文件就是一个自动分流的逻辑。
也就是说,我们Turn On/Off
也就是给系统加上了这个自动分流的逻辑,而这个代理入口,就是使用的1080端口这个服务!
得知此结论后,那我们的使用就很方便了,如果想通过代理访问,使用SOCK5 127.0.0.1:1080
访问即可,如果想使用分流代理,使用http://127.0.0.1:8090/proxy.pac
这个地址即可。
那么我们就可以在SwitchyOmega
上再建一个Proxy Profile
规则,叫做Global Proxy
(全局代理),使用这个代理,就强制所有的请求都通过代理访问:
配置完成后,我们在使用Chrome
时,在地址栏的右边,就可以通过点击SwitchyOmega
按钮来手动切换使用哪个模式进行访问了。这样既可以访问线上服务,也可以切换到代理模式访问外面世界了!
到这里我们还是需要手动切换来达到我们想要的效果,那我们可不可以让这些模式自动切换呢?答案是可以的。
新建一个PAC Profile
规则,叫做Auto Shunt
(自动分流),配置上面的PAC
地址:
配置完成后,切换到之前配置好的Auto Switch
(自动切换模式)规则,把Default
选择为刚才配置好的Auto Shunt
模式即可,最后配置如下:
最后选择使用Auto Switch
模式:
使用如上的配置后,访问线上服务时,会走HTTP代理访问,而其他网站默认通过PAC
规则,这个PAC
规则会再次匹配访问网站是否为配置文件中那一系列域名网站,如果能匹配到,那么使用SOCK 127.0.0.1
代理服务访问,否则直连访问。
到此为止,相当于3个规则根据配置自动切换,省去了手动切换的烦恼!当然,上面也保留了Global Proxy
(全局代理)配置,如果在无法直连某个网站,且PAC
配置文件中没有配置时,可以强制选择使用此模式进行访问。
通过上面的配置只是对Chrome
生效,当然我们最好还是开启客户端的Turn On
,这样其他浏览器访问网络时,也会通过PAC
规则进行智能分流访问。