苏苏的博客

简约至极

shadowsocks libev

静态编译shadowsocks libev

在alpine里编译

apk update && apk upgrade && apk add wget make gcc g++ perl

先安装依赖

# Installation of Libsodium
cd /tmp
export LIBSODIUM_VER=1.0.12
wget --no-check-certificate https://download.libsodium.org/libsodium/releases/libsodium-$LIBSODIUM_VER.tar.gz
tar xvf libsodium-$LIBSODIUM_VER.tar.gz
cd libsodium-$LIBSODIUM_VER
./configure --prefix=/usr && make -j2 && make install
cd /tmp
ldconfig

# Installation of MbedTLS
cd /tmp
export MBEDTLS_VER=2.6.0
wget --no-check-certificate https://tls.mbed.org/download/mbedtls-$MBEDTLS_VER-gpl.tgz
tar xvf mbedtls-$MBEDTLS_VER-gpl.tgz
cd mbedtls-$MBEDTLS_VER
make SHARED=1 CFLAGS=-fPIC && make DESTDIR=/usr install
cd /tmp
ldconfig

安装完这两个依赖后,下面准备开始静态编译

apk update && apk upgrade && apk add gcc g++ make autoconf curl wget build-base linux-headers libev-dev libtool udns-dev libsodium-dev mbedtls-dev pcre-dev
SS_VER=3.0.8
cd /tmp
curl -sSL https://github.com/shadowsocks/shadowsocks-libev/releases/download/v${SS_VER}/shadowsocks-libev-${SS_VER}.tar.gz |  tar xz --strip 1
CFLAGS=-Os ./configure --prefix=/usr --enable-static --disable-documentation
sed -i "s/LDFLAGS = /LDFLAGS = -all-static/g" ./src/Makefile
sed -i "s/LDFLAGS = /LDFLAGS = -all-static/g" ./Makefile

make 之前需要存在以下文件/usr/lib/libev.a /usr/lib/libsodium.a /usr/lib/libpcre.a

make -j2 编译完成后即可在src目录得到静态编译的ss-local,ss-server等

使用

启动server端

ss-server -s 0.0.0.0 -p 443 -k 123456 -m rc4-md5 -t 300 -d 8.8.8.8 -u

with Linux kernel > 3.7.0 可以加上--fast-open

ss-server -s 0.0.0.0 -p 443 -k 123456 -m rc4-md5 -t 300 -d 8.8.8.8 --fast-open -u

后台运行:

ss-server -s 0.0.0.0 -p 443 -k 123456 -m rc4-md5 -t 300 -d 8.8.8.8 -u > /tmp/ss.log 2>&1 &

GO语言版本的也十分方便哦

这里提供一个基于docker的go语言版本,docker go shadowsocks,只有3.3MB 十分方便

同时也含有libev版本的可供选择

加密方式

AEAD 是 Shadowsocks 最新的协议标准,增强了应对发现和检测的强度。

https://shadowsocks.org/en/spec/AEAD-Ciphers.html

以下是四种常见的AEAD Cipher,相较OTA Cipher而言AEAD Cipher极大降低了被主动探测的风险,故推荐使用AEAD Cipher

aes-128-gcm aes-192-gcm aes-256-gcm chacha20-ietf-poly1305 以及几种常用的OTA Cipher方式

rc4-md5 aes-128-cfb aes-128-ctr 关于AEAD Cipher的选择,需要注意的是,虽然ARM早在2015就收购了Shadowsocks-libev依赖的加密库之一mbed tls,但至今mbed tls并未对ARMv8做出实质性的优化,导致AES GCM系Cipher在较新的64位移动设备上性能低下

1、“chacha20-poly1305” “chacha20-ietf-poly1305”有区别

2、ChaCha20-Poly1305是Google所采用的一种新式加密算法,性能强大,在CPU为精简指令集的ARM平台上尤为显著(ARM v8前效果较明显),在同等配置的手机中表现是AES的4倍(ARM v8之后加入了AES指令,所以在这些平台上的设备AES方式反而比chacha20-Poly1305方式更快,性能更好),可减少加密解密所产生的数据量进而可以改善用户体验,减少等待时间,节省电池寿命等。

3、chacha20-ietf-poly1305也是一种新式加密算法,比chacha20-poly1305”更快。

4、谷歌选择了ChaCha20和伯恩斯坦的Poly1305消息认证码取代过去一直在互联网安全领域使用的基于OpenSSL的RC4密码,谷歌最初是为了保证能够在Android手机上的Chrome浏览器和谷歌网站间的HTTPS(TLS/SSL)通讯。

5、在谷歌采用TLS(安全传输层协议)不久后,ChaCha20和Poly1305均用在OpenSSH中的ChaCha20-Poly1305新算法中,这使得OpenSSH可能避免因编译时间对OpenSSL产生依赖。ChaCha20还用于OpenBSD(一种多平台类UNIX操作系统)中的RC4随机数生成器,在DragonFlyBSD中作为内核的伪随机数产生器(Cryptographically Secure Pseudo-Random Number Generator,简称CSPRNG)的子程序。

AEAD&OTA Cipher performance test

网络内核参数优化

修改ulimit

ulimit -n 可以查看当前的

vim /etc/security/limits.conf

添加一下两行

* soft nofile 51200
* hard nofile 51200

KVM 和 XEN 可以修改内核,明显提升网络环境差的情况下的表现,使用hybla控制算法,效果明显,能提速30%

/etc/sysctl.conf

net.core.somaxconn = 4096
net.netfilter.nf_conntrack_max = 64000
fs.file-max = 51200
#提高整个系统的文件限制
net.ipv4.tcp_syncookies = 1
#表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;
net.ipv4.tcp_tw_reuse = 1
#表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;
net.ipv4.tcp_tw_recycle = 0
#表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭;
#为了对NAT设备更友好,建议设置为0。
net.ipv4.tcp_fin_timeout = 30
#修改系統默认的 TIMEOUT 时间。
net.ipv4.tcp_keepalive_time = 1200
#表示当keepalive起用的时候,TCP发送keepalive消息的频度。缺省是2小时,改为20分钟。
net.ipv4.ip_local_port_range = 10000 65000 #表示用于向外连接的端口范围。缺省情况下很小:32768到61000,改为10000到65000。(注意:这里不要将最低值设的太低,否则可能会占用掉正常的端口!)
net.ipv4.tcp_max_syn_backlog = 8192
#表示SYN队列的长度,默认为1024,加大队列长度为8192,可以容纳更多等待连接的网络连接数。
net.ipv4.tcp_max_tw_buckets = 5000
#表示系统同时保持TIME_WAIT的最大数量,如果超过这个数字,TIME_WAIT将立刻被清除并打印警告信息。
#额外的,对于内核版本新于**3.7.1**的,我们可以开启tcp_fastopen:
net.ipv4.tcp_fastopen = 3

#increase TCP max buffer size settable using setsockopt()
net.core.rmem_max = 67108864
net.core.wmem_max = 67108864
#increase Linux autotuning TCP buffer limit
net.ipv4.tcp_rmem = 4096 87380 67108864
net.ipv4.tcp_wmem = 4096 65536 67108864
#increase the length of the processor input queue
net.core.netdev_max_backlog = 250000
#recommended for hosts with jumbo frames enabled
net.ipv4.tcp_mtu_probing=1
#使用拥塞算法Hybla
net.ipv4.tcp_congestion_control = hybla

然后sysctl -p使之生效

也可以使用命令使本次生效

sysctl -w net.ipv4.tcp_congestion_control=hybla

sysctl -w net.ipv4.tcp_fastopen=3

可参见 https://github.com/Long-live-shadowsocks/shadowsocks/wiki/Optimizing-Shadowsocks

OPENVZ只能修改

net.core.somaxconn = 4096
net.ipv4.tcp_syncookies = 1
net.netfilter.nf_conntrack_max = 64000

使用kcptun加速

服务器上

alias kcptun_start='server_linux_amd64 -t 127.0.0.1:443 -l :4433 -sndwnd 2048 -rcvwnd 2048 -mode fast2 > /var/log/kcptun.log 2>&1 & '

客户机上

alias kcptun_start='kcptun_client -r vpsIP:4433 -l :4433 -sndwnd 2048 -rcvwnd 2048 -mode fast2 > /var/log/kcptun.log 2>&1 &'

python 版本

升级pip本身

pip install --upgrade pip
pip install shadowsocks --upgrade

--upgrade 同 -U 代表如果已安装则升级到最新版

/etc/systemd/system/目录下shadowsocks.service

[Unit]
Description=Shadowsocks

[Service]
TimeoutStartSec=0
ExecStart=/usr/bin/ssserver -c /etc/shadowsocks.json

[Install]
WantedBy=multi-user.target

/etc/systemd/system/v2ray.service

[Unit]
Description=V2Ray Service
After=network.target
Wants=network.target

[Service]
Type=simple
PIDFile=/var/run/v2ray.pid
ExecStart=/usr/bin/v2ray/v2ray -config /etc/v2ray/config.json
Restart=on-failure

[Install]
WantedBy=multi-user.target

配置 tls + ws

使用 kcptun 加速

https://github.com/xtaci/kcptun go语言编写,直接下载使用即可

KCP Server:

./server_linux_amd64 -t "127.0.0.1:443" -l ":4000" -mode fast3 -nocomp -sockbuf 16777217 -dscp 46

KCP Client:

./client_darwin_amd64 -r "52.78.236.26:4000" -l ":80" -mode fast3 -nocomp -autoexpire 900 -sockbuf 16777217 -dscp 46

./client_darwin_amd64 -r "52.78.236.26:4000" -l ":443" -mode fast3 -nocomp -autoexpire 900 -sockbuf 16777217 -dscp 46

alias kcptun_start='server_linux_amd64 -t 127.0.0.1:443 -l :serverPort -sndwnd 2048 -rcvwnd 2048 -mode fast2 > /var/log/kcptun.log 2>&1 & '

client端: client_linux_amd64 -r serverIp:serverPort -l :443 -sndwnd 2048 -rcvwnd 2048 -mode fast2

kcptun 使用udp通信,监听的udp端口,未开启tcp端口. python shadowsocks是tcp端口和udp端口都开启.

使用netstat -anlup查看本机的udp端口使用情况,远端可以使用nc测试UDP端口 nc -vuz 172.168.1.3 137

配置文件的json格式参见 http://zhangyongcun.com/2016/11/22/使用-Kcptun-加速-shadowsocks/

client wget http://share.suconghou.cn/files/shadowsocks/kcp/client_config.json

server wget http://share.suconghou.cn/files/shadowsocks/kcp/server_config.json

server_config.json

/etc/systemd/system/kcpserver.service

[Unit]
Description=kcptun-server

[Service]
TimeoutStartSec=0
ExecStart=/usr/local/bin/server_linux_amd64 -c /etc/server_config.json

[Install]
WantedBy=multi-user.target

server

./udp2raw -s -l0.0.0.0:8855 -r 127.0.0.1:4000 -k "passwd" --raw-mode faketcp -a

统计ss当前的链接

统计当前连接ss的客户端,并统计连接数

netstat -nat | grep "192.168.1.3:443" |awk '{print $5}'|awk -F: '{print $1}'|sort|uniq -c|sort -nr|head -20