更新(2017.05.24)

感谢91yun的linhua,折腾出了一个可以在openVZ主机上启用BBR的方法

原地址在这里:OpenVZ使用BBR新姿势:LKL一键安装包(比UML简单)-5月9日更新

道理比较简单,不过实际操作起来,还是有点麻烦。原理是新建一个虚拟网卡并绑定IP地址段,将程序监听地址绑定到虚拟网卡的地址上,编译Linux Kernel Library得到动态库,覆盖程序里原有的系统调用,可以实现替换拥塞算法,排队规则,还可以启用tcp_fastopen,但并不是适用于所有的程序,原文链接中hook了haproxy,在PREROUTING时直接把TCP包先转发给haproxy,经过处理后转发给目标程序,理论上可以加速任意基于TCP协议的网络应用~看它的iptables转发规则和处理逻辑,感觉和openVZ上启用IKEv2有点像。

这里直接hook了shadowsocks-libev,使用systemd管理程序运行,假定shadowsocks监听的端口为2333,服务器地址为23.23.233.66,新建的虚拟网卡为lkl-tap,绑定地址段10.0.0.124

/etc/network/if-up.d/tap文件,添加可执行权限,当服务器重启后会自动添加lkl-tap,并绑定地址,首次运行时需要直接执行以下的命令

1
2
3
4
#!/bin/sh
ip tuntap add lkl-tap mode tap
ip addr add 10.0.0.1/24 dev lkl-tap
ip link set lkl-tap up

创建的lkl-tap信息

1
2
3
4
5
6
7
8
lkl-tap   Link encap:Ethernet  HWaddr 3a:f2:24:8c:23:e2  
          inet addr:10.0.0.1  Bcast:0.0.0.0  Mask:255.255.255.0
          inet6 addr: fe80::38f2:24ff:fe8c:23e2/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:7752 errors:0 dropped:0 overruns:0 frame:0
          TX packets:15711 errors:0 dropped:4 overruns:0 carrier:0
          collisions:0 txqueuelen:500 
          RX bytes:10951214 (10.9 MB)  TX bytes:15030796 (15.0 MB)

iptables配置,iptables规则也可以保存在一个文件里,让主机在重启后还原这些规则

1
2
iptables -t nat -A PREROUTING -i venet0 -p tcp -m tcp --dport 2333 -j DNAT --to-destination 10.0.0.2
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -j SNAT --to-source 23.23.233.66

liblkl-hijack.so文件:https://soft.91yun.org/uml/lkl/liblkl-hijack.so

这里直接使用linhua编译的动态库,LKL的原地址在这里:https://github.com/lkl/linux

虽然我也向linhua要了一份config文件自行编译出动态库文件,不过运行时总是会出错,大概是UDP相关的内容没配置好

由于我是用systemd来管理shadowsocks-libev,所以直接在环境变量文件里追加这些参数,在重启程序后会覆盖相关的系统调用,这里还启用了tcp_fastopenLKL_HIJACK_DEBUG,在重启程序后,可以使用journalctl命令查看日志

/etc/default/shadowsocks-libev配置

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
LD_PRELOAD=/etc/liblkl-hijack.so

LKL_HIJACK_NET_QDISC="root|fq"

LKL_HIJACK_SYSCTL="net.ipv4.tcp_fastopen=3;net.ipv4.tcp_congestion_control=bbr;net.ipv4.tcp_wmem=4096 16384 30000000"

LKL_HIJACK_OFFLOAD="0x9983"

LKL_HIJACK_NET_IFTYPE=tap

LKL_HIJACK_NET_IFPARAMS=lkl-tap

LKL_HIJACK_NET_IP=10.0.0.2

LKL_HIJACK_NET_NETMASK_LEN=24

LKL_HIJACK_NET_GATEWAY=10.0.0.1

LKL_HIJACK_DEBUG=all

日志

 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
May 22 05:27:45 miku systemd[1]: Started Shadowsocks-libev Default Server Service.
May 22 05:27:45 alicia ss-server[335]: [    0.000000] Linux version 4.10.0+ (vagrant@archlinux.vagrant.vm) (gcc version 6.3.1 20170109 (GCC) ) #7 Tue Mar 28 20:01:40 CST 2017
May 22 05:27:45 alicia ss-server[335]: [    0.000000] bootmem address range: 0x7efc18000000 - 0x7efc1bfff000
May 22 05:27:45 alicia ss-server[335]: [    0.000000] Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 16159
May 22 05:27:45 alicia ss-server[335]: [    0.000000] Kernel command line:  virtio_mmio.device=268@0x1000000:1
May 22 05:27:45 alicia ss-server[335]: [    0.000000] PID hash table entries: 256 (order: -1, 2048 bytes)
May 22 05:27:45 alicia ss-server[335]: [    0.000000] Dentry cache hash table entries: 8192 (order: 4, 65536 bytes)
May 22 05:27:45 alicia ss-server[335]: [    0.000000] Inode-cache hash table entries: 4096 (order: 3, 32768 bytes)
May 22 05:27:45 alicia ss-server[335]: [    0.000000] Memory available: 64492k/0k RAM
May 22 05:27:45 alicia ss-server[335]: [    0.000000] SLUB: HWalign=32, Order=0-3, MinObjects=0, CPUs=1, Nodes=1
May 22 05:27:45 alicia ss-server[335]: [    0.000000] NR_IRQS:4096
May 22 05:27:45 alicia ss-server[335]: [    0.000000] lkl: irqs initialized
May 22 05:27:45 alicia ss-server[335]: [    0.000000] clocksource: lkl: mask: 0xffffffffffffffff max_cycles: 0x1cd42e4dffb, max_idle_ns: 881590591483 ns
May 22 05:27:45 alicia ss-server[335]: [    0.000001] lkl: time and timers initialized (irq2)
May 22 05:27:45 alicia ss-server[335]: [    0.000008] pid_max: default: 4096 minimum: 301
May 22 05:27:45 alicia ss-server[335]: [    0.000044] Mount-cache hash table entries: 512 (order: 0, 4096 bytes)
May 22 05:27:45 alicia ss-server[335]: [    0.000047] Mountpoint-cache hash table entries: 512 (order: 0, 4096 bytes)
May 22 05:27:45 alicia ss-server[335]: [    0.076299] console [lkl_console0] enabled
May 22 05:27:45 alicia ss-server[335]: [    0.076349] clocksource: jiffies: mask: 0xffffffff max_cycles: 0xffffffff, max_idle_ns: 19112604462750000 ns
May 22 05:27:45 alicia ss-server[335]: [    0.078302] NET: Registered protocol family 16
May 22 05:27:45 alicia ss-server[335]: [    0.080545] clocksource: Switched to clocksource lkl
May 22 05:27:45 alicia ss-server[335]: [    0.082962] NET: Registered protocol family 2
May 22 05:27:45 alicia ss-server[335]: [    0.086734] TCP established hash table entries: 512 (order: 0, 4096 bytes)
May 22 05:27:45 alicia ss-server[335]: [    0.086747] TCP bind hash table entries: 512 (order: 0, 4096 bytes)
May 22 05:27:45 alicia ss-server[335]: [    0.086755] TCP: Hash tables configured (established 512 bind 512)
May 22 05:27:45 alicia ss-server[335]: [    0.087524] UDP hash table entries: 128 (order: 0, 4096 bytes)
May 22 05:27:45 alicia ss-server[335]: [    0.087539] UDP-Lite hash table entries: 128 (order: 0, 4096 bytes)
May 22 05:27:45 alicia ss-server[335]: [    0.087691] virtio-mmio: Registering device virtio-mmio.0 at 0x1000000-0x100010b, IRQ 1.
May 22 05:27:45 alicia ss-server[335]: [    0.088158] workingset: timestamp_bits=62 max_order=14 bucket_order=0
May 22 05:27:45 alicia ss-server[335]: [    0.258124] virtio-mmio virtio-mmio.0: Failed to enable 64-bit or 32-bit DMA.  Trying to continue, but this might not work.
May 22 05:27:45 alicia ss-server[335]: [    0.262641] NET: Registered protocol family 10
May 22 05:27:45 alicia ss-server[335]: [    0.341888] Segment Routing with IPv6
May 22 05:27:45 alicia ss-server[335]: [    0.341925] sit: IPv6, IPv4 and MPLS over IPv4 tunneling driver
May 22 05:27:45 alicia ss-server[335]: [    0.342986] Warning: unable to open an initial console.
May 22 05:27:45 alicia ss-server[335]: [    0.343010] This architecture does not have kernel memory protection.
May 22 05:27:45 alicia ss-server[335]:  2017-05-21 17:27:45 INFO: using tcp fast open
May 22 05:27:45 alicia ss-server[335]:  2017-05-21 17:27:45 INFO: UDP relay enabled
May 22 05:27:45 alicia ss-server[335]:  2017-05-21 17:27:45 INFO: initializing ciphers... aes-256-cfb

更新(2017.03.21)

这一篇关于shadowsocks的配置最早写在两年前左右,到现在为止,python原版已经停滞,libev版持续迭代,而ubuntu16.10开始shadowsocks-libev已经集成到官方源中了,可以直接下载使用。目前我的VPS的环境也升级到ubuntu 16.04并使用systemd,这里再做一个记录,在新系统上编译和安装shadowsocks-libev。

教程是从shadowsocks-libev的GitHub项目页面截取,地址在这里:shadowsocks-libev

作者自己提供一个PPA:ppa:max-c-lv/shadowsocks-libev

可以直接添加后下载编译好的程序,下面是从源码编译的记录。

1.下载源码

1
2
3
git clone https://github.com/shadowsocks/shadowsocks-libev.git
cd shadowsocks-libev
git submodule update --init --recursive

2.安装编译环境

1
apt-get install --no-install-recommends gettext build-essential autoconf libtool libpcre3-dev asciidoc xmlto libev-dev libudns-dev automake libmbedtls-dev libsodium-dev

3.编译与安装

1
2
3
./autogen.sh
./configure --prefix=/usr 
make

4.安装后的配置

上面在生成makefile时指定安装目录为/usr,默认的安装目录是/usr/local,但问题是shadowsocks-libev源码目录下的debian目录中,默认配置文件使用/usr作为安装目录的,安装后直接复制service与default文件到指定目录后,执行会老是失败的~下面是复制配置文件的操作

1
2
3
4
5
cd shadowsocks-libev/debian
cp shadowsocks-libev.service /lib/systemd/system
cp shadowsocks-libev.default /etc/default/shadowsocks-libev
mkdir -p /etc/shadowsocks-libev
cp config.json /etc/shadowsocks-libev

然后编辑/etc/shadowsocks-libev/config.json来修改端口和密码,示例内容如下

1
2
3
4
5
6
7
8
{
    "server":"0.0.0.0",
    "server_port":8888,
    "password":"fuckjs",
    "timeout":300,
    "method":"aes-256-cfb",
    "fast_open": true
}

最后启用shadowsocks-libev

1
2
systemctl enable shadowsocks-libev
systemctl start shadowsocks-libev

5.启用多个ss-server

上面的配置只能启用一个端口,如果要开启多个端口,那么可以配置多个config,default和service文件,shadowsocks-libev.serivice与shadowsocks-libev.default的内容如下。

service文件里设定了服务的类型,可执行文件路径与存储环境环境变量的文件路径

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#  This file is part of shadowsocks-libev.
#
#  Shadowsocks-libev is free software; you can redistribute it and/or modify
#  it under the terms of the GNU General Public License as published by
#  the Free Software Foundation; either version 3 of the License, or
#  (at your option) any later version.
#
#  This file is default for Debian packaging. See also
#  /etc/default/shadowsocks-libev for environment variables.
[Unit]
Description=Shadowsocks-libev Default Server Service
Documentation=man:shadowsocks-libev(8)
After=network.target

[Service]
Type=simple
EnvironmentFile=/etc/default/shadowsocks-libev
User=nobody
Group=nogroup
LimitNOFILE=32768
ExecStart=/usr/bin/ss-server -c $CONFFILE $DAEMON_ARGS

[Install]
WantedBy=multi-user.target

default文件里设定了一些环境变量,包括配置端口和密码的json文件路径,用户权限等

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
# Defaults for shadowsocks initscript
# sourced by /etc/init.d/shadowsocks-libev
# installed at /etc/default/shadowsocks-libev by the maintainer scripts
#
# This is a POSIX shell fragment
#
# Note: `START', `GROUP' and `MAXFD' options are not recognized by systemd.
# Please change those settings in the corresponding systemd unit file.
# Enable during startup?
START=yes
# Configuration file
CONFFILE="/etc/shadowsocks-libev/config.json"
# Extra command line arguments
DAEMON_ARGS="-u"
# User and group to run the server as
USER=nobody
GROUP=nogroup
# Number of maximum file descriptors
MAXFD=32768

我们可以把三个文件分别命名为shadowsocks-libev01.serviceshadowsocks-libev01config01.json,分别存储到/lib/systemd/system/etc/default/etc/shadowsocks-libev,然后修改前两个文件,把里面对应的EnvironmentFileCONFFILE替换即可,启用和运行时,服务名也改为shadowsocks-libev01,启用命令同上。

6.启用BBR与TCP fastopen

这个是可选的,但搬瓦工的机子是不支持的,因为内核都在2.6,KVM的机子可以尝试配置。

首先添加launchpad源,ubuntu 17.04预计会使用4.10内核,而bbr从4.9的一个版本开始进程进去,所以可以添加17.04的源来安装4.10内核

在/etc/apt/source.list末尾追加一行

1
deb http://ppa.launchpad.net/canonical-kernel-team/ppa/ubuntu zesty main

更新源,然后安装4.10内核,在重启前,编辑文件/etc/sysctl.conf,在文件末尾追加

1
2
3
net.ipv4.tcp_fastopen=3
net.core.default_qdisc=fq
net.ipv4.tcp_congestion_control=bbr

重启后,会切换内核并应用修改。

前言

科学上网的姿势有很多,但要求一个稳定,跨平台而且价格便宜的姿势就不容易了。

无比英勇的VPN目前已经残疾,至少已经在我平时使用的校园网中跪了,且价格较贵;

至于goagent,偶尔出现证书问题,掉线,安卓需要root,iOS需要越狱,还有不论什么平台都有配置问题,之前在mac上就因为python环境问题搞得最后放弃掉,还有,有些网站,或者爪机上的google play,无法通过它访问或下载应用;

而红杏,她只能在chrome上用,自从建了ss后我就不用了,它是搭建在linode上,速度相比ss总体来说比较快,现在只能邀请注册,下面是邀请链接:

http://honx.in/_U6kGiIKo13KVGsHo

shadowsocks有多个版本,目前稳定维护的有python版本与c版本(shadowsocks-libev),两者的差别在于ibev 版不能通过修改配置文件来多端口(只能开启多进程),需要多端口的就选python版本,而如果买的是搬瓦工64mb,一个人用,还是上libev版,它占用内存小,cpu消耗少,也可以安装在路由器上。

搬瓦工vps自带一键安装ss或openVPN,但仅限centos系统,而且居然他喵的用不了,我们还是手动来,按照第一篇的节奏,我们已经安装好ubuntu 14.04 x86 minimal。

安装

python版

让我们看看官网的教程

1
2
apt-get install python-pip
pip install shadowsocks

然后直接启动

1
ssserver -p 443 -k password -m aes-256-cfb

意思是前台运行,在443端口,密码为password,加密方式为aes-256-cfb,用爪机或者电脑连接后,会显示所有连接信息,后台运行按下面来

1
ssserver -p 443 -k password -m aes-256-cfb --user nobody -d start

但每次这么来,有些蛋疼,我们可以编辑一个json文件,然后直接运行

编辑/etc/shadowsocks.json,文件内容如下

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

我们需要修改的有”server”,”server_port”(最好自己定义一个大于1024的端口),”password”(这个必须的),然后按以下方式运行

前台运行

1
ssserver -c /etc/shadowsocks.json

后台运行

1
2
ssserver -c /etc/shadowsocks.json -d start
ssserver -c /etc/shadowsocks.json -d stop

然而,以上并没有什么卵用,如果开启折腾模式,反复重启,就很蛋疼,即使不是反复重启,而是发生错误导致服务暂停,也需要检测运行状态,考虑是否重新启动ss,所以让我们使用supervisor来管理它吧。

1
apt-get install python-m2crypto supervisor

第一个组件用于aes加密,第二个是我们要使用的supervisor

编辑/etc/supervisor/conf.d/shadowsocks.conf,内容如下

1
2
3
4
[program:shadowsocks]
command=/usr/local/bin/ssserver -c /etc/shadowsocks.json
autorestart=true
user=nobody

ssserver的文件路径可以使用type命令获取

1
type ssserver

如果ssserver的运行端口 < 1024,还需要把上面的 user=nobody 改成 user=root

/etc/default/supervisor 最后加一行:

1
ulimit -n 51200

提升连接数限制,然后启动supervisor

1
2
service supervisor start
supervisorctl reload

这样不论遭遇重新启动或错误,ss都会正常运行

libev版

同样看看官方教程,我们需要先添加源,在/etc/apt/sourcelist文件末添加

1
deb http://shadowsocks.org/debian wheezy main

添加公钥

1
2
wget http://shadowsocks.org/debian/1D27208A.gpg 
apt-key add 1D27208A.gpg

然后更新源,安装ss

1
2
apt-get update
apt-get install shadowsocks-libev

接下来配置json文件,除了路径不同,内容与python相同

编辑/etc/shadowsocks-libev/config.json

文件内容同python版

启动

1
/etc/init.d/shadowsocks-libev start

同样,我们使用supervisor来管理它,这次只安装supervisor,配置同python版,我们只需修改上文中/etc/supervisor/conf.d/shadowsocks.conf里的一行

1
command=/etc/init.d/shadowsocks-libev

接着同python版中重启服务。

总结

就这么愉快地结束了,客户端的使用比较简单,特别是安卓机上,可以登录google play而且可以下载应用了,速度约200k左右,但是稳定啊。