翻墙小结
随着我国相关法律条款的日益完善,本自乱象丛生的 VPN 市场如今已渐渐被控制,使用传统协议 (IKE、IPSec、PPTP …) 的科学上网方式也变得更加困难;加上第三方服务商的不透明性,不稳定性,使得第三方科学上网的安全性 (如 MITM …),速度体验让人堪忧…
故本文将详细介绍如何创造一个安全快速的个人科学上网服务环境;涉及服务端的选择,搭建、优化、安全性加强和客户端的选择,以达到更好的科学上网体验;适合有一定知识的 Linux 用户和善于使用搜索引擎的小白阅读…
(仅供参考,请在法律范围内使用该教程,如有违反法律规定,作者概不负责)
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),速度一般,稳定性尚可,支持 IPv6Linode
账号注册简易,初次注册无优惠,费用廉价,建议选择5$套餐,包括 1TB Bandwidth/月,建议选择 Tokyo 机房 (IP Location:Tokyo),速度极佳,稳定性一般 (由于曾经某些人的滥用,导致 IP 极易被 Ban),支持 IPv6Lightsail
需要一个 Amazon 账号,由 AWS 推出,初次注册无优惠,费用廉价配置一般,建议选择5$套餐,包括 500GB Bandwidth/月,建议选择 Tokyo 机房 (IP Location:Tokyo),速度一般,稳定性极佳,不支持 IPv6Digital Ocean
账号注册简易,初次注册无优惠,费用廉价,建议选择5$套餐,包括 1TB Bandwidth/月,建议选择 Singapore 机房 (IP Location:Singapore),速度一般,稳定性极佳,支持 IPv6Azure
需要一个 Microsoft 帐户,初次注册可获得300$有效期为三个月的试用卷;长期使用价格昂贵,建议选择 Japan East/West 机房 (IP Location:Japan),速度和稳定性极佳,支持 IPv6
*云服务平台的质量随时都在变化,以上仅供参考
科学上网服务端搭建
搭建 Shadowsocks-libev 服务器
Q1.为什么使用 Shadowsocks 协议?
相比传统的 VPN (IKE、IPSec、PPTP …),Shadowsocks 协议具有更好的灵活性和隐蔽性,且搭建相对简单,因此可以拥有相对传统 VPN 更快的速度和更高的稳定性;另对比 V2Ray 这种科学上网的集合体,Shadowsocks 在服务端更加轻量,单一协议完善程度更高;在移动端有更丰富的客户端选择,兼容性和灵活性更优。关于 Shadowsocks 的协议特点,原理及弱点的更多讨论,可以在这里稍做了解,本文不对此长篇大论
Q2.为什么使用 Shadowsock-libev 服务端?
相比原版 Shadowsocks (Python),libev (C#) 版本提供了更多的特性支持;而关于ShadowsocksR (Python),Shadowsocks-libev 率先支持 AEAD 加密,并向 ShadowsocksR 学习引进了 Obfs (Simple-Obfs,但与前者原理有所不同),且提供稳定的周期性更新;关于未来,ShadowsocksR 更倾向于 none 加密策略,而 Shadowsocks-libev 则倾向于传统的加密策略,两者有不同的侧重点 (ShadowsocksR 更侧重消除特征以避免被检测识别,而 Shadowsocks-libev 则追求更高的安全性),综合起来并无优劣之分
*2017年7月28日,ShadowsocksR团队正式解散
以 root 权限运行命令
初次连接到实例,一般需要获取 root 权限 (非 root 用户的情况下),获取方法如下
1
2
3
4sudo passwd root
# 运行以上命令,重设 root 用户密码
su
# 运行以上命令,使用重设后的 root 密码登录开始搭建 Shadowsocks-libev 服务端
自定义 Shadowsocks-libev 服务端*
在使用默认的配置安装完毕后,对安装后的配置文件进行编辑,编辑命令如下
1
2vim /etc/shadowsocks-libev/config.json
# 运行以上命令,对其安装后的运行参数进行编辑自定义(语法为 json 标准格式)参数如下,详见 [Shadowsocks-libev Wiki]( Shadowsocks-libev Wiki “Shadowsocks-libev Wiki”)
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
28SSLOCAL="[\"[::0]\",\"0.0.0.0\"]"
# Shadowsocks 的默认监听地址,默认为任何 IPv6 或 IPv4 地址
PORT="443"
# Shadowsocks 使用的端口,建议使用 443 (HTTPS)
LOACL="127.0.0.1"
# 本地监听地址!
LOCALPORT="1080"
# 本地监听端口!
PASSWORD=""
# 加密使用的密码,留空将会自动生成,切忌简单密码
DNS="8.8.8.8"
# 默认使用 Google Public DNS 服务器
TIMEOUT="600"
# 未使用的连接超时自动断开,单位 (s)
METHOD="chacha20-ietf-poly1305"
# 加密方式,详见加密*
OBFS="tls"
# 混淆方式,详见混淆*
OBFSHOST="mzstatic.com"
# 混淆域名,详见混淆*
WORKERS="1024"
# 服务使用的线程数,更高的线程数可以提高加解密速度
FWS="enable"
# 伪装成网站服务器,避免被检测
ABB="enable"
# 利用 fail2ban 自动 Ban 掉向服务器发送恶意数据的 IP
BBR="enable"
# 安装 Google-BBR 加速完成编辑后需重启 Shadowsocks-libev 应用配置,命令如下
1
2/etc/init.d/shadowsocks restart
# 运行以上命令重启通过 Shadowsocks-libev 服务端*加密,推荐使用 AEAD 加密,以下是四种 AEAD 加密方式
1
2
3
4aes-128-gcm
aes-192-gcm
aes-256-gcm
chacha20-ietf-poly1305以及几种常用的 OTA 加密方式 (OTA 加密一定程度上可以加快加密速度并降低 CPU 使用率,但较前者安全性更低且有明显缺陷)
1
2
3rc4-md5
aes-128-cfb
aes-128-ctr*混淆方式,主要分为
tls
、http
两种,相比 http,tls 更具优势,但支持 Shadowsocks-libev 的 tls 混淆客户端较少*混淆域名,使用混淆时伪装的域名,一般选择大型企业、流量出入较大、CDN 等未被墙的域名作为混淆域名 (如伪装的特定端口下的 IP 或域名来免流),常用的混淆域名有这些
1
2
3
4
5
6
7cloudfront.com
cloudflare.com
itunes.apple.com
www.icloud.com
s.mzstatic.com
ajax.microsoft.com
apps.bdimg.com
优化
-
主要通过第一次 TCP 握手后服务器产生 Cookie 作为后续 TCP 连接的认证信息,客户端通过 TCP 再次连接到服务器时,可以在 SYN 报文携带数据 (RFC793),降低了握手频率,可避免恶意攻击并大幅降低网络延迟 (参考)。下面介绍如何开启这一功能
1
2
3
4echo "net.ipv4.tcp_fastopen = 3" >> /etc/sysctl.conf
# 运行以上命令,设置 IPv4 下的 TFO 默认为开启状态
sysctl -e -p
# 运行以上命令,应用配置 改善 TCP 拥塞算法
HTTP 协议在传输层使用 TCP 协议,TCP 丢包重传机制算法的不同会大幅影响科学上网速度;更换 TCP 拥塞算法需要使用命令
vim /etc/sysctl.conf
编辑系统配置文件,并定位到net.ipv4.tcp_congestion_control =
这一行 (若没有请手动添加),其后接的算法主要有cubic
、hybla
、bbr
等,修改完成后使用命令sysctl -e -p
应用配置;下面是相关算法的简单介绍1
2
3cubic # 由 bic 算法衍化而来,适用于低丢包率网络
hybla # 卫星链路使用的算法,适用于高延迟,高丢包率的网络
bbr # 由 Google 开源的算法,适用于低延迟,较低丢包率的网络 (需要手动配置*)*配置 Google BBR
开始配置 BBR 之前,确保你的内核版本 > 4.8.x (使用命令
uname -a
查看),若低于最低版本,请先更新你的内核 (Ubuntu);若要更新内核,请先使用命令vim updatekernel.sh
新建脚本,将下面的代码复制粘贴到脚本内并保存1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19KERNELVER="$(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
应用1
2net.core.default_qdisc = fq
# 将网络拥塞队列算法设置为性能和延迟最佳的 fq_codel内核优化
使用命令
vim sysctl.conf
编辑并在末尾加入如下代码,对系统进程及内存分配进行优化,保存并使用命令sysctl -e -p
应用1
2
3
4
5
6
7
8
9
10fs.file-max = 1024000
# 系统所有进程一共可以打开的句柄数 (bytes)
kernel.msgmnb = 65536
# 进程通讯消息队列的最大字节数 (bytes)
kernel.msgmax = 65536
# 进程通讯消息队列单条数据最大的长度 (bytes)
kernel.shmmax = 68719476736
# 内核允许的最大共享内存大小 (bytes)
kernel.shmall = 4294967296
# 任意时间内系统可以使用的共享内存总量 (bytes)使用命令
vim /etc/security/limits.conf
编辑和写入如下代码,限制用户档案的体积大小,提高系统稳定性,完成后保存1
2
3
4* soft nofile 512000
# 用户档案警告体积大小 (bytes)
* hard nofile 1024000
# 用户档案最大体积大小 (bytes)TCP 的优化
涉及内核控制,TCP 包大小,TCP 转发,连接超时等优化,代码的简单释义已在其下方注明;使用命令
vim sysctl.conf
编辑并写入如下代码,保存并使用命令sysctl -e -p
应用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
39
40
41
42
43
44
45
46
47
48
49
50net.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_wmem = 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 服务端)
1
2
3
4apt-get install build-essential python3-dev python-dev python-pip libssl-dev swig
# 运行以上命令,安装支持库
pip install m2crypto
# 运行以上命令,安装 m2crypto使用 Kcptun 加速 (会影响 TCP Fast Open 的正常工作,请自行取舍)
1
2echo "$(dpkg --print-architecture)"
# 运行以上命令,查看 Linux 硬件版本在这里获取最新的预编译版本 Kcptun (Go) 下载地址 (注意选择相应的 Linux 系统版本)
1
2
3
4
5
6wget [获取的下载地址]
# 运行以上命令,下载预编译版本 Kcptun
tar -zxvf [下载后的文件名]
# 运行以上命令,解压预编译文件
./[解压后的文件名] -t "[服务器目标IPv4]:[Kcptun目标端口]" -l ":[Kcptun监听端口]"
# 运行以上命令启动 Kcptun,具体配置请参考官方 README**kcptun/README 官方文档
安全
Web Server 的伪装 (使用 TCP80 或TCP 443 为端口的 Shadowsocks 服务器效果更佳)
可以使用 Apache 来构建一个网站服务器,用于隐藏 Shadowsocks 服务器的特征,防止 Shadowsocks 服务器被运营商或防火墙的主动探测发现;使用以下命令配置 Apache 服务器
1
2
3
4apt-get -y install apache2
# 运行以上命令,安装 Apache 服务
service apache2 start
# 运行以上命令,启动 Apache 服务**若在 TCP80 端口开放或 Shadowsocks 已经连接的状况下在浏览器中输入服务器的 IP 并访问,出现
It’s works!
即为成功配置 Apache Server ;关于安全性加强,请参考②封禁恶意访问 IP*究其根本,使用较新的 AEAD 流加密更加有效,以上方法仅在某种层面具有一定的效果
封禁恶意访问 IP
使用 fail2ban 来阻止恶意的 SSH 和 Apache Web Server 攻击者,主要是解决潜在的用户攻击者 (比如那些有权限连接到你的 Shadowsocks 服务器的设备可能会绕开实例的外部防火墙,因此单纯配置 Firewall 并不是完全有用的);首先使用以下命令安装 fail2ban
1
2apt-get -y install fail2ban
# 运行以上命令,安装 fail2ban使用命令
vim /etc/fail2ban/jail.local
按情况添加以下部分代码并保存来配置 fail2ban 规则,首先是 SSH 规则代码1
2
3
4
5[ssh-iptables]
enabled = true
filter = sshd
action = iptables[name=SSH, port=ssh, protocol=tcp]
logpath = /var/log/auth.log*若开启了 Apache Web Server 伪装,还须添加如下代码保证 Web Server 的安全
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17[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) 安装路径,请使用命令
cd
进入目录和ls
显示目录下文件或其它方式找到其安装路径,并按照如下步骤安装 Supervisor (用于运行 Autoban)1
2apt-get -y install supervisor
# 安装 Supervisor 任务管理,用于后台运行 autoban.py使用命令
vim /etc/supervisor/conf.d/autoban.conf
创建 supervisor 配置文件,输入如下代码并保存1
2
3
4
5[program:autoban]
command=python autoban.py < /var/log/shadowsocks.log
directory=[Shadowsocks(R) 安装路径]/utils
autorestart=true
user=root使用如下命令启动 Supervisor 及 Autoban (关于 Autoban 的更多信息请参考这里)
1
2
3
4service supervisor start
# 运行以上命令,启动 Supervisor 服务
supervisorctl reload
# 运行以上命令,重加载 Autoban 计划
客户端的选择
以下主要介绍各个平台的 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 混淆 (tls 适配中),稳定性极佳
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
Shadowrocket
目前最强大的Shadowsocks (R) 付费客户端之一,支持 AEAD,ObfsPlugin,可自定义规则,稳定性一般Potatso 2
方便易用的付费客户端,支持 AEAD,Obfs-Plugin,UDP可自定义规则,稳定性一般Surge
昂贵的网络调试工具,支持 AEAD,TCP Fast Open,Simple-Obfs,MitM 可自定义规则,稳定性极佳
Android
- Shadowsocks
免费开源的官方客户端,支持 AEAD,TCP Fast Open,Simple-Obfs,Kcptun,UDP,TCP Fast Open (需要 root 权限),功能十分全面,但稳定性一般
OpenWRT
- OpenWRT-Shadowsocks
开源的官方客户端,支持 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 连接到你的路由,使用以下命令进行安装
1 | opkg install wget |
写在最后
引用一句 clowwindy 的话:
往往不需要政府造墙,网民也会自发造墙