Total Pageviews

Sunday, 23 July 2017

Shadowsocks-libev服务器的一键安装脚本Twist(功能多多)

Q1.为什么使用Shadowsocks协议?

相比传统的VPN(IKE,IPSec),Shadowsocks协议具有更好的灵活性和隐蔽性,且搭建相对简单,因此可以拥有相对传统VPN更快的速度和更高的稳定性;关于其特点,原理及弱点的更多讨论,可以在这里稍做了解,本文不对此长篇大论

Q2.为什么使用Shadowsock-libev服务端?

相比原版Shadowsocks,libev(c#)版本提供了更多的特性支持;而关于ShadowsocksR(Python),Shadowsocks-libev率先支持AEAD加密,并向ShadowsocksR学习引进了Obfs(Simple-Obfs,但与前者原理有所不同),且提供稳定的周期性更新;关于未来,ShadowsocksR更倾向于none加密策略,而Shadowsocks-libev则倾向于传统的加密策略,两者有不同的侧重点(ShadowsocksR更侧重消除特征以更好穿过GFW,而Shadowsocks-libev则追求更高的安全性),综合起来并无优劣之分

①以root权限运行命令

初次连接到实例,一般需要获取root权限(非root用户的情况下),获取方法如下
sudo passwd root
#运行以上命令,重设root用户密码
su
#运行以上命令,使用重设后的root密码登录

②开始搭建Shadowsocks-libev服务端

可以选择使用笔者的自动脚本(Twist)进行搭建或自行搭建(可参考❻疑难解答的Q8回答*),这里主要介绍如何使用前者科学上网:
sudo wget https://raw.githubusercontent.com/Unbinilium/Twist/master/twist -O twist.sh && chmod -x twist.sh
#运行以上命令,下载自动脚本(shell)并赋予权限
bash twist.sh
#运行以上命令,开始搭建服务端;若需自定义*,在运行这条命令之前请先参照下方说明③

③自定义Shadowsocks-libev服务端*

若在安装之前,可以先直接编辑下载后的twist.sh后再安装,编辑命令如下
nano twist.sh
#运行以上命令进行编辑
在编辑界面定位到function shadowsocksconfig(){以下至}前的内容,编辑""内的参数,下面是关于参数的简单介绍(说明中未标出及说明后面带有"!"号的是不建议修改的参数)
SSLOCAL="[\"[::0]\",\"0.0.0.0\"]"
#Shadowsocks的默认监听地址,默认为任何IPv6或IPv4地址
PORT="443"
#Shadowsocks使用的端口,建议使用443(HTTPS)
LOACL="127.0.0.1"
#本地监听地址!
LOCALPORT="1080"
#本地监听端口!
PASSWORD=""
#加密使用的密码,留空将会自动生成,切忌简单密码
TIMEOUT="600"
#未使用的连接超时自动断开,单位(s)
METHOD="chacha20-ietf-poly1305"
#加密方式,详见加密*
OBFS="tls"
#混淆方式,详见混淆*
OBFSHOST="github.com"
#混淆域名,详见混淆*
WORKERS="1024"
#服务使用的线程数,更高的线程数可以提高加解密速度
FWS="enable"
#伪装成网站服务器,避免被检测
ABB="enable"
#利用fail2ban自动Ban掉向服务器发送恶意数据的IP
BBR="enable"
#是否安装Google-BBR加速,详见优化❹-②*
若是在使用默认的配置安装完毕后,则可以对安装后的配置文件进行编辑,编辑命令如下
nano /etc/shadowsocks-libev/config.json
#运行以上命令,对""内的参数进行编辑
其中大部分参数与twish.sh中的自定义参数含义相同,详见Shadowsocks-libev Wiki,完成编辑后需重启Shadowsocks-libev应用配置,命令如下
/etc/init.d/shadowsocks restart
#运行以上命令重启通过Twist搭建的Shadowsocks-libev服务端
*加密,推荐使用AEAD加密,以下是四种AEAD加密方式
aes-128-gcm
aes-192-gcm
aes-256-gcm
chacha20-ietf-poly1305
以及几种常用的OTA加密方式(OTA加密一定程度上可以加快加密速度并降低CPU使用率,但较前者安全性更低且有明显缺陷)
rc4-md5
aes-128-cfb
aes-128-ctr
*混淆方式,主要分为tls,http两种,相比httptls更具优势,但支持Shadowsocks-libev的tls混淆客户端较少(比如Surge用户只能使用http混淆)
*混淆域名,使用混淆时伪装的域名,一般选择大型企业,流量出入较大、CDN等未被墙的域名作为混淆域名(如伪装的特定端口下的IP或域名来免流),常用的混淆域名有这些
cloudfront.com
cloudflare.com
itunes.apple.com
www.icloud.com
ajax.microsoft.com
apps.bdimg.com

优化*(使用Twist脚本搭建不需要进行①-步,已自动完成优化;主要面向ShadowsocksR和其它Shadowsocks版本的用户)

TCP Fast Open

主要通过第一次TCP握手后服务器产生Cookie作为后续TCP连接的认证信息,客户端通过TCP再次连接到服务器时,可以在SYN报文携带数据(RFC793),降低了握手频率,可避免恶意攻击并大幅降低网络延迟(参考);下面介绍如何开启这一功能
echo "net.ipv4.tcp_fastopen = 3" >> /etc/sysctl.conf
#运行以上命令,设置IPv4下的TFO默认为开启状态
sysctl -e -p
#运行以上命令,应用配置

②改善TCP拥塞算法

HTTP协议在传输层使用TCP协议,TCP丢包重传机制算法的不同会大幅影响科学上网速度;更换TCP拥塞算法需要使用命令nano /etc/sysctl.conf编辑系统配置文件,并定位到 net.ipv4.tcp_congestion_control = 这一行(若没有请手动添加),其后接的算法主要有cubic,hybla,bbr等,修改完成后使用命令sysctl -e -p应用配置;下面是相关算法的简单介绍

cubic  #由bic算法衍化而来,适用于低丢包率网络
hybla  #卫星链路使用的算法,适用于高延迟,高丢包率的网络
bbr    #由Google开源的算法,适用于低延迟,较低丢包率的网络(需要手动配置*)
*配置Google BBR
开始配置BBR之前,确保你的内核版本>4.8.x(使用命令uname -a查看),若低于最低版本,请先更新你的内核(Ubuntu);若要更新内核,请先使用命令nano updatekernel.sh新建脚本,将下面的代码复制粘贴到脚本内并保存
KERNELVER="$(wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/ | awk -F'\"v' '/v[4-9]./{print $2}' | cut -d/ -f1 | grep -v -  | sort -V | tail -1)"
#获取最新的Linux Kernel版本
SYSTYPE="$(dpkg --print-architecture)"
#获取系统平台信息"$SYSTYPE" = "amd64" ] && KERNEL="$(wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v${KERNELVER}/ | grep "linux-image" | grep "generic" | awk -F'\">' '/amd64.deb/{print $2}' | cut -d'<' -f1 | head -1)""$SYSTYPE" = "i386" ] && KERNEL="$(wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v${KERNELVER}/ | grep "linux-image" | grep "generic" | awk -F'\">' '/i386.deb/{print $2}' | cut -d'<' -f1 | head -1)""$SYSTYPE" = "armhf" ] && KERNEL="$(wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v${KERNELVER}/ | grep "linux-image" | grep "generic" | awk -F'\">' '/armhf.deb/{print $2}' | cut -d'<' -f1 | head -1)""$SYSTYPE" = "arm64" ] && KERNEL="$(wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v${KERNELVER}/ | grep "linux-image" | grep "generic" | awk -F'\">' '/arm64.deb/{print $2}' | cut -d'<' -f1 | head -1)""$SYSTYPE" = "ppc64el" ] && KERNEL="$(wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v${KERNELVER}/ | grep "linux-image" | grep "generic" | awk -F'\">' '/ppc64el.deb/{print $2}' | cut -d'<' -f1 | head -1)""$SYSTYPE" = "s390x" ] && KERNEL="$(wget -qO- http://kernel.ubuntu.com/~kernel-ppa/mainline/v${KERNELVER}/ | grep "linux-image" | grep "generic" | awk -F'\">' '/s390x.deb/{print $2}' | cut -d'<' -f1 | head -1)"
#获取对应平台Kernel包的文件名
wget -t 3 -T 30 -nv -O "$KERNEL" "http://kernel.ubuntu.com/~kernel-ppa/mainline/v${KERNELVER}/${KERNEL}"
#下载对应的Kernel
dpkg -i $KERNEL
#安装下载好的Kernel
rm -f $KERNEL
#清理下载文件
update-grub
#更新启动菜单
然后使用命令chmod -x updatekernel.sh && bash updatekernel.sh给予脚本运行权限并运行脚本来更新内核
若无需更新内核,则先将拥塞控制算法填写为bbr,再添加以下代码保存并使用命令sysctl -e -p应用
net.core.default_qdisc = fq
#将网络拥塞队列算法设置为性能和延迟最佳的fq_codel

③内核优化

使用命令nano sysctl.conf编辑并在末尾加入如下代码,对系统进程及内存分配进行优化,保存并使用命令sysctl -e -p应用
fs.file-max = 1024000
#系统所有进程一共可以打开的句柄数(bytes)
kernel.msgmnb = 65536
#进程通讯消息队列的最大字节数(bytes)
kernel.msgmax = 65536
#进程通讯消息队列单条数据最大的长度(bytes)
kernel.shmmax = 68719476736
#内核允许的最大共享内存大小(bytes)
kernel.shmall = 4294967296
#任意时间内系统可以使用的共享内存总量(bytes)
使用命令nano /etc/security/limits.conf编辑和写入如下代码,限制用户档案的体积大小,提高系统稳定性,完成后保存
*                soft    nofile           512000
#用户档案警告体积大小(bytes)
*                hard    nofile          1024000
#用户档案最大体积大小(bytes)

④TCP的各种优化

涉及内核控制,TCP包大小,TCP转发,连接超时等优化,代码的简单释义已在其下方注明;使用命令nano sysctl.conf编辑并写入如下代码,保存并使用命令sysctl -e -p应用
net.core.rmem_max = 12582912
#设置内核接收Socket的最大长度(bytes)
net.core.wmem_max = 12582912
#设置内核发送Socket的最大长度(bytes)
net.ipv4.tcp_rmem = 10240 87380 12582912
#设置TCP Socket接收长度的最小值,预留值,最大值(bytes)
net.ipv4.tcp_rmem = 10240 87380 12582912
#设置TCP Socket发送长度的最小值,预留值,最大值(bytes)
net.ipv4.ip_forward = 1
#开启所有网络设备的IPv4流量转发,用于支持IPv4的正常访问
net.ipv4.tcp_syncookies = 1
#开启SYN Cookie,用于防范SYN队列溢出后可能收到的攻击
net.ipv4.tcp_tw_reuse = 1
#允许将等待中的Socket重新用于新的TCP连接,提高TCP性能
net.ipv4.tcp_tw_recycle = 0
#禁止将等待中的Socket快速回收,提高TCP的稳定性
net.ipv4.tcp_fin_timeout = 30
#设置客户端断开Sockets连接后TCP在FIN等待状态的实际(s),保证性能
net.ipv4.tcp_keepalive_time = 1200
#设置TCP发送keepalive数据包的频率,影响TCP链接保留时间(s),保证性能
net.ipv4.tcp_mtu_probing = 1
#开启TCP层的MTU主动探测,提高网络速度
net.ipv4.conf.all.accept_source_route = 1
net.ipv4.conf.default.accept_source_route = 1
#允许接收IPv4环境下带有路由信息的数据包,保证安全性
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
#拒绝接收来自IPv4的ICMP重定向消息,保证安全性
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.lo.send_redirects = 0
#禁止发送在IPv4下的ICMP重定向消息,保证安全性
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.lo.rp_filter = 0
#关闭反向路径回溯进行源地址验证(RFC1812),提高性能
net.ipv4.icmp_echo_ignore_broadcasts = 1
#忽略所有ICMP ECHO请求的广播,保证安全性
net.ipv4.icmp_ignore_bogus_error_responses = 1
#忽略违背RFC1122标准的伪造广播帧,保证安全性
net.ipv6.conf.all.accept_source_route = 1
net.ipv6.conf.default.accept_source_route = 1
#允许接收IPv6环境下带有路由信息的数据包,保证安全性
net.ipv6.conf.all.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
#禁止接收来自IPv6下的ICMPv6重定向消息,保证安全性
net.ipv6.conf.all.autoconf = 1
#开启自动设定本地连接地址,用于支持IPv6地址的正常分配
net.ipv6.conf.all.forwarding = 1
#开启所有网络设备的IPv6流量转发,用于支持IPv6的正常访问

⑤使用m2crypto加速加解密(Python服务端)

apt-get install build-essential python3-dev python-dev python-pip libssl-dev swig
#运行以上命令,安装支持库
pip install m2crypto
#运行以上命令,安装m2crypto

⑥使用Kcptun加速(会影响TCP Fast Open的正常工作,请自行取舍)

echo "$(dpkg --print-architecture)"
#运行以上命令,查看Linux硬件版本
这里获取最新的预编译版本Kcptun(Go)下载地址(注意选择相应的Linux系统版本)
wget [获取的下载地址]
#运行以上命令,下载预编译版本Kcptun
tar -zxvf [下载后的文件名]
#运行以上命令,解压预编译文件
./[解压后的文件名] -t "[服务器目标IPv4]:[Kcptun目标端口]" -l ":[Kcptun监听端口]"
#运行以上命令启动Kcptun,具体配置请参考官方README*
*kcptun/README

❺安全*(使用Twist脚本搭建不需要进行配置,已自动完成配置;主要面向ShadowsocksR和其它Shadowsocks版本的用户)

①Web Server的伪装(使用TCP80或TCP443为端口的Shadowsocks服务器效果更佳)

可以使用Apache来构建一个网站服务器,用于隐藏Shadowsocks服务器的特征,防止Shadowsocks服务器被运营商或防火墙的主动探测发现;使用以下命令配置Apache服务器
apt-get -y install apache2
#运行以上命令,安装Apache服务service apache2 start
#运行以上命令,启动Apache服务*
*若在TCP80端口开放或Shadowsocks已经连接的状况下在浏览器中输入服务器的IP并访问,出现It’s works!即为成功配置Apache Server;关于安全性加强,请参考②封禁恶意访问IP*

②封禁恶意访问IP

⒈使用fail2ban来阻止恶意的SSH和Apache Web Server攻击者,主要是解决潜在的用户攻击者(那些有权限连接到你的Shadowsocks的人,因此配置Firewall并不是完全有用的);首先使用以下命令安装fail2ban
apt-get -y install fail2ban
#运行以上命令,安装fail2ban
使用命令nano /etc/fail2ban/jail.local按情况添加以下部分代码并保存来配置fail2ban规则,首先是SSH规则代码
[ssh-iptables]
enabled = true
filter     = sshd
action   = iptables[name=SSH, port=ssh, protocol=tcp]
logpath = /var/log/secure
*若开启了Apache Web Server伪装,还须添加如下代码保证Web Server的安全
[apache-tcpwrapper]
enabled = true
filter     = apache-auth
action   = hostdeny
logpath = /var/log/httpd/error_log

[apache-badbots]
enabled = true
filter     = apache-badbots
action   = iptables-multiport[name=BadBots, pory="http,https"]
logpath = /var/log/httpd/access_log

[apache-shorewall]
enabled = true
filter     = apache-noscript
action   = shorewall
logpath = /var/log/httpd/error_log
⒉使用Shadowsocks或ShadowsocksR自带的autoban.py来禁止恶意的Shadowsocks攻击(仅限Python服务端,开始前请确保你拥有Python环境);首先找到你的Shadowsocks(R)安装路径,请使用lstree或其它方式找到其安装路径,并按照如下步骤安装Supervisor并自动运行autoban.py
apt-get -y install supervisor
#安装Supervisor任务管理,用于后台运行autoban.py
使用命令nano /etc/supervisor/conf.d/autoban.conf创建supervisor配置文件,输入如下代码并保存
[program:autoban]
command=python autoban.py < /var/log/shadowsocks.log
directory=[Shadowsocks(R)安装路径]/utils
autorestart=true
user=root
使用如下命令启动Supervisor及autoban(关于autoban.py的更多信息请参考这里)
service supervisor start
#运行以上命令,启动Supervisor服务
supervisorctl reload
#运行以上命令,重加载autoban计划

❻疑难解答

若在安装或优化过程中遇到问题,请先根据提示使用搜索引擎查找;若寻觅无果,可在开源项目的issues中寻找,所使用的开源项目有:Shadowsocks-libevsimple-obfsmbedtlslibsodiumTwist等…也可以在评论中讨论,在下为一只高三的学生狗,不一定有能力或有时间为大家解答,请理解下面则针对一些常见问题进行说明

Q1.如何确定我是否成功更新了内核?

运行命令dpkg -l | grep linux-image显示当前已经安装的内核

Q2.如何确定是否成功开启了BBR加速?

运行命令lsmod | grep bbr后若显示内容中有tcp_bbr则为开启成功

Q3.使用ping6 google.com返回network is unreachable怎么解决?

首先确定你的实例至少拥有一个v6的PubilcIP,再执行以下步骤
ip link
#运行以上命令,查看当前活动的网络设备
echo "net.ipv6.conf.all.forwarding = 1" >> /etc/sysctl.conf
#运行以上命令,开启全部IPv6转发
echo "net.ipv6.conf.[附着有PublicIP的网络设备名称*].accept_ra = 2" >> /etc/sysctl.conf
#运行以上命令,开启附着有PublicIP的网络设备的IPv6路由广播
sysctl -e -p
#运行以上命令应用配置
*附着有PublicIP的网络设备名称一般为eth0,eth+,ens3,ens+,

Q4.使用AWS EC2如何向实例附着一个IPv6地址?

请参照AWS的官方文档设置VPC(须有一定的英语基础)

Q5.使用fail2ban或autoban.py不小心Ban了自己怎么办?

首先SSH连接到你的服务器(如果SSH被Ban的话需要更换一个没被Ban的IP),然后使用以下命令移除被Ban的IP
iptables -L
#运行以上命令,显示所有的iptables规则,并找到你要解Ban的chain-name和IP
iptables -D [被BanIP的chain-name] [被Ban的IP] -j REJECT
#手动补充运行以上命令,解除屏蔽

Q6.我如何确认Supervisor的autoban.py任务已经成功运行?


运行命令supervisorctl tail -f autoban stderr查看Supervisor的日志,若无报错即为成功运行

Q7.Shadowsocks有哪些进阶使用?(请合法使用)

1.使用ss-panelshadowsocks-manager进行Web管理界面配置并接入支付宝商家API可以实现提供付费服务从用户获利
2.使用obfs来通过将自己的网络流量伪装成一些特殊域名或IP的请求以绕开运营商或防火墙的监视及封锁(原版Shadowsocks及其libev分支可能需要自行配置simple-obfs)
3.使用HAproxy转发Shadowsocks服务器流量以隐藏主服务器的真实IP
4.使用ShadowDNS将Shadowsocks服务器用于转发DNS解析

Q8.我如何安装其它版本的Shadowsocks?

使用Github寻找搭建脚本(如Teddysun写的全版本搭建脚本),按照README或Wiki自行搭建

Q9.使用Twist脚本配置的服务端如何更新或卸载?

bash twist.sh update
#在twist.sh所在目录运行这条命令获取更新
bash twist.sh uninstall
#在twist.sh所在目录运行这条命令卸载服务

  • 客户端的选择

以下主要介绍各个平台的GUI Based客户端,仅供参考(Simple-Obfs为Shadowsocks-libev的混淆标准,不支持Simple-Obfs并不意味着不支持ShadowsocksR的Obfs-Plugin混淆标准;此处评价从Shadowsocks-libev的角度出发,请勿误解)

MacOS

ShadowsocksX-NG

免费且功能强大的客户端,支持AEAD,Kcptun,UDP,不支持任何混淆或TCP Fast Open,稳定性一般

Surge

价格昂贵的网络调试工具,支持AEAD,TCP Fast Open,同时仅支持Simple-Obfs的http混淆,稳定性极佳

Windows

Shadowsocks-windows

免费易用的官方客户端,支持AEAD,UDP,TCP Fast Open还在测试中,但不支持Simple-Obfs,稳定性极佳.

 

Shadowsocks-qt5

免费易用的跨平台客户端,但目前不支持AEAD,TCP Fast Open和Simple-Obfs,稳定性一般

 

Linux

Shadowsocks-qt5

免费易用的跨平台客户端,但目前不支持AEAD,TCP Fast Open和Simple-Obfs,稳定性一般

 

Avege

免费易用的跨平台客户端,主要适配ShadowsocksR(与Shadowsocks-libev兼容),不支持AEAD,TCP Fast Open和Simple-Obfs,稳定性一般

iOS


A.BIG.T

iOS
相关文章
十分强大的付费客户端,支持AEAD,Kcptun,Domain TLS,Obfs-Plugin,可自定义规则,稳定性一般

Potatso 2

iOS
相关文章
下载
方便易用的付费客户端,支持AEAD,Obfs-Plugin,可自定义规则,稳定性一般(官方Manual)

Surge

Mac
相关文章
下载
昂贵的网络调试工具,支持AEAD,TCP Fast Open,Simple-Obfs,可自定义规则,稳定性极佳(官方Manual)

Wingy - Http(s) Socks5 Proxy ...

iOS
相关文章
下载
使用十分简单免费的网络调试工具,支持AEAD,Obfs-Plugin可自定义规则,稳定性极佳

Android

相关文章
下载
强大的官方客户端,支持AEAD,TCP Fast Open,Obfs,Kcptun,稳定性一般

OpenWRT

OpenWRT-Shadowsocks(Windows Mobile,ChromeOS的科学上网方式)

开源的官方客户端,支持AEAD,TCP Fast Open,Simple-Obfs,UDP;配合ChinaDNSluci-app-shadowsocks(GUI)使用(官方Wiki),稳定性一般。其中ChinaDNS,luci-app-shadowsocks一般可直接在路由器管理界面>软件(Software)中安装,后者依赖两个包iptables 和 ipset;若有Shadowsocks-libev缺失情况,可参照命令安装*
*命令安装
这里获取最新预编译.ipk的地址,使用Telnet或SSH连接到你的路由,使用以下命令进行安装
opkg install wget
#运行以上命令安装wget服务,用于下载.ipk到路由器
wget [获取的.ipk地址]
#运行以上命令下载.ipk到路由;下载前应注意路由器CPU型号,确保选择了正确的.ipk
dpkg -i [下载后的.ipk路径或名称]
#运行以上命令安装客户端.
 
from https://sspai.com/post/39828 
https://github.com/Unbinilium/Twist

相关帖子:
http://briteming.blogspot.com/2015/01/shadowsocksshadowsocksyoutubessh-tunnel.html
http://briteming.blogspot.com/2013/05/shadowsocks-libev.html
https://briteming.blogspot.com/2015/05/linux-vps.html

No comments:

Post a Comment