几个相关的软件
shadowsocks/shadowsocks-libev
shadowsocks, 现代科学上网的里程碑式产品,早已经停止更新,github上的原项目已经删除。其后继者为shadowsocks-libev,有多个平台上的版本,目前主流的平台都有其客户端。
可使用的yum源:
- RHEL/CentOS 7 https://copr.fedorainfracloud.org/coprs/librehat/shadowsocks/
- RHEL/rocky/almalinux 9 https://copr.fedorainfracloud.org/coprs/maxg1/shadowsocks-libev/
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源,要手工安装。解压缩后运行即可(有两种运行方式),大致如下:
到项目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服务了。(如想让两者同时可用,可以使用上面单独运行的方式)
v2ray
v2ray是另一套梯子软件,项目地址 https://github.com/v2fly/v2ray-core/,(注意是v2fly项目维护的版本,原始项目下的已无更新) ,前面的 v2ray-plugin 就是使用了它的部分模块(主要是把传输的数据包装成HTTP),也是解压缩直接运行即可,具体步骤后面再述。
推荐的整合式方案:以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:12380; proxy_set_header Host $http_host; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; } }
其中 location /myapp/ 要与shadowsocks-libev-v2ray配置中一致;proxy_pass 里的端口也一样。
如果nginx配置的有 ssl 证书,那么自然的,在客户端里就可以走https协议的。
客户端配置
shadowsocks-windows
- 端口:80
- 密码、加密,在shadowsocks-libev中设置
- 插件程序 :v2ray-plugin_windows_amd64.exe
- 插件选项:host=sub.domain.com;path=/myapp/
- 插件参数:(留空)
其中插件选项里的 host及path,都要与nginx中一致。如果开户了 ssl 证书,那么参数里增加 ;tls 即可
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监听端口。密码、加密方式、及其它参数按需修改。
推荐的整合式方案:把v2ray也放到nginx背后
这个方案与前面的类似,实际上相当于使用 v2ray 代替前面 shadowsocks-libev + v2ray-plugin 这个组合体的地位,于是,比前面的方案还更简单。当然,也可以不要前面的组合体,只使用 v2ray 放在nginx背后。
安装 v2ray, 这里选择的是v2fly 持续更新的发布版本,项目发布的是zip 包 v2ray-linux-64.zip,包含了二进制程序及配置文件等多个文件,安装到合适的目录(这与v2ray官方的安装脚本稍有不同):
- 把下载的 v2ray-linux-64.zip 解压缩到 /usr/local/v2ray/ 下,
- 然后把 其中的 config.json 移动为 /etc/v2ray/config.json ,修改其中
- 再把 systemd/system/ 下的两个文件移动到 /etc/systemd/system/
修改配置文件 /etc/v2ray/config.json,主要是 inbounds 一节的 port 参数,修改为 12330, protocol 改为 vmess, 后面的 seetings 一节改成类似如下示例,注意id参数是一个uuid字符串,新生成一个,后面还有 streamSettings 是需要新增加的一节,其中 path 参数按需要修改。
...... // 如果需要的话可以开启日志,方便查错,注意日志目录的权限要设置为 nobody:nobody 否则systemctl 会报错 "log": { "access": "/var/log/v2ray/access.log", "error": "/var/log/v2ray/error.log", // Log level, one of "debug", "info", "warning", "error", "none" "loglevel": "warning" }, ...... "port": 12330, "listen": "127.0.0.1", "protocol": "vmess", "settings": { "clients": [{ "id": "12345678-90ab-cdef-abcd-0123456789ab", "alterId": 64 }] }, "streamSettings": { "network":"ws", "wsSettings": { "path": "/newapp/" } }, ......
修改 /etc/systemd/system/v2ray.service 中的 ExecStart 参数路径为实际安装路径
ExecStart=/usr/local/v2ray/v2ray run -config /etc/v2ray/config.json
启动服务
systemctl enable v2ray systemctl start v2ray
检查是否启动正常,并且有 127.0.0.1:12330 的监听进程。当然,现在不能对外服务,要在nginx里配置代理起来。
在前面的nginx配置文件里,复制一节 location /myapp/ {…} 将路径改为 newapp, 里面的proxy_pass 后端口为 12330, 应该就可以了。
v2ray的客户端,推荐使用 v2rayN ,有较友好的界面,也比较简单。
通过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协议。