目前的 Shadowsocks 教程很多。但都不怎么样。

比如他们喜欢对读者隐藏细节。为什么「对读者隐藏细节」是一件坏事?因为用户对命令行的恐惧恰恰是来自于对命令行交互的不知情,隐藏细节对读者的恐惧没有任何帮助。

所以在此写一篇。

要想搭建 Shadowsocks,首先得知道 Shadowsocks 是什么,Shadowsocks 是一个 socks5 网络代理工具。网络代理工具的定义如下:

代理(英語:Proxy)也称网络代理,是一种特殊的网络服务,允许一个网络终端(一般为客户端)通过这个服务与另一个网络终端(一般为服务器)进行非直接的连接。一些网关路由器等网络设备具备网络代理功能。一般認為代理服务有利于保障网络終端的私隱或安全,防止攻击。

使用 Shadowsocks 代理工具的原理可以简单解释为「我的设备(手机、电脑)(又称为客户端) ->(通过代理工具)-> 未被墙的服务器(又称为服务端)-> 网络」因此你需要购买一个未被墙的服务器(又称 VPS)来搭建 Shadowsocks 服务端。

购买服务器之后,服务商一般会让你选择服务端所使用的系统,常见的选项有 Debian 系和 RPM 系以及 Windows。可以在这里看到详情

如果要再次确定您的系统使用什么版本,可以这样查看到您的系统版本:

1
cat /etc/*release*

会有类似这样的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# DISTRO, RELEASE, ARCHITECTURE, PACKAGE_MANAGER
AOSC OS3, DP, AMD64, DPKG
# FSG lsb_release configuration file template
# If the distribution is LSB compliant, uncomment the following line
# and set the version appropriately
# LSB_VERSION=""
DISTRIB_ID="AOSC OS"
DISTRIB_CODENAME="Gumblex"
DISTRIB_RELEASE="7.0.4"
DISTRIB_DESCRIPTION="AOSC OS"
PRETTY_NAME="AOSC OS (7.0.4)"
NAME="AOSC OS"
VERSION_ID="7"
VERSION="7.0.4 (Gumblex)"
BUILD_ID="20200214"
ID=aosc
ANSI_COLOR="1;36"
HOME_URL="https://aosc.io/"
SUPPORT_URL="https://github.com/AOSC-Dev/aosc-os/"
BUG_REPORT_URL="https://github.com/AOSC-Dev/aosc-os-abbs/issues/"

其中,DISTRIB_ID 是服务器目前所使用的发行版代号,在这里是 AOSC OSDISTRIB_RELEASE 是发行版的版本号,在这里是 7.0.4

在确定了你的发行版的版本代号和版本号之后,就可以开始操作了。

假如我的 DISTRIB_IDDebian,版本号是 10.3。您可以这样安装 Shadowsocks,目前比较推荐使用的版本是 shadowsocks-libev,其他版本因为安全和易用性问题不推荐使用。虽然其他发行版安装 shadowsocks-libev 步骤不同,但大同小异,请使用系统包管理安装软件,并确保软件是最新版本。(可以在这里查看最新版本)。

先执行以下命令:

1
2
3
sudo sh -c 'printf "deb http://deb.debian.org/debian buster-backports main" > /etc/apt/sources.list.d/buster-backports.list
sudo apt update
sudo apt install shadowsocks-libev

有几个概念需要解释:

  1. 这里您做了:把 buster-backports 源加入 apt 的软件源更新列表。其中 buster-backportsDebian 10 (Buster)backports 源,backports 源是 Debian 在稳定版中保持某些软件为新版本软件的措施,有关 backports 的介绍请移步至这里,在这里使用 backports 安装 shadowsocks-libev 的原因是让 shadowsocks-libev 保持最新,因为旧版有安全性和可用性的问题,而 Debian 稳定版在不加 backports 源的情况下,为了保持稳定并不会让软件更新到最新。
  2. sudo 的意思是使用管理员权限执行命令,在 Linux 中,有着严格的权限管理。一般用户运行在普通权限上,若需要管理员权限执行命令则一般使用 sudo。在这里需要使用管理员权限的原因是修改了位于 /etc 中的系统文件,而修改系统文件需要管理员权限。当然,如果您的命令行的样子像是这样的:root@aosc,那目前您就在以管理员身份运行,在此加 sudo 那就是多余的。
  3. printf "deb http://deb.debian.org/debian buster-backports main" > /etc/apt/sources.list.d/buster-backports.list 的意思是:把 deb http://deb.debian.org/debian buster-backports main 的内容输出到终端中,> 的意思是把输出重定向到文件中,这里的意思是重定向到 /etc/apt/sources.list.d/buster-backports.list 文件中。所以总体的意思是,把 deb http://deb.debian.org/debian buster-backports main 这一行加入到 /etc/apt/sources.list.d/buster-backports.list 文件中。
  4. sh 是系统默认使用的 shell 解释器,-C 参数的意思是 command, 即执行命令。
  5. apt 是 Debian 系的包管理器,包管理器是 Linux 中管理软件的方式。意思是在 Debian 系中升级和安装软件都使用 apt 包管理器。有关包管理器的介绍请移步至这里apt update 的意思是升级软件源列表,而 apt install 的意思是安装某个软件,这里需要安装的软件包是 shadowsocks-libev ,所以是 apt install shadowsocks

之后,我们看看 shadowsocks-libev 这个包有哪些文件:

1
dpkg -L shadowsocks-libev

会有像这样的输出:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
➜  aosc-os-abbs git:(stable-proposed) dpkg -L shadowsocks-libev 
/.
/etc
/etc/shadowsocks
/usr
/usr/bin
/usr/bin/ss-local
/usr/bin/ss-manager
/usr/bin/ss-nat
/usr/bin/ss-redir
/usr/bin/ss-server
/usr/bin/ss-tunnel
/usr/include
/usr/include/shadowsocks.h
/usr/lib
/usr/lib/libshadowsocks-libev.so.2.0.0
/usr/lib/pkgconfig
/usr/lib/pkgconfig/shadowsocks-libev.pc
/usr/lib/systemd
/usr/lib/systemd/system
/usr/lib/systemd/system/shadowsocks-libev-redir@.service
/usr/lib/systemd/system/shadowsocks-libev-server@.service
/usr/lib/systemd/system/shadowsocks-libev-tunnel@.service
/usr/lib/systemd/system/shadowsocks-libev@.service
...

在这里需要介绍几个概念:

  1. /etc 是 Linux 系统放配置文件的地方。我们放 Shadowsocks 配置文件的地方应该在 /etc/shadowsocks 中。
  2. /usr/bin 是 Linux 系统中放二进制文件的地方之一。类似于 Windows 中的 .exe 后缀的可执行文件。
  3. /usr/lib/systemd/system/*.service 是 Systemd 服务文件。使用 Systemd 服务文件运行 Shadowsocks 可使 Shadowsocks 服务始终保持后台中,不会因终端关闭而关闭。这里我们需要使用 shadowsocks-libev-server@.service 服务文件。

所以,请先在 /etc/shadowsocks/ 中创建 config.json 文件:

1
sudo nano /etc/shadowsocks/config.json

在出现的界面中输入以下内容:

1
2
3
4
5
6
7
8
{
"server":["[::0]", "0.0.0.0"],
"server_port":8388,
"local_port":1080,
"password":"barfoo!",
"timeout":60,
"method":"chacha20-ietf-poly1305"
}

按照提示使用 Ctrl + X 保存。

这里需要解释:

  1. server 即服务器地址,您可以直接填写您服务器的域名或 IP 地址。这里的意思服务器 ipv4 地址为 0.0.0.0 , ipv6 的地址为 ::0

  2. server_port 即服务器端口。你可以理解为,您的设备连接 Shadowsocks 服务器时需要连接 8338 这个端口。

  3. local_port 即本地端口。您可以理解为在本地每一个服务传送数据,都需要分配一个端口,local_port 就是 Shadowsocks 需要分配的端口。

  4. password 即连接 Shadowsocks 所需要的密码。

  5. timeout 是达到一定时间不能连接后,重新连接该 Shadowsocks 服务器。

  6. method 为加密方法。请使用 AEAD 加密方法,其他方法不推荐使用。有关 AEAD 方法名单请看这里chacha20-ietf-poly1305 就是其中一种 AEAD 加密方法。

保存文件之后。运行 sudo systemctl enable shadowsocks-libev-server@config --now 即可启动 Shadowsocks 服务。这里需要解释:

  1. systemctl 是 Systemd 服务管理工具,用于管理系统中的服务。

  2. enable 的意思是开机即启动这个服务,这里需要启动 shadowsocks-libev-server服务。

  3. @ 后面的接着的是 shadowsocks-libev-server 这个服务所需要的参数,这里需要的参数是在 /etc/shadowsocks 中的配置文件名称,在这里配置文件名叫 config.json,所以就是 shadowsocks-libev-server@config

  4. --now 是立即启动此服务。

最后您的 Shadowsocks 服务器就搭建完成了。请尝试在您的设备中连接此服务器。

最后,延伸阅读:为什么我不推荐使用第三方翻墙服务(又叫机场)