shadowsocks/shadowsocks-libev
shadowsocks, 现代科学上网的里程碑式产品,早已经停止更新,github上的原项目已经删除。其后继者为shadowsocks-libev,有多个平台上的版本,目前主流的平台都有其客户端。
CentOS可使用的yum源 https://copr.fedorainfracloud.org/coprs/librehat/shadowsocks/
kcptun
kcptun是一个把TCP流“装”到UDP里并无脑重发以达到加速效果的方案,也就是以带宽换响应速度。到项目release页下载适合的版本,解压缩,把其中的服务端文件server_linux_amd64 复制为 /usr/local/bin/kcptun-server ,写个一行开机启动脚本到/etc/rc.local 里,注意其中的 –key 参数的密码设置。更多参数参考项目页上的说明。
/usr/local/bin/kcptun-server -t 127.0.0.1:12312 -l 0.0.0.0:12321 –mode fast2 –crypt aes-128 –key your-kcptun-password –rcvwnd 512 –sndwnd 128 &
obfs
一个混淆工具,就是把shadowsocks数据包伪装成http/https,骗过墙的过滤。shadowsocks-libev官方支持 simple-obfs 插件,不过目前已经过时,后继为 v2ray-plugin
v2ray-plugin
项目地址 https://github.com/shadowsocks/v2ray-plugin 。目前似乎没有yum源,要手工安装。CentOS7服务端配置步骤:
到项目release页下载适合的版本, v2ray-plugin-linux-amd64… ,解压缩得后文件改名为v2ray-plugin,放到 /usr/local/bin 下,即/usr/local/bin/v2ray-plugin。
单独运行方式 v2ray-plugin -server -localAddr “0.0.0.0” -localPort 8080 -remoteAddr “127.0.0.1” -remotePort 12312 -host cdn.path8.net 其中 -remotePort 参数是shadowsocks-libev 监听端口,-localPort 是v2ray-plugin端口,即客户端要连接的是这个端口。
以shadowsocks-libev的插件模式运行:增加一行 “plugin”:”v2ray-plugin”, 这样ss设置里的服务端口将是v2ray-plugin端口(供客户端连接),而shadowsocks-libev将监听一个另外的随机的端口。这样客户端就不能直连shadowsocks-libev服务了。(如想让两者同时可用,可以使用上面单独运行的方式)
推荐的整合式方案:以nginx前端、把混淆整合到nginx背后
特点:
- 请求处理的次序: nginx -> v2ray-plugin -> ss-server
- 对外只开放80端口
配置shadowsocks-libev,及v2ray-plugin
跑两个ss服务,一个是裸ss与整合了v2ray插件的ss,裸ss的很简单,下面主要是整合v2ray插件的方法。
复制一份shadowsocks-libev的配置文件为 //cdn.path8.net/blog/etc/shadowsocks-libev/config_v2ray.json ,注意其中端口号,路径path两项,后面步骤要与之保持一致。
{ "server":"localhost", "server_port":12380, "local_port":1080, "password":"123456789", "timeout":60, "method":"aes-256-gcm", "plugin":"v2ray-plugin", "plugin_opts":"server;path=/myapp/;loglevel=none" }
注意:1) 裸ss的配置与之类似,注意不要最后两行、用另外的端口号。 2) 这里server是locahost,即不允许外部直接连接的,而是通过v2ray-plughn或kcptun访问;如要直连,可改成0.0.0.0。
复制一份服务配置shadowsocks-libev.service为 /usr/lib/systemd/system/shadowsocks-libev-v2ray.service,修改其中[Service]一节的ExecStart … 一行,为如下:
ExecStart=/usr/bin/ss-server -c /etc/shadowsocks-libev/config_v2ray.json $DAEMON_ARGS
设置服务的开机自动运行,并启动
systemctl enable shadowsocks-libev-v2ray systemctl start shadowsocks-libev-v2ray
配置nginx
/etc/nginx/conf.d/proxy.conf
server { listen 80; server_name sub.domain.com; root /var/www/html/sub.domain.com/html; #access_log /var/log/nginx/host.access.log main; location /myapp/ { proxy_redirect off; proxy_http_version 1.1; proxy_pass http://127.0.0.1:12345; proxy_set_header Host $http_host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
其中 location /myapp/ 要与shadowsocks-libev-v2ray配置中一致;proxy_pass 里的端口也一样。
客户端配置
shadowsocks-windows
- 端口:80
- 密码、加密,在shadowsocks-libev中设置
- 插件程序 :v2ray-plugin_windows_amd64.exe
- 插件选项:host=sub.domain.com;path=/myapp/
- 插件参数:(留空)
其中插件选项里的 host及path,都要与nginx中一致
Android版影梭+v2ray插件,设置服务器时,与上面的几项类似,都有较友好的设置选项。
有一个神奇的现象,出忽理解之外,就是如果让v2ray-plugin监听 “0.0.0.0” ,它会监听ipv6的[::1] ,但神奇的是,使用按ipv4的地址同端口连接,竟然是通的。不过这个整合方案规避了这个问题,因为改监听”localhost”了,而不是使用 0.0.0.0 。
推荐的整合式方案:kcptun + shadowsocks-libev方案
配置仅供服务器本机内部使用的裸shadowsocks,即只监听localhost;然后配置kcptun对外接受客户端连接。
修改shadowsocks-libev默认配置文件 //cdn.path8.net/blog/etc/shadowsocks-libev/config.json ,如下
{
"server":"localhost",
"server_port":12345,
"local_port":1080,
"password":"123456789",
"timeout":60,
"method":"aes-256-gcm"
}
启动
systemctl enable shadowsocks-libev systemctl start shadowsocks-libev
修改系统开机启动脚本到/etc/rc.local,在最后加入一行
/usr/local/bin/kcptun-server -t 127.0.0.1:12345 -l 0.0.0.0:12321 –mode fast2 –crypt aes-128 –key your-kcptun-password –rcvwnd 512 –sndwnd 128 &
其中:12345是裸ss的监听端口,12321是kcptun监听端口。密码、加密方式、及其它参数按需修改。
通过bbr提升网络质量(优化TCP协议)
墙内到海外网络的TCP丢包率通常都较高,尤其是很多廉价VPS,可以通过BBR的TCP拥塞控制算法明显改变这个情况。
可控内核的主机(如实体机及或KVM,Xen,Vmware等虚拟化下VPS)可以更换为支持bbr的内核;OpenVZ这种无独立内核的主机,则可以使用魔改版BBR。具体参看开启BBR
bbr与kcptun的比较
- bbr是单边加速方案,对客户端是透明的,也就是说,客户端不需要专门做任何改动、也不需要另装软件。
- kcptun通常会比bbr效果更好一些,尤其kcptun有一系列可调参数,可以更猛烈的“以带宽换速度”。
- kcptun可能稳定性较差。kcptun走UDP协议,有些网络环境下UDP协议优先级低,可能并不理想,甚至有些网络环境中不允许UDP协议。