折腾搬瓦工–02–搭建shadowsocks服务端
文章目录
更新(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_fastopen与LKL_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: virtio_mmio.device=268@0x1000000: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.service、shadowsocks-libev01、config01.json,分别存储到 /lib/systemd/system、/etc/default、/etc/shadowsocks-libev,然后修改前两个文件,把里面对应的EnvironmentFile与CONFFILE替换即可,启用和运行时,服务名也改为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左右,但是稳定啊。