使用kcptun来加速shadowsocks

最近gfw升级之后,似乎带来一个全新的特性——TCP阻断。受影响的vps可以ping,但是所有使用tcp协议的应用都会失效,如ssh和shadowsocks,不过udp并未受到影响,个人分析可能tcp的长连接更容易识别。由于shadowsocks并不支持udp通讯,所以需要使用kcptun作为中间层。

基本原理

这是kcptun项目网站的原理图片。

可以看到kcptun的客户端会在本地监听来自应用程序的流量,同时将数据发往服务端,kcptun服务端程序会将数据发往目标端口。客户端和服务端之间使用kcp协议,它基于udp。

安装kcptun

根据你的设备的处理器架构以及系统类型,从https://github.com/shadowsocks/kcptun/releases/latest下载相应的程序。

服务端

  1. 将下载好的服务端程序改名为kcp-server,并且复制到/usr/bin

  2. 由于kcptun目前不支持直接生成守护进程,同时为了方便管理,我编写了基于systemd的服务脚本

    1
    git clone https://github.com/colorfulshark/kcptun-daemon.git
  3. 安装服务脚本及配置文件

    1
    2
    3
    cd kcptun-daemon
    chmod +x install.sh
    sudo ./install.sh

客户端

Windows:https://github.com/shadowsocks/kcptun/releases/latest

下载解压之后,将客户端程序复制到shadowsocks所在目录,并改名为kcp-client.exe

Android:https://github.com/shadowsocks/kcptun-android/releases/latest

直接安装即可

配置kcptun

这里并不探讨最佳配置,因为每个人的网络情况都不同,所以这里只介绍一个最小的可工作配置。

服务端

服务端的配置文件在/etc/kcptun/config.json

  1. listen:kcptun的本地监听端口,用于与客户端通讯
  2. target:服务端接收到数据后转发的地址,这里就是你的shadowsocks所监听的IP地址和端口号
  3. key:客户端与服务端认证的密钥
  4. crypt:加密方式,由于shadowsocks本身已经加密,所以不需要设置非常复杂的加密方式
  5. mode:响应模式,更快的响应可能造成更高的丢包率

注意,shadowsocks的监听端口与kcptun的target端口要一致。

客户端

Windows

  1. 打开shadowsocks编辑服务器的界面
  2. 服务器端口改为kcptun所监听的端口,默认是29900
  3. 插件程序中,填入kcp-server.exe
  4. 插件选项中,填入mode=fast;key="it's a secrect"
  5. 确认即可

Android

  1. 安装kcptun后,在shadowsocks的服务器编辑界面的Plugin中选择kcptun
  2. 在Configure中填入mode=fast;key="it's a secrect"
  3. 确认后重新连接服务器