距离上一篇的发表不知不觉过去了一个月。上个月把服务器从apache迁移到nginx本来想着写篇文沉淀一下,结果拖来拖去最后也没憋出来。眼看着再不写东西十月份就又剃光头了,实在是说不过去,就借这个机会,逼着自己把小白向的shadowsocks/SSR/SSRR搭建教程汇总出来。十九大刚刚结束,鄙人的三个梯子全部幸免,虽然可以说略微侥幸,但是姑且把这“幸免于难”的配置心得分享出来,希望在墙日益增高的今天,能够多苟延残喘几日。

I. 搭建环境的准备与背景知识

关于Shadowsocks(以下简称SS)是什么,SS与SSR、SSRR的区别在哪,具体哪个版本适合你,在此我不想过多赘述。一是因为既然你点进来这个文章,那么八成你是我现实中的基友,不是出于好奇自学知道了这是干啥的,就是已经被我当面科普过了。二是因为墙是“活”的,这几个项目(至少其中两个)也是“活”的。我今天在这说的情况,未必未来一定正确,没有必要在这里吹水。当然,关于当下环境SS及分支版本的选择我也有打算另开文章讨论,等写好了在这里加一个链接。

本教程将会以使用Vultr作为VPS提供商,Debian 9作为服务器系统,在其上搭建SSRR为例,带着大家一步步过完服务器搭建的几个关键步骤。当然,几个关键的位置会引入SS/SSR相关文档的链接和说明,争取授人以渔,让大家一通百通。这里小碎碎念一下,就目前网络环境而言,Vultr绝不是最佳选择,甚至连优秀选择可能都算不上。VPS服务商的选择因地域与你的ISP而异,这里选择Vultr是因为一个基友看上了Vultr,并且这家支持支付宝付款。关于主流VPS推荐,与甄选最适用于你的VPS,我也考虑另开一篇文章单独讨论(一个又一个的坑ORZ)

本教程假设你已经对如下知识有了基础了解:

  • Linux 基础命令行操作(cd, ls, vim/nano …)
  • Linux 系统基础构成,权限及软件包管理(su, sudo, apt-get/pacman…)
  • 基础的网络知识(IP,DNS…)

当然,即使你对Linux毫无了解,跟着下面的教程一步一步做,最终肯定也可以把梯子搭好。只不过为了方便未来的维护,以及出了错以后自己能有一点排查的能力,不至于手忙脚乱,还是建议大家稍微学习一些Linux相关的知识。如果你能够在虚拟机上成功安装ArchLinux并搭建桌面环境,那么可以放心——你已经准备好了!

 

II. 在VPS创建服务器并部署操作系统

首先登陆vultr官网,创建一个账号:https://www.vultr.com/ (Vultr官网似乎被墙,所以你可能需要先找个梯子用着。。)

创建完成后会进入个人的Vultr管理界面(https://my.vultr.com/),如下图。此时点击右上角的加号部署一个新的服务器。

接下来进入“Deploy New Instance” (部署新实例)的界面。从现在开始你将选择服务器的类型、地理位置、操作系统、硬盘空间、内存等信息。

首先在最上面的三项中选择服务器类型。Vultr目前提供云计算,云存储和专用三种。我们选择第一项“Vultr Cloud Compute”。之后,选择服务器的地理位置。这里提示一点:虽然日本离中国很近,但实际上Vultr的流量需要从新加坡转发,并不一定比直连美国快。而且在近期因为十九大,日本机房大量IP被禁,新搭建的服务器很有可能被分配别人淘汰下来的老IP,因此不推荐选择日本机房。根据Telegram上水友提供的信息,似乎美国达拉斯的机房线路还算健康,建议先选择达拉斯尝试(或者任意一个节点,不行删了再换,Vultr收钱是按月收,建服务器的动作本身是不要钱的)

接下来的第二和第三步,按上图所示,选择操作系统和硬盘大小。操作系统我们选择Debian 9 x64,服务器大小选择5刀每月的25G SSD。这里说一下,如果是个人级别的使用,1G的内存足够运行SSRR,1T的流量也足以满足基本需求。即使你天天看4K油管也看不出1T的流量,自己敲计算器算一算就知道了。

后面的4-7步可以暂时不去设置。第四部启用ipv6勾选是免费的,但是一般人用不到(有ipv6还要什么梯子),钩不钩随意。剩下几项看自己需求,基本上做代理服务器我们都用不到。最后选择右下角的“Deploy Now”部署服务器。

服务器部署完毕后页面会自动跳转到my.vultr.com的主页。这里可以看到自己刚刚搭建的服务器的基本信息。注意上图打码的位置有一个IP地址,该地址即为服务器的IP地址。在做任何事以前,首先打开电脑的命令行(Windows的CMD,Mac的terminal),输入如下命令(把1.2.3.4替换为你的服务器的ip地址):

ping 1.2.3.4

你将看到类似下图的结果:

ping的结果中“请求超时”的字样越少越好。如果看到的全是请求超时,并且多次尝试均没有改善,那么可能说明当前被分配的IP已经被墙,或者线路与你的ISP相性不合。如果你对ping值结果不满意,或者分配的IP根本ping不通,请点击server列表最右侧的“manage”或者三个点,选择server destroy,按照弹出框的提示删除这个服务器,然后按照以上步骤重新部署,直到分配给你的IP令你满意为止。

如果ping的结果令人满意,那么恭喜你!我们可以继续了。

 

III. 远程访问服务器,系统更新,管理员密码修改

要管理搭建好的服务器,我们需要通过secure shell(ssh)远程登陆系统。这和Windows提供的远程桌面类似,不同的是在这里我们只能通过命令行操作,没有图形界面。ssh是Mac OS的一部分,不需要额外安装任何其他软件,而Windows需要下载并安装Putty(http://www.putty.org/),32位或者64位皆可。

首先在服务器列表点击刚刚部署的服务器,进入该服务器的详细页面,如下图

在bandwidth usage下方是我们的用户信息。Username是root,这是Linux系统的最高权限账户,类似于Windows下的管理员账户。下方的密码点一下右侧的眼睛可以显示出来,这个是创建系统时随机为我们分配的密码,只需要第一次登陆使用。一会我们远程访问服务器,需要IP地址,用户名,密码这三项信息。

Windows用户:

打开putty,直接在host name一项填写服务器IP地址,点击右下角open即可

Mac OS用户:

打开终端(terminal),输入如下命令(将1.2.3.4替换为你的服务器IP地址,root为根用户名)

 ssh root@1.2.3.4 

以下部分Mac与Windows通用:

初次连接到远程主机,会出现如下提示(putty为弹窗,mac会直接在terminal显示类似内容),按照提示选择信任即可

接收host key之后会出现“login as:”字样,此时输入root,回车,以root身份登陆。之后服务器会询问root的密码,直接从刚才页面复制粘贴,敲回车确认(下文不再赘述敲回车的事了)。复制后,在命令行窗口可以按右键粘贴(Mac可以使用command+v粘贴)。输入密码时字符不会在命令行以任何形式体现,换言之敲键盘看起来没反应是正常的,正常输入即可。切记Linux下ctrl+c是终止当前程序的快捷键,不是复制快捷键!

成功登陆,将会看到“This program included…”字样,直到“Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent permitted by applicable law.” 为止都是登陆欢迎信息。登陆成功后的第一件事,就是修改root密码。随机分配的密码复杂,不方便记忆,使用起来也有安全隐患。输入以下命令修改密码

 passwd 

命令行会依次给出如下提示:

 
New password:
Retype new password:
passwd: password updated successfully

和刚才一样,在这里输入密码时视觉上不会有任何反馈,照常输入新密码,确认密码即可。以后ssh登陆,或者切换到root用户,都需要输入这个密码,请谨慎保存此密码,遗失该密码只能重做系统才可以恢复root权限

修改好密码后我们先进行一次系统升级,并安装必要的软件包。Debian系的系统使用apt-get命令进行软件包管理,具体操作如下(一行一个命令,依次粘贴执行)

 
sudo apt-get update
sudo apt-get upgrade
sudo apt-get dist-upgrade
sudo apt-get install git 

上面每一条命令的作用是:

  • apt-get update: 更新本地软件库列表(类似于Windows中检查更新)
  • apt-get upgrade: 实际地去更新软件(Windows中检查到了更新,确认安装更新)
  • apt-get dist-upgrade: 如果一个软件包被另一个取代,需要dist-upgrade才能升级
  • apt-get install … :安装指定的软件包,我们需要git才能从GitHub上clone Shadowsocks的源码下来

 

IV. 在VPS上部署Shadowsocks服务端

准备工作完成后,就可以开始正式开始部署Shadowsocks服务器了。由于SSR和SSRR本是SS的一个分支,因此部署方法大同小异。按照官方Wiki基本就可以完成部署了,下面以SSRR为例,讲解服务端的部署流程。在开始之前,先放出各个项目的GitHub页面:

这几个页面进去都是项目根目录。各个项目都有自己的子repo,其中以rss结尾的是相关文档,Android结尾的是安卓客户端,libev是libev版服务端,csharp是Windows客户端,而没有后缀的就是ss服务端的主repo

① 从GitHub抓取源码

SS系提供python和libev两个版本,其中libev资源占用更少。但是因为SSR与SSRR的libev版本维护并没有python好,因此我们安装python版本。在VPS命令行直接键入

git clone -b akkariiin/master https://github.com/shadowsocksrr/shadowsocksr.git

其中-b参数指定了要抓repo中的哪个branch。上述命令下载了SSRR的活跃分支,默认分支并不包括SSRR的新特性。另外SSR和SS需要下载的也不是默认分支,具体请参考Wiki单用户教程。官方Wiki目录列表:

② 服务端配置

如果是SSR或者SSRR,首先运行以下命令:

cd ./shadowsocksr
bash initcfg.sh

接下来编辑同目录下的user-config.json:

 nano ./user-config.json 

这个配置文件定义了SS所使用的协议,加密,混淆等参数。协议,加密和混淆会随着SS的开发而增加或者改变。因此,在这里我就不具体介绍比对几种算法的不同,建议直接去Wiki学习查看。配置文件采取的是json格式,如果不了解可以先搜索json,写完后建议用在线工具查错。该文件的配置是整个部署过程中需要阅读量最大的一环,建议反复阅读,加深理解几个概念的不同。具体的配置方法见如下官方wiki链接:

在阅读过程中,以下几个概念的区分对于理解至关重要

  • 加密方法(method): 该参数为SS与R系列共有,决定了数据包的加密方法
  • 协议(protocol): R系特有参数,可以理解为数据包的发送模式,或者与服务器的通信模式
  • 混淆(obfs): R系特有参数,用于将数据包伪装成其他正常流量的数据包,以试图欺骗GFW

SS的配置相对简单,而R系列因为可以在协议和混淆两方面搭配定制,可选的配置方法非常多,产生的结果的差别也会很大。理论上,好的配置更难被GFW侦测,而坏的组合可能的得不偿失。不同协议的混淆的区别,项目维护者都在上述混淆说明文档中有着比较明确的解释,技术性不算强,还算可以看懂,建议多多阅读,加深理解。个人的推荐是使用authchain系作为混淆方法,tls1.2_ticket_auth作为协议,在443或8080端口搭建服务。authchain a和b是SSR就有的混淆方法,从c开始是SSRR维护者新加入的。个人感觉b和d相对可靠,暂时不要尝试e和f。

以下json为我个人使用的模板,可以根据需要在此基础修改使用:

{{"server": "0.0.0.0",
  "server_ipv6": "::",
  "local_address": "127.0.0.1", 
  "local_port": 1080,
  "port_password":{
    "80":{
      "password": "",
      "method": "none",
      "protocol": "auth_chain_b",
      "protocol_param": "16",
      "obfs": "http_post",
      "obfs_param": ""},
    "443":{
      "password": "",
      "method": "none",
      "protocol": "auth_chain_d",
      "protocol_param": "16",
      "obfs": "tls1.2_ticket_auth",
      "obfs_param": ""}},

  "method": "aes-256-cfb",
  "protocol": "auth_aes128_sha1",
  "protocol_param": "16",
  "obfs": "tls1.2_ticket_auth",
  "obfs_param": "0",
  "speed_limit_per_con": 0,
  "speed_limit_per_user": 0,
  "additional_ports" : {},
  "timeout": 120,
  "udp_timeout": 60,
  "dns_ipv6": false,
  "connect_verbose_info": 0,
  "redirect": ["cloudflare.com:443", "heroku.com"],
  "fast_open": false}

具体怎么配的很直白,80端口authchain_b + http_post,443端口authchain_d + tls1.2。如果你打算粘下来直接用那么要注意密码没有设置,记得自己手动在password后的双引号中间填进去。

*这个垃圾的文本高亮插件,神tm不支持json,是时候换个更先进一点的了,暂时先凑和看吧

③ 自启动脚本

为了避免每次VPS重启都需要手动ssh进去启动服务器,建议使用自启动脚本,把SSR设置成服务。以下脚本适用于R系,参考了https://github.com/shadowsocksrr/shadowsocks-rss/wiki/System-startup-script 的教程。Debian使用的是systemd,但是兼容sysVinit。以下使用的是sysVinit脚本。

官方脚本默认SSR安装于/usr/local/shadowsocksr下,而我们实际上装在了/root/shadowsocksr。解决方法也很简单,直接建立软链即可:

ln -s /root/shadowsocksr /usr/local/shadowsocksr

软链类似于Windows中的快捷方式,建立软链后进入/usr/local/shadowsocksr看到的内容和/root/shadowsocksr是一样的。

cd /etc/init.d/
sudo touch shadowsocks
sudo nano shadowsocks

执行以上命令,切换到/etc/init.d/下,并建立shadowsocks新文件,使用nano打开编辑。粘贴以下脚本,保存即可。

#!/bin/sh
# chkconfig: 2345 90 10
# description: Start or stop the Shadowsocks R server
#
### BEGIN INIT INFO
# Provides: Shadowsocks-R
# Required-Start: $network $syslog
# Required-Stop: $network
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Description: Start or stop the Shadowsocks R server
### END INIT INFO

# Author: Yvonne Lu(Min) <min@utbhost.com>

name=shadowsocks
PY=/usr/bin/python
SS=/usr/local/shadowsocksr/shadowsocks/server.py
SSPY=server.py
conf=/usr/local/shadowsocksr/user-config.json

start(){
    $PY $SS -c $conf -d start
    RETVAL=$?
    if [ "$RETVAL" = "0" ]; then
        echo "$name start success"
    else
        echo "$name start failed"
    fi
}

stop(){
    pid=`ps -ef | grep -v grep | grep -v ps | grep -i "${SSPY}" | awk '{print $2}'`
    if [ ! -z "$pid" ]; then
        $PY $SS -c $conf -d stop
        RETVAL=$?
        if [ "$RETVAL" = "0" ]; then
            echo "$name stop success"
        else
            echo "$name stop failed"
        fi
    else
        echo "$name is not running"
        RETVAL=1
    fi
}

status(){
    pid=`ps -ef | grep -v grep | grep -v ps | grep -i "${SSPY}" | awk '{print $2}'`
    if [ -z "$pid" ]; then
        echo "$name is not running"
        RETVAL=1
    else
        echo "$name is running with PID $pid"
        RETVAL=0
    fi
}

case "$1" in
'start')
    start
    ;;
'stop')
    stop
    ;;
'status')
    status
    ;;
'restart')
    stop
    start
    RETVAL=$?
    ;;
*)
    echo "Usage: $0 { start | stop | restart | status }"
    RETVAL=1
    ;;
esac
exit $RETVAL

保存后执行以下内容,注册并启动服务

chmod 755 /etc/init.d/shadowsocks
update-rc.d shadowsocks defaults
service shadowsocks start
service shadowsocks status

最后一条命令输完,应当看到绿色的running字样,如下图

如果没有看到active,表示shadowsocks服务启动失败。此时一般为配置文件设置有误,或者端口占用。输入以下命令,在前台运行ss看到具体是那一步出了问题报错

 
cd /root/shadowsocksr
./run.sh

④ 参数优化

如果服务器运行没有问题,可以稍微调整一下Linux相关参数优化SS的运行。这部分可以完全参考https://github.com/shadowsocks/shadowsocks/wiki/Optimizing-Shadowsocks

注意,官方Wiki使用的tcp拥塞控制算法是hybla。在此建议使用BBR。Debian 9使用的Linux核心是4.9,原生支持BBR,不需要手动编译。只需要在链接倒数第二段中

net.ipv4.tcp_congestion_control = hybla 

改为以下即可:

net.ipv4.tcp_congestion_control = bbr 

或者直接粘贴以下文本到 /etc/sysctl.d/local.conf

# max open files
fs.file-max = 51200
# max read buffer
net.core.rmem_max = 67108864
# max write buffer
net.core.wmem_max = 67108864
# default read buffer
net.core.rmem_default = 65536
# default write buffer
net.core.wmem_default = 65536
# max processor input queue
net.core.netdev_max_backlog = 4096
# max backlog
net.core.somaxconn = 4096

# resist SYN flood attacks
net.ipv4.tcp_syncookies = 1
# reuse timewait sockets when safe
net.ipv4.tcp_tw_reuse = 1
# turn off fast timewait sockets recycling
net.ipv4.tcp_tw_recycle = 0
# short FIN timeout
net.ipv4.tcp_fin_timeout = 30
# short keepalive time
net.ipv4.tcp_keepalive_time = 1200
# outbound port range
net.ipv4.ip_local_port_range = 10000 65000
# max SYN backlog
net.ipv4.tcp_max_syn_backlog = 4096
# max timewait sockets held by system simultaneously
net.ipv4.tcp_max_tw_buckets = 5000
# turn on TCP Fast Open on both client and server side
net.ipv4.tcp_fastopen = 3
# TCP receive buffer
net.ipv4.tcp_rmem = 4096 87380 67108864
# TCP write buffer
net.ipv4.tcp_wmem = 4096 65536 67108864
# turn on path MTU discovery
net.ipv4.tcp_mtu_probing = 1

# for high-latency network
net.ipv4.tcp_congestion_control = bbr

然后以root身份运行以下命令即可。(重启系统不需要重新执行)

sysctl --system

 

V. 客户端配置

SS系相比V2Ray的一大优点就是客户端有着成熟好用的GUI。跟随界面引导可以比较容易的成功配置客户端,因此在此不再过多说明配置方法,可以参考官方教程和网上其他网友分享的经验。

 

VI. 延伸阅读和后续维护

到此为止,SS的配置已经结束,可以科学上网了。但是从安全角度出发目前VPS上的系统并不够安全。建议从以下几个方面自行Google寻找解决方案

  1. 建立新用户,并将该用户加入sudoer,使用该用户远程登录(ssh)
  2. 禁止root用户远程访问
  3. 设置强密码,然后使用SSH Keys而非密码的方式远程登录
  4. 设定防火墙,阻止除了SS端口和常用端口外的一切传入连接

另外,用户良好的使用习惯是延长梯子寿命的关键因素。在日常使用中切记以下几点:

  1. 远离360、百度、腾讯、迅雷等国产(流氓)软件全家桶。你不能保证这些应用不会读取你计算机上的SS配置并直接上报GFW
  2. 合理使用,不要滥用,不要将配置随意分享到互联网上,或者与过多的人共享你的配置
  3. 不要在受监管环境内发表反动言论,或搭建飞机场拉客
  4. 不要使用梯子挂种子等能产生P2P流量的软件。VPS服务商可能禁止此类流量
  5. 注意保护隐私,不要随意公布IP地址。使用强密码保护VPS账户和VPS本身。

后记

教程本身到这里就结束了。这一篇的体量比我想象的还要大,花了两大段时间才最终完成。比较后悔的是花了大部分的时间讲很弱智的Vultr,等写到SS配置的时候却因为实在太复杂不知道从何下手,有很多零碎的点不知道在哪里加入为好。不过全程复制粘贴也能够操作成功,至少小白向算是勉强达到了。而且自己需要重新搭建的时候,也可以把自己写的东西当作索引,不用满处翻来翻去了。

如果有问题可以加入telegram讨论组去和大家交流互动:


5 条评论

canmipai

canmipai · 10/27/2017 上午1:05

尚未完成编写,先发出来,省得十月一篇也没有233

更新:
这个坑算是填完了。这两天把v2理顺了争取把v2的ws+tls配置流程汇总出来

    OLDKEN

    OLDKEN · 10/27/2017 下午4:50

    你竟然用黑色的对话框,丧心病狂

      canmipai

      canmipai · 10/28/2017 下午2:42

      厉害了大爷,我这几个主题有的配色自动选的黑色标题,我感觉其实还是蛮酷的

yulisunny

yulisunny · 11/10/2017 上午8:53

nice!

发表评论