折腾搬瓦工–02–搭建shadowsocks服务端

Overview

更新(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.1/24

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

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

创建的lkl-tap信息

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

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

1iptables -t nat -A PREROUTING -i venet0 -p tcp -m tcp --dport 2333 -j DNAT --to-destination 10.0.0.2
2iptables -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配置

 1LD_PRELOAD=/etc/liblkl-hijack.so
 2LKL_HIJACK_NET_QDISC="root|fq"
 3LKL_HIJACK_SYSCTL="net.ipv4.tcp_fastopen=3;net.ipv4.tcp_congestion_control=bbr;net.ipv4.tcp_wmem=4096 16384 30000000"
 4LKL_HIJACK_OFFLOAD="0x9983"
 5LKL_HIJACK_NET_IFTYPE=tap
 6LKL_HIJACK_NET_IFPARAMS=lkl-tap
 7LKL_HIJACK_NET_IP=10.0.0.2
 8LKL_HIJACK_NET_NETMASK_LEN=24
 9LKL_HIJACK_NET_GATEWAY=10.0.0.1
10LKL_HIJACK_DEBUG=all

日志

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

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

2.安装编译环境

1apt-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./autogen.sh
2./configure --prefix=/usr 
3make

4.安装后的配置

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

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

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

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

最后启用shadowsocks-libev

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

5.启用多个ss-server

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

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

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

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

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

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

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

1net.ipv4.tcp_fastopen=3
2net.core.default_qdisc=fq
3net.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版

让我们看看官网的教程

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

然后直接启动

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

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

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

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

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

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

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

前台运行

1ssserver -c /etc/`shadowsocks.json

后台运行

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

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

1apt-get install python-m2crypto supervisor

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

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

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

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

1type ssserver

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

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

1ulimit -n 51200

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

1service supervisor start
2supervisorctl reload

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

libev版

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

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

添加公钥

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

然后更新源,安装ss

1apt-get update
2apt-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 里的一行

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

接着同python版中重启服务。

总结

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

comments powered by Disqus