最近我的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

如果你也想浏览器使用代理,那么可以配置系统网络代理,步骤是:

  1. Settings -> Network -> Network Proxy -> Manual
  2. 设置HTTP,HTTPS,FTP代理:

global proxy setting

再用浏览器访问google:

access google in explorer

这样就设置好了。

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

然后,我们对系统网络进行设置:

  1. Settings -> Network -> Network Proxy -> Automatic
  2. 在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

automatic proxy

访问google进行测试:

PAC mode google test

定位手段

如果发现网络不通了,可以按照下列手段先定位下。

看下各服务的状态是否正常

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

其他问题

尝试重启电脑解决 :)

以上。