Install Shadowsocks in Ubuntu
最近我的xps 9360坏掉了,系统boot不起来,自己折腾了两个周,没有效果,又去dell官方指定维修点去 找原因,人家说是硬盘坏了,要换一块,我这里有个1TB的,1000块便宜给你。我寻思我这电脑还有1个月 就满4周岁了,整那么大的硬盘也没用,索性拒绝了。自己在京东下单了一块和原来一样大小的256GB的ssd, 又买了小米的螺丝刀套装,自己换了一下,这才把问题解决。然后,我把xps直接装成自己喜爱的ubuntu系统, 并买了Just My Socks,用于科学上网,这里 记录一下整个搭建的过程。
首先讲下shadowsocks的原理,装shadowsocks之前,我们的上网过程是客户端直接和服务器端 交流,如下图所示:
client <---> target
而装了shadowsocks之后,我们上网则是客户端发出的请求先发送给shadowsocks client,即ss-local程序, 再由它发送给shadowsocks server,即ssserver程序,最后再发送给target。接收信息的过程是发送信息的逆过程。 具体如下图所示:
client <---> ss-local <---> [encrypted] <---> ssserver <---> target
^ ^
shadowsocks client shadowsocks server
至于为什么这样就可以科学上网,举个例子你就明白了。比如说你想访问google,装shadowsocks之前, 你是直接发送http请求给google,因为GFW的限制,你的请求在到达google之前,就被拦截下来了。而 装上shadowsocks之后情况就不一样了。你的请求首先会由ss-local发送给ssserver,因为ssserver是 部署在国外的机器上,所以访问网站就不会受到GFW的限制,所以请求会被ssserver成功发送给google, 而google收到请求后,会回复ssserver,然后ssserver再转发给ss-local,最后你就可以收到回复了。
在原理清楚了之后,我们开始动手安装相应的软件。首先我们来安装shadowsocks:
sudo apt-get install shadowsocks-libev
然后我们来编辑shadowsocks的配置文件:
# sudo vim /etc/shadowsocks-libev/config.json
{
"server":"server_ip", // 安装ssserver机器的IP或域名
"mode":"tcp_and_udp", // 连接模式,这里选择的是tcp和udp
"server_port":xxx, // 安装ssserver机器的端口
"local_port":xxx, // ss-local监听的端口号,默认为1080
"password":"xxx", // ss-local和ssserver通信的密码
"timeout":100, // 超时设置
"method":"aes-256-gcm" // ss-local和ssserver的通信加密方式
}
这里要提一嘴,因为我在配置文件中选择的是aes-256-gcm
加密方式,所以有可能还需要
安装libsodium-dev
:
sudo apt-get install libsodium-dev
对照着Just My Socks 客户界面
填写完配置文件后,就可以运行ss-local
啦:
ss-local -c /etc/shadowsocks-libev/config.json
INFO: loading config from /etc/shadowsocks-libev/config.json
2022-03-13 10:29:23 INFO loading libcrypto from libcrypto.so.1.1
2022-03-13 10:29:23 INFO loading libsodium from libsodium.so.23
2022-03-13 10:29:23 INFO starting local at 127.0.0.1:1080
... ...
这样还不可以科学上网,因为我们只是setup了ss-local,并没有让上网请求走这个代理。 所以,接下来,我们介绍两种走代理的方式,一种是全局代理(global proxy),另 一种则是PAC(Proxy Auto-Config)。
全局代理
我们先来说全局代理。首先我们需要安装privoxy
,它能够实现不同代理之间的切换,
我们可以使用它作为SOCKS代理和HTTP代理和HTTPS代理之间的桥梁,它能把所有的http
请求(包括终端执行的命令,浏览器等)转发给shadowsocks,像一个适配器一样。
原理图如下:
client <---> privoxy <---> ss-local <---> [encrypted] <---> ssserver <---> target
^ ^
shadowsocks client shadowsocks server
安装privoxy的命令如下:
sudo apt-get install privoxy
然后我们打开privoxy的配置文件,在章节4.1. listen-address和5.1. forward加入下面的内容:
# sudo vim /etc/privoxy/config
... ...
# 4.1. listen-address
... ...
listen-address 127.0.0.1:8118
listen-address [::1]:8118
... ...
# 5.1. forward
... ...
forward-socks5t / 127.0.0.1:1080 .
修改完成之后,重启privoxy。
systemctl restart privoxy
如果你只需要在命令行中访问国外的资源,那么只需要执行下列命令即可:
export http_proxy=http://127.0.0.1:8118
export https_proxy=http://127.0.0.1:8118
可以get Google页面来判断是否设置成功:
curl www.google.com
如果你也想浏览器使用代理,那么可以配置系统网络代理,步骤是:
- Settings -> Network -> Network Proxy -> Manual
- 设置HTTP,HTTPS,FTP代理:
再用浏览器访问google:
这样就设置好了。
PAC
PAC是 Proxy Auto-Config 的首字母缩写,是一种网页浏览器技术,用于定义 浏览器该如何自动选择适当的代理服务器来访问一个网址。
当访问一个网址的时候,浏览器会根据PAC file中定义的访问规则,恰当的选择 代理服务器。对于科学上网来说,我们要做的就是制作一个这样的PAC file, 使得浏览器在访问被墙网站的时候走shadowsocks代理,而访问正常网站的时候 采用直连方式。访问过程如下图:
client <---> browser <---> local PAC file
^
|<---------> target
| ^
| |
| |
v v
ss-local <---> ssserver
在了解了原理之后,我们首先要制作这个PAC file。制作的过程需要两样东西, 一个是生成PAC file的工具,另一个则是被墙网站的列表。 首先我们来安装生成的工具GenPAC:
sudo pip install genpac
sudo pip install --upgrade genpac
被墙网站的列表已经有人帮我们收集好了,存放在gfwlist/gfwlist, 我们把它clone下来就好了:
git clone https://github.com/gfwlist/gfwlist
接着我们来生成自己的PAC file:
cd gfwlist
sudo genpac --pac-proxy="SOCKS5 127.0.0.1:1080" -o ~/.autoproxy.pac --gfwlist-local gfwlist.txt
然后,我们对系统网络进行设置:
- Settings -> Network -> Network Proxy -> Automatic
- 在Configuration URL一栏填写:file:///home/guosj/.autoproxy.pac
照理说,介绍到这里,PAC设置就应该结束了。但是,我发现Microsoft Edge已经移除了对于file://
和data:
协议的支持,只能使用http://
协议。
也就是说,上述的file:///home/guosj/.autoproxy.pac
内容人家浏览器是不认的,应该写成http://...
。
因此,我们这里还要加上一个步骤,即用nginx实现对本地文件的http映射。nginx可以在本地起一个server, server的资源可以通过http请求进行访问。也就是说,浏览器会通过http请求对本地的nginx server开放的 PAC file进行访问,然后再确定访问方式为直连还是走代理。 过程如下图:
client <---> browser <---> nginx server <---> local PAC file
^
|<---------> target
| ^
| |
| |
v v
ss-local <---> ssserver
还是一样,我们首先安装nginx:
sudo apt-get install nginx
然后修改默认配置文件,在http { ... }
中加入:
# sudo vim /etc/nginx/nginx.conf
http {
... ...
server{
listen 80; # 监听的端口
server_name 127.0.0.1; # 服务器地址
location /autoproxy.pac{ # PAC file path
alias /home/guosj/.autoproxy.pac;
}
}
... ...
}
接着,我们启动nginx:
sudo nginx
最后,我们把系统网络设置的Configuration URL一栏写上http://127.0.0.1/autoproxy.pac
:
访问google进行测试:
定位手段
如果发现网络不通了,可以按照下列手段先定位下。
看下各服务的状态是否正常
sudo systemctl status shadowsocks.service # 查看 shadowsocks 的服务状态
sudo systemctl status privoxy.service # 查看 privoxy 的服务状态
是否是域名暂时被禁了
用如下命令编辑下 config.json 文件:
sudo vim /etc/shadowsocks-libev/config.json
然后再重启服务:
sudo systemctl restart shadowsocks.service
sudo systemctl restart privoxy.service
其他问题
尝试重启电脑解决 :)
以上。