Open cji03 opened 7 years ago
## ❹优化(使用Twist脚本搭建不需要进行①-④步,已自动完成优化;主要面向ShadowsocksR和其它Shadowsocks版本的用户)
主要通过第一次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.somaxconn = 4096
#设置系统每一个端口的最大监听队列长度
net.core.rmem_max = 12582912
#设置内核接收Socket的最大长度(bytes)
net.core.wmem_max = 12582912
#设置内核发送Socket的最大长度(bytes)
net.core.rmem_default = 65536
#设置内核接收Socket的默认长度(bytes)
net.core.wmem_default = 65536
#设置内核发送Socket的默认长度(bytes)
net.core.netdev_max_backlog = 4096
#设置接收包设备队列最多设备数
net.ipv4.tcp_rmem = 10240 87380 12582912
#设置TCP Socket接收长度的最小值,预留值,最大值(bytes)
net.ipv4.tcp_rmem = 10240 87380 12582912
#设置TCP Socket发送长度的最小值,预留值,最大值(bytes)
net.ipv4.tcp_max_syn_backlog = 4096
#设置接收SYN包设备队列最多设备数
net.ipv4.tcp_max_tw_buckets = 5000
#设置TCP保持在TIME等待状态的最大设备数量
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
#接收IPv4环境下带有路由信息的数据包,保证安全性
net.ipv4.conf.all.accept_redirects = 0
#拒绝接收来自IPv4的ICMP重定向消息,保证安全性
net.ipv4.conf.all.send_redirects = 0
#禁止发送在IPv4下的ICMP重定向消息,保证安全性
net.ipv4.conf.all.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
#接收IPv6环境下带有路由信息的数据包,保证安全性
net.ipv6.conf.all.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*
## ❺安全(使用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-libev,simple-obfs,mbedtls,libsodium,Twist等…
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-panel或shadowsocks-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所在目录运行这条命令卸载服务
## MacOS
免费且功能强大的客户端,支持AEAD,Kcptun,UDP,不支持任何混淆或TCP Fast Open,稳定性一般
价格昂贵的网络调试工具,支持AEAD,TCP Fast Open,同时仅支持Simple-Obfs的http混淆,稳定性极佳
## Windows
免费易用的官方客户端,支持AEAD,UDP,TCP Fast Open还在测试中,但不支持Simple-Obfs,稳定性极佳
免费易用的跨平台客户端,但目前不支持AEAD,TCP Fast Open和Simple-Obfs,稳定性一般
## Linux
免费易用的跨平台客户端,但目前不支持AEAD,TCP Fast Open和Simple-Obfs,稳定性一般
免费易用的跨平台客户端,主要适配ShadowsocksR(与Shadowsocks-libev兼容),不支持AEAD,TCP Fast Open和Simple-Obfs,稳定性一般
## iOS
A.BIG.T 下载
十分强大的付费客户端,支持AEAD,Kcptun,Domain TLS,Obfs-Plugin,可自定义规则,稳定性一般
Potatso 2 下载
方便易用的付费客户端,支持AEAD,Obfs-Plugin,可自定义规则,稳定性一般(官方Manual)
Surge Mac 下载
昂贵的网络调试工具,支持AEAD,TCP Fast Open,Simple-Obfs,可自定义规则,稳定性极佳(官方Manual)
Wingy - Http(s) Socks5 Proxy ... 下载
使用十分简单免费的网络调试工具,支持AEAD,Obfs-Plugin可自定义规则,稳定性极佳
## Android
Shadowsocks 下载
强大的官方客户端,支持AEAD,TCP Fast Open,Obfs,Kcptun,稳定性一般
OpenWRT
OpenWRT-Shadowsocks(Windows Mobile,ChromeOS的科学上网方式)
开源的官方客户端,支持AEAD,TCP Fast Open,Simple-Obfs,UDP;配合ChinaDNS和luci-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路径或名称]
#运行以上命令安装客户端
VPS服务商的选择
VPS服务商的选择将直接影响你的科学上网体验,下面提供一些参考建议,提供商均安全可靠且有一定知名度;在获得一个VPS实例之前,你可能需要先注册好相关账号并准备一张具有国际支付功能的信用卡(Visa,MasterCard…)
Google Cloud Computing Engine(推荐) 需要一个Google账号,初次注册可以获得300$有效期为一年的使用卷,最低配置使用一年几乎免费;建议选择Asia机房(IP Location:Mountain View),速度和稳定性极佳,但不支持IPv6(不使用负载均衡的情况下)
AWS EC2(推荐) 需要一个Amazon账号,初次注册可以获得一年的Free Trial权限,出入站流量各15GB/月;建议选择Tokyo机房(IP Location:Tokyo),稳定性极佳,速度尚可,支持IPv6(需设置VPC)
Vultr(推荐) 账号注册简易(可以使用PayPal,无需信用卡),初次注册仅送50GB Block Storage,但费用廉价;建议选择5$套餐,包括1TB Bandwidth每月,建议选择Tokyo机房(IP Location:Tokyo),速度一般,稳定性尚可,支持IPv6
Linode 账号注册简易,初次注册无优惠,费用廉价,建议选择5$套餐,包括1TB Bandwidth每月,建议选择Tokyo机房(IP Location:Tokyo),速度极佳,稳定性较差(由于IP极易被Ban),支持IPv6
Lightsail 需要一个Amazon账号,由AWS推出,初次注册无优惠,费用廉价配置一般,建议选择5$套餐,包括500GB Bandwidth每月,建议选择Tokyo机房(IP Location:Tokyo),速度一般,稳定性极佳,不支持IPv6
Digital Ocean 账号注册简易,初次注册无优惠,费用廉价,建议选择5$套餐,包括1TB Bandwidth每月,建议选择Singapore机房(IP Location:Singapore),速度一般,稳定性极佳,支持IPv6
Azure 需要一个Microsoft帐户,初次注册可获得300$有效期为三个月的试用卷;长期使用价格昂贵,建议选择Japan East/West机房(IP Location:Japan),速度和稳定性极佳,支持IPv6
科学上网服务端搭建
## ❶建立实例 在确定好你所选择的服务商后,你需要建立一个用于提供科学上网服务的实例。建立实例时尽量按照自己的需求来选择实例配置,一般情况下共享的1vCPU和1GB内存就足够了;另外需要注意一下几点,以确保你能够正常连接并使用你的实例
①实例的出入站规则(Firewall)
入站规则:
出站规则:
*此处的Anywhere通常会显示为0.0.0.0/0;::/0
②实例的系统类型
使用Linux;如Ubuntu,Debian…建议使用Ubuntu 15.x-17.x,较新的发行版系统可以获得更多的特性支持及更好的安全性
③实例的网络设置,IP及连接方式
为了实例的安全性,建议开启实例的Private Network(如果有);确定实例至少拥有一个Public IPv4地址,并开启IPv6支持(若有需要);连接到实例需要使用SSH,应查看实例的IP和用户名,密码或密钥(需要下载),并将其妥善保管
## ❷连接到实例
①MacOS&Linux
使用自带的Terminal进行连接
②Windows
使用PuTTY进行连接,若是.pem为后缀的密钥验证,需用PuTTYgen转换为.ppk为后缀的密钥才可以连接,详见AWS提供的文档
③iOS&Android
使用SSH第三方客户端进行登录,如Prompt2,Termius(支持多平台且免费)等 Prompt 2 iPhone 下载 Termius - SSH Shell / Console 下载
## ❸搭建Shadowsocks-libev服务器
Q1.为什么使用Shadowsocks协议?
相比传统的VPN(IKE,IPSec,PPTP…),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权限运行命令
②开始搭建Shadowsocks-libev服务端
可以选择使用笔者的自动脚本(Twist)进行搭建或自行搭建(可参考❻疑难解答的Q8回答*),这里主要介绍如何使用前者科学上网
**③自定义Shadowsocks-libev服务端***
若在安装之前,可以先直接编辑下载后的twist.sh后再安装,编辑命令如下
在编辑界面定位到function shadowsocksconfig(){以下至}前的内容,编辑""内的参数,下面是关于参数的简单介绍(说明中未标出及说明后面带有"!"号的是不建议修改的参数)
若是在使用默认的配置安装完毕后,则可以对安装后的配置文件进行编辑,编辑命令如下
其中大部分参数与twish.sh中的自定义参数含义相同,详见Shadowsocks-libev Wiki,完成编辑后需重启Shadowsocks-libev应用配置,命令如下
*加密,推荐使用AEAD加密,以下是四种AEAD加密方式
以及几种常用的OTA加密方式(OTA加密一定程度上可以加快加密速度并降低CPU使用率,但较前者安全性更低且有明显缺陷)
混淆方式,主要分为tls,http两种,相比http,tls更具优势,但支持Shadowsocks-libev的tls混淆客户端较少(比如Surge用户只能使用http混淆) 混淆域名,使用混淆时伪装的域名,一般选择大型企业,流量出入较大、CDN等未被墙的域名作为混淆域名(如伪装的特定端口下的IP或域名来免流),常用的混淆域名有这些