科学上网 - VPS 搭建 Shadowsocks 并开启 BBR

0x00 前言

本文仅供学习,请勿用于非法用途!

首先,你要有台服务器,个人用过几个不同服务商的 VPS,有:

  • 搬瓦工:第一次自己买 VPS 搭 SS 的服务商,价格挺便宜的,实惠一点的,100出头一点可以用一年,每月 2T 的流量,20 GB 的硬盘,忘了是不是 SSD 的了。但是速度慢,很卡,后来没到期就不用了。
  • 阿里云:买的是香港的服务器,2016 年双 11 买的,还打折(后来证明没什么卵用,没便宜),500 多一年,流量另算,1 GB 1 块钱,速度很快,但是 2017 年 10 月份十九大之前,竟然被封了 IP。所以换别的服务商。
  • Vultr(通过此链接注册,你可以免费获得 10 美元,同时也能帮助我获得一些小奖励,谢谢!):阿里云被封了 IP 之后,看同事在用这个,就买了这个的日本机房的 VPS,但是搭完之后,没过3天,就被封了 IP,又燃起换服务商的想法,然后看到 Linode 有日本机房的 VPS 可以选,然后就退款,换到 Linode 了。
  • Linode:换到 Linode 才真正开始了折腾之路,申请过更换 IP,但是被拒,然后我的解决办法是切换机房,从日本东京切换到新加坡,或者删掉已有的重新创建一个,IP 也是不一样的,但是依然被封 IP,有时候新创建的 VPS 的 IP 是已经被封的。感觉是因为用了 rc4-md5 的加密算法,遂使用更安全更快速的 chacha20,依然逃不过被封 IP 的厄运。
  • Google Cloud Platform: 于 2018 年 5 月底开始转战 GCP,速度很快,删掉了 Linode 的主机,而且 GCP 也送了 300 美元,够用好多个月了。

FUCKING GFW!!!!!!!!!!!!!!!!!!!!

ox01 开始搭建 SS

上面啰嗦了这么多,现在开始搭建 SS,这里服务商就以 Linode 为例,系统就用 Ubuntu 14.04 LTS。

0x0100 创建服务器

  • 在 Linode 上新建一个服务器,配置随便,搭 SS 用最低的就够用了,然后地点选日本:

  • 创建好了之后,点击名称或者 Dashboard 进入详情:

  • 现在服务器还没有配置一个系统,我们点击 Deploy an Image,来安装一个系统:

  • 系统选择 Ubuntu 14.04 LTS,再设置一下 root 密码,后面 ssh 登录会用到:

  • 创建完之后,等下面 Host Job Queue 中的进度都完成了,点击 Boot 按钮启动服务器。或者直接点 Boot 按钮,Linode 会按队列来一个个执行:

  • 服务器运行起来之后,现在我们就可以使用 ssh 登录服务器了,但是为了避免分配的服务器的 IP 是已经被封的,首先我们先 ping 一下 IP,避免做无用功:

看来是被封过的,那我们只能重头开始重新创建一个服务器了。

  • 拿到一个 IP 没有被封的服务器,我们 ssh 连接上去,如果电脑终端连接不上去的,可以先用 Linode 提供的 Glish 连接:

0x0101 搭建 SS

  • 首先,我们先更新一下 apt-get:
1
$ apt-get update

然后等待完成,需要一点时间。

  • 完成之后,我们先安装 python-pip 等一些库(中间需要确认安装一下,输入 y 然后回车):
1
$ apt-get install python-pip python-m2crypto
  • 然后就可以安装 SS 了:
1
$ pip install shadowsocks
  • 很快就安装好了,然后我们创建所需的文件夹和 config.json 文件:
1
2
3
4
$ cd /etc
$ mkdir shadowsocks
$ cd shadowsocks/
$ vi config.json

然后输入一下内容:

1
2
3
4
5
6
7
8
9
{
"server": "YOUR_SERVER_IP",
"server_port": 8388,
"local_port": 1080,
"password": "YOUR_SS_PASSWORD",
"timeout": 300,
"method": "aes-256-cfb",
"fast_open": false
}

(2017-10-30 更新):最近封锁越来越严重,推荐使用常用端口。

  • 然后就可以启动 SS 了:
1
$ sudo /usr/local/bin/ssserver -c /etc/shadowsocks/config.json --user nobody -qq -d start

也可以把这个命令加到 /etc/rc.local 里面,每次系统启动都会启动 SS,注意要在 exit 0 之前:

然后要么重启一下服务器,要么重新运行一下刚刚添加的那条命令,启动 SS。

到这里,SS 搭建就完成了。

0x0102 加密方式

上面使用的加密方式是 aes-256-cfb,还有一个更快更安全的 chacha20 或者 salsa20,但是我用过 chacha20,还是被封 IP,要是想用这个加密方式,还要额外的几步,因为还缺少了一个库:libsodium,不然启动 SS 的时候,会报错,安装方法如下:

  • 安装 libsodium,需 >= 1.0.0
1
2
3
4
5
6
7
8
$ sudo apt-get install build-essential
$ cd /tmp
$ wget https://download.libsodium.org/libsodium/releases/LATEST.tar.gz
$ tar zxf LATEST.tar.gz
$ cd libsodium*
$ ./configure
$ make -j2
$ sudo make install
  • 然后将下面的代码加入到 /etc/ld.so.conf
1
2
3
4
include ld.so.conf.d/*.conf"
/lib
/usr/lib64
/usr/local/lib
  • 再重新载入配置:
1
$ sudo ldconfig
  • 最后重新启动 SS 即可。

0x0103 ss 启动成功,但是并没有运行

在启动了 ss 之后,终端打印:

1
2
3
root@tw:~# sudo /usr/local/bin/ssserver -c /etc/shadowsocks/config.json --user nobody -qq -d start
INFO: loading config from /etc/shadowsocks/config.json
started

但是查看当前进程,并没有 ssserver

1
2
3
4
5
root@tw:~# ps -e | grep ss
1372 ? 00:00:00 sshguard
1619 ? 00:00:00 sshd
2031 ? 00:00:00 sshd
2105 ? 00:00:00 sshd

被这个问题困扰了很久,中间还放弃过一次,但是本着不放过的原则,重新开始搭建。

想到既然启动成功,但是并没有运行,应该查看下 log,所以:

1
sudo less /var/log/shadowsocks.log

日志中出现最多,最引人注目的是:

1
socket.error: [Errno 99] Cannot assign requested address

看字面意思应该是分配地址有问题,遂去 Google 搜索,找到的可用方法是,将配置文件的 Server 地址改成 0.0.0.0,重新启动下 ss,就可以正常启动并运行了。

0x02 更换系统内核并开启 TCP BBR

TCP BBR 是 Google 开发的新的拥塞控制算法,据说是用在 YouTube 上,并且在去年 9 月开源并且现在已经集成到 Linux 4.9-rc8 之后版本的内核中。虽然 Linode 也更新到了 4.9 版本内核,但是并没有 TCP BBR,所以还是要自己更换一下内核。

0x0200 更换系统内核

这里要注意的一点是,如果你的 VPS 使用的是 OpenVZ 的虚拟技术,你是不能使用 BBR 的。并且系统要求在 CentOS 6+,Debian 7+,Ubuntu 12+。

首先确定下自己购买的 VPS 的架构吧,这里就不涉及了,自己去找吧。

这里我就选 4.13.9 了,如果你要选择别的内核版本,完整列表在这里

  • 下载内核文件:
1
2
$ cd /tmp
$ wget http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.13.9/linux-image-4.13.9-041309-generic_4.13.9-041309.201710211231_amd64.deb
  • 等待下载完成,然后使用 dpkg -i 命令安装:
1
$ dpkg -i linux-image-4.13.9-041309-generic_4.13.9-041309.201710211231_amd64.deb
  • 安装完成以后,查看一下已安装的内核列表:
1
$ dpkg -l | linux-image
  • 如果看到了刚刚安装的内核,证明安装成功了,然后我执行一下内核更新,然后重启:
1
2
$ update-grub
$ reboot
  • 重新 ssh 连接,查看一下系统内核:
1
$ uname -a

发现还是旧的内核,网上找了一下原因,解决办法如下:

  • 安装内核系统引导:
1
$ apt-get install linux-image-virtual grub2

会出现这个界面,我是直接回车确定的:

  • 确定一下你的内核已经被安装上,是否有刚刚安装的那个内核:
1
$ ls /boot/vmlinuz*

  • 然后编辑 grub 文件:
1
$ vi /etc/default/grub

如果和下面有不一样的,修改成一样的(其实我这基本都不用改,默认就是这样):

1
2
3
4
5
GRUB_TIMEOUT=10
GRUB_CMDLINE_LINUX="console=ttyS0,19200n8"
GRUB_DISABLE_LINUX_UUID=true
GRUB_SERIAL_COMMAND="serial --speed=19200 --unit=0 --word=8 --parity=no --stop=1"
GRUB_TERMINAL=serial
  • 更新 grub:
1
$ update-grub
  • 显示在最顶端的 kernel 就是即将启动的 kernel 。如果没显示在最顶端,就把其余的 kernel 删掉(一般都在最顶端):
1
$ apt-get purge 旧内核名称
  • 然后进入 Linode 的 Dashboard,点击 Edit:

  • 在 Kernel 选项处选择 GRUB 2,然后点击 Save Changes 按钮,然后重启 VPS,看看是否内核更新了:

1
$ uname -a

如果显示的是你安装的新的内核,说明成功了。

0x0201 开启 TCP BBR

  • 执行下面两条命令:
1
2
echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf
echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf
  • 保存生效:
1
$ sysctl -p
  • 执行:
1
sysctl net.ipv4.tcp_available_congestion_control

则会打印:

1
net.ipv4.tcp_available_congestion_control = bbr cubic reno
  • 然后查看 TCP BBR 是否运行:
1
$ lsmod | grep bbr

如果结果中有 tcp_bbr 说明 BBR 已经启动了。

0x03 修改 SSH 远程登录端口

  • 修改 /etc/ssh/sshd_config,在 Port 22 下添加你的端口:
1
2
Port 22
Port YOUR_PORT
  • 修改 /etc/ssh/ssh_config,在 Host * 下添加你的端口:
1
2
3
4
5
Host *
Port 22
Port YOUR_PORT
# ForwardAgent no
...
  • 重启 SSH
1
service ssh restart
  • 再 SSH 连接新的端口,成功连接后再修改上面的配置把 22 端口注释掉。再在本机 ~/.ssh/ 下新建一个 config 文件,文件内容为:
1
2
3
Host YOUR_HOST
User YOUR_USER_NAME
Port YOUR_NEW_PORT

这样下次连接就只需要 ssh YOUR_HOST 就可以了。

  • 修改 SSH 默认端口后 git 的一些远程操作会失败,解决办法也是修改 config 文件:
1
2
3
4
5
6
Host github.com
HostName github.com
Port 22
Host bitbucket.org
HostName bitbucket.org
Port 22

0x04 参考链接

BBR 官方论坛
BBR Quick Start
Shadowsocks wiki Encryption