Ubuntu 搭建ss服务端笔记(2020年更新)

前言

Shadowsocks 是一个轻量级 socks5 代理,最初用 Python 编写,下面简称 ss。在2019年年末,被指出多个版本的 ss 服务端实现可被重定向攻击(Redirect attack),详见:https://gfw.report/blog/gfw_shadowsocks/zh.html。

在今年(2020)年初,有研究者指出了攻击方法,证实了部分ss服务端实现存在重定向攻击漏洞,并指出指导意见,详见:https://github.com/edwardz246003/shadowsocks。

文中提到:Only Use: shadowsocks-libev, go-shadowsocks2 and only use the AEAD ciphers

也就是推荐使用 shadowsocks-libevgo-shadowsocks2,并需要使用AEAD 加密协议

本文介绍 shadowsocks-libev 最新版本的编译和安装。

准备

安装之前,需要打开 ssh,而且最好做好相关防护,不然端口很可能被扫爆。

更新源

1
sudo apt update && sudo apt upgrade && sudo apt autoremove

准备编译环境

1
2
3
4
sudo apt install --no-install-recommends build-essential autoconf libtool \
         libssl-dev gawk debhelper dh-systemd init-system-helpers pkg-config asciidoc \
         xmlto apg libpcre3-dev zlib1g-dev libev-dev libudns-dev libsodium-dev \
         libmbedtls-dev libc-ares-dev automake

fail2ban

安装 fail2ban 服务,该服务装好后重启生效、自启动,作用:ssh登录错误5次ban10分钟。

1
sudo apt install fail2ban

另外可以在 /etc/fail2ban/jail.conf 修改fail2ban参数。

编译

获取shadowsocks-libev源码, 并安装

1
2
3
4
5
6
sudo apt install git
git clone https://github.com/shadowsocks/shadowsocks-libev.git
cd shadowsocks-libev
git submodule update --init
./autogen.sh && ./configure --disable-documentation && make
sudo make install

配置说明

创建配置文件

1
2
sudo mkdir /etc/shadowsocks-libev
sudo vim /etc/shadowsocks-libev/config.json

shadowsocks-libev 的配置文件是一个json形式的文件,各参数的意义和命令行参数意义相同

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{
    "server": "0.0.0.0",
    "server_port": 8848,
    "local_address": "127.0.0.1",
    "local_port": 1080,
    "password": "mypassword",
    "timeout": 300,
    "method": "chacha20-ietf-poly1305",
    "fast_open": false,
    "workers": 1,
    "prefer_ipv6": false
}

服务器地址(server)就写0.0.0.0即可,0.0.0.0意思是转发到外网,不要写127.0.0.1,127.0.0.1是仅在内网使用

端口号(server_port)可以自己写,但是不要占用其他服务的端口。

本地地址(local)和本地端口(local_port)是客户端使用的,服务端可以不用理会。

密码(password)尽量采用复杂一点的密码,以保证安全性。

加密方式(method),推荐使用 *AEAD 加密协议*。shadowsocks-libev中支持的 ***AEAD 加密协议如下:***

  • AES-128-GCM
  • AES-192-GCM
  • AES-256-GCM
  • ChaCha20-IETF-Poly1305
  • XChaCha20-IETF-Poly1305

注:如果仅仅在手机或者电脑使用(CPU含有AES的加速指令集),建议使用 AES-XXX-GCM 系列,如果是路由器使用推荐 chacha20-ietf-poly1305x*chacha20-ietf-poly1305*

fast_open 如果服务器是 Linux 系统的话,待安装完毕后,参照后续的优化部分可以打开 。

vim 配置文件编辑完毕之后,按 :wq 以保存并退出。

创建系统服务并设置自启动

创建Shadowsocks-libev.service配置文件

1
sudo vim /etc/systemd/system/shadowsocks-libev.service

写入

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
[Unit]
Description=Shadowsocks-libev Server
After=network.target

[Service]
Type=simple
ExecStart=/usr/local/bin/ss-server -c /etc/shadowsocks-libev/config.json -u
Restart=on-abort

[Install]
WantedBy=multi-user.target

启动 Shadowsocks

1
sudo systemctl start shadowsocks-libev

设置开机启动

1
sudo systemctl enable shadowsocks-libev

至此已经安装成功!

后续

优化吞吐量

新建配置文件:

1
sudo vim /etc/sysctl.d/local.conf

写入:

 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
#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

net.ipv4.tcp_congestion_control = bbr

运行:

1
sudo sysctl --system

编辑配置文件 limits.conf

1
sudo vim /etc/security/limits.conf

在文件结尾添加两行:

1
2
* soft nofile 51200
* hard nofile 51200

编辑 shadowsocks-libev 服务

1
2
# 服务配置文件名称视具体而定
sudo vim /etc/systemd/system/shadowsocks-libev.service

[Service] 之后加入 ExecStartPre=/bin/sh -c ‘ulimit -n 51200’ 如下所示:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
[Unit]
Description=Shadowsocks-libev Server
After=network.target

[Service]
Type=simple
# 服务配置可能有所不一样,视实际而定
# 在这里加入 ExecStartPre=/bin/sh -c 'ulimit -n 51200'
ExecStartPre=/bin/sh -c 'ulimit -n 51200'
ExecStart=/usr/local/bin/ss-server -c /etc/shadowsocks-libev/config.json -u
Restart=on-abort

[Install]
WantedBy=multi-user.target

重新加载 shadowsocks-libev 服务配置

1
sudo systemctl daemon-reload

重启 shadowsocks-libev 服务

1
sudo systemctl restart shadowsocks-libev

开启TCP Fast Open

TCP Fast Open 可以降低 Shadowsocks 服务器和客户端的延迟。实际上在上一步已经开启了 TCP Fast Open,现在只需要在 Shadowsocks 配置中启用 TCP Fast Open。

1、编辑config.json:

1
sudo vi /etc/shadowsocks-libev/config.json

将 fast_open 的值由 false 修改为 true

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
    "server": "0.0.0.0",
    "server_port": 8848,
    "local_address": "127.0.0.1",
    "local_port": 1080,
    "password": "mypassword",
    "timeout": 300,
    "method": "chacha20-ietf-poly1305",
    /*这里设置 fast_open:true,如果没有则加入*/
    "fast_open": true,
    "workers": 1,
    "prefer_ipv6": false
}

2、重启 shadowsocks-libev 服务:

1
sudo systemctl restart shadowsocks-libev

开启 BBR

Google 开源了其 TCP BBR 拥塞控制算法,并提交到了 Linux 内核,从 4.9 开始,Linux 内核已经用上了该算法。根据以往的传统,Google 总是先在自家的生产环境上线运用后,才会将代码开源,此次也不例外。 根据实地测试,在部署了最新版内核并开启了 TCP BBR 的机器上,网速甚至可以提升好几个数量级。

运行 lsmod | grep bbr,如果结果中没有tcp_bbr,则先运行:

1
2
modprobe tcp_bbr
echo "tcp_bbr" >> /etc/modules-load.d/modules.conf

Ubuntu 18.04 LTS 等新版系统可以直接开启 BBR:

1
2
3
sudo bash -c 'echo "net.core.default_qdisc=fq" >> /etc/sysctl.conf'
sudo bash -c 'echo "net.ipv4.tcp_congestion_control=bbr" >> /etc/sysctl.conf'
sudo sysctl -p

保存生效。运行:

1
2
sysctl net.ipv4.tcp_available_congestion_control
sysctl net.ipv4.tcp_congestion_control

若均有 bbr ,则恭喜 BBR 已经开启。开启 BBR 后,网速有极大提升,我的树莓派从原来的 40Mbps 左右带宽增速到了 80Mbps,效果显著。