从零开始搭建shadowsocks科学上网系统(服务器篇)

早就想整理一篇科学上网资势, 但一直咕咕咕到现在, 正好有人向我要教程, 那就写全一点, 免得以后重新布署的时候再看别的文档. 因为想到会写很长, 服务器和客户端分开写, 这篇主要是在VPS上搭建shadowsocks服务器.


从零开始搭建shadowsocks科学上网系统(客户端篇)

虽然网上有许多配置脚本, 但我还是喜欢手动配置, 因为这样比较原汁原味, 而且可定制性高. 虽说是从零开始, 但是一些简单的终端操作这样的前置技能还是要掌握的, 我尽量把我当时遇到的小问题都写出来.

全文以macOS环境为例, Windows环境下自备PuTTY进行ssh连接用

目录

创建VPS

各个VPS提供商官网上教程都写得很详细了, 所以就不一步一步地介绍了.

服务商

我现在用的是vultr上的, 还有Digital Ocean上的也不错, VPS里的高富帅linode也开了5刀的套餐, 也可以试一下. 如果要在Vultr上购买的话, 能走一下我的邀请链接就太好了, 再到网上搜一下优惠码, 可以免费用上几个月.

地区节点

因为在太平洋有直达洛杉矶的海底光缆, 所以洛杉矶节点的速度还是可以的, 不过我家里的铁通连新加坡节点速度也不慢, 可以实际测一下速来选择合适的节点.

系统

关于系统, 我现在用的是Debian 9, 如果是小白的话, 还是暂时和我选一样的吧, 要不一会安装可能会出问题.

ssh密钥

创建VPS的时候要选择一个连接VPS用的ssh密钥, 不要用密码, 更不能每次都用网页上的access网页连接……Digital Ocean是不能在网上生成密钥的, 只能上传本地密钥. 在本地可以使用ssh-keygen命令生成密钥对:

 1
local$ ssh-keygen -t rsa -b 4096 -C "your_email@example.com" -f filename

因为下面要涉及到本地的shell和VPS上的shell环境, 所以用local$代表本地shell, vps$代表VPS上的shell. 上面的命令中, -t代表加密算法, 这里使用rsa;-b是生成密钥的位数, -C后可以接一些注释, 这里写的邮箱是因为github上推荐这样生成gihub用的ssh密钥, 生成一个密钥可以在gihub上和VPS上同时使用;-f指生成的密钥名称. 在生成的过程中会有一步提示:

 1
Enter passphrase (empty for no passphrase):

这一步是要求设置使用私钥时的密码, 不想设置的话回车跳过就好. 之后就会生成一个名为filename的私钥和名为filename.pub的公钥. 我们要上传的是公钥, 也就是filename.pub, 输出公钥内容:

 1
local$ cat filename.pub

可以在账户的设置界面添加公钥, 也可以在新建VPS时新建(其实就是添加公钥). 新建VPS时勾选上我们上传的公钥, 就可以使用ssh密钥、而不是密码登录了.

连接VPS

创建好之后, 会得到VPS的IP, 使用上面提到的私钥连接VPS

 1
local$ ssh root@IP -i filename

root即VPS的root账户, -i为指定连接用的私钥. 连接时会提示:

 1
 2
 3
The authenticity of host '***' can't be established.
RSA key fingerprint is SHA256:***.
Are you sure you want to continue connecting (yes/no)?

这是在ssh连接过程中验证连接的服务器身份, 输入yes继续. 之后就可以看到登录后的界面了.

上面的连接命令, 每次都要指定密钥的路径, 很麻烦, 如果你像我一样其本只用这一个ssh密钥, 可以修改ssh配置, 将这个密钥设置为默认密钥. ssh客户端配置文件为~/etc/ssh/ssh_config, 添加IdentityFile项, 后面接密钥路径, 之后连接ssh默认用这个密钥, 不用再加上-i选项了.

如果对于Linux系统不熟, 可以先看一下这个, 了解一下文件和文件夹的操作, 方便下面安装shadowsocks.

安装shadowsocks-libev

从软件源安装

这是最简单的方法, 系统自带源上的版本很旧, 所以现添加一下源:

 1
vps$ sudo sh -c 'printf "deb http://deb.debian.org/debian stretch-backports main" > /etc/apt/sources.list.d/stretch-backports.list'

之后正常更新安装就可以了:

 1
 2
sudo apt update
sudo apt -t stretch-backports install shadowsocks-libev

这样就装好了, shadowsocks-libev中常用的命令有ss-serverss-localss-redirss-tunnel等, 服务端我们只用ss-server. 关于使用方法, 可以man shadowsocks-libev或者man ss-server来查看, 下面只会提到必要用法.

编辑配置文件

一般为了方便, 会将shadowsocks设置的参数写成配置文件, 配置文件为json格式, 服务端可以使用的key如下:

key 说明
server 服务器IP
server_port 服务端口
password 密码
method 加密算法
timeout 超时
mode 代理协议

服务器IP如果设为0.0.0.0则绑定所有IP;代理协议指的是代理TCP还是UDP, 至于加密算法, 3.0以上版本的shadowsocks目前支持18种算法, 但推荐使用以下支持AEAD加密的:

  • chacha20-ietf-poly1305
  • aes-256-gcm
  • aes-192-gcm
  • aes-128-gcm

至于原因可以参考这篇文章这里以我常用的配置文件为例:

 1
 2
vps$ touch config.json    #新建文件
vps$ vim config.json    #编辑文件

至于vim的使用, 来!点我30s入门, 文件内容如下:

 1
 2
 3
 4
 5
 6
 7
 8
{
    "server":"0.0.0.0",    //服务器IP, 0.0.0.0代表绑定服务器的所有IP
    "server_port":8088,    //服务端口
    "password":"password",    //密码
    "timeout":"5",    //超时重连
    "method":"chacha20-ietf-poly1305",    //加密方式
    "mode":"tcp_and_udp"    //代理TCP和UDP
}

配置文件为json格式, //后为注释, 方便说明加的, 实际配置文件里不能写注释(看那个红色就知道不能加). 这里我用的是在移动设备上性能相对效好的chacha20-ietf-poly1305.

运行shadowsocks-libev

 1
vps$ ss-server -c config.json

可以看到服务在前台运行, -c后面接配置文件. 若要后台运行, 可以加上-f参数, 后面接一个pid文件名, 运行后会生成这个pid文件, 里面保存着这个后台ss-server进程的pid.

 1
vps$ ss-server -c config.json -f proxy.pid

如果想开多个端口, 可以使用多个配置文件+多个pid文件的方式来管理. 这样服务端就完成了.


emmmm, 上次更新服务器系统时忘了备份数据库, 再加上评论比较少, 暂时关闭评论功能