科学上网相关shadowsocks/kcputn/bbr/obfs/v2ray-plugin/v2ray

几个相关的软件

shadowsocks/shadowsocks-libev

shadowsocks, 现代科学上网的里程碑式产品,早已经停止更新,github上的原项目已经删除。其后继者为shadowsocks-libev,有多个平台上的版本,目前主流的平台都有其客户端。

可使用的yum源:

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官方的安装脚本稍有不同):

  1. 把下载的 v2ray-linux-64.zip 解压缩到 /usr/local/v2ray/ 下,
  2. 然后把 其中的  config.json 移动为 /etc/v2ray/config.json ,修改其中
  3. 再把 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协议。

发表评论

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理