Post

KcpTun 加速 Shadowsocks

KCP 是一个快速可靠的 ARQ 协议,通过将 TCP 流量分拆到 UDP 传输,以增加流量的代价去获得低延时,从而大幅提高科学上网的流畅度。

KCPTun 是 GO 实现 KCP 协议的工具,由服务端和客户端两部分组成,借助它作远程端口转发可以大幅提高 Shadowsocks(下简称 SS)的速度。

总体概述

笔者手上有一个 AWS 上运行的 EC2 实例,系统为 RHEL 7.4,上面跑着一个 ss-server 端的 daemon 进程。为了把 SS 流量通过 KcpTun 隧道转发,需要在 EC2 上安装 KcpTun-Server,客户端目标机安装 KcpTun-Client。

Shadowsocks 服务端

ss-server 安装运行在 EC2 上,配置如下:

1
2
3
4
5
6
7
{
  "server": "0.0.0.0",
  "server_port": 6789,
  "password": "your_ss_passwd",
  "timeout": 300,
  "method": "aes-256-cfb"
}

KcpTun 服务端

KcpTun Release 列表选择系统对应的版本,本例的 EC2 是 64 位 RHEL,故选择最新的 linux-amd64 版本:

在 EC2 下载 KcpTun 二进制程序包:

1
$ wget https://github.com/xtaci/kcptun/releases/download/v20180810/kcptun-linux-amd64-20180810.tar.gz

解压:

1
$ tar zxvf kcptun-linux-amd64-20180810.tar.gz -C KCPTUN_DIR

KCPTUN_DIR替换为放置 KcpTun 的自定义目录。

每个发行包里面都含一个 Server 和一个 Client,在 EC2 上只需使用其中的文件 server_linux_amd64 即可。

接着,在 KcpTun 目录内新建一个 JSON 配置文件,可取名为 kcptun-server-config.json,添加如下内容:

1
2
3
4
5
6
7
{
  "target": "127.0.0.1:6789",
  "listen": ":7890",
  "mode": "fast2",
  "key": "your_kcp_passwd",
  "crypt": "aes-128"
}

其中:

  • target - 指向本机 ss-server 的服务 {IP}:{Port}
  • listen - KcpTun 监听端口
  • mode - KcpTun 模式,可选有 fast3fast2fastnormal (默认:fast
  • key - KcpTun-Server 和 KcpTun-Client 之间的密码
  • crypt - 加密方式,不填默认 aes

更加具体的参数用法及含义可以执行以下命令获得:

1
$ ./server_linux_amd64 -h

运行 KcpTun 服务端前,需要确保两点:

  1. target 指向的 ss-server 正在运行。

  2. EC2 的 VPC 开放如下规则:

  • Inbound:

    TypeProtocolPort RangeSource
    Custom UDP RuleUDP78900.0.0.0/0
    Custom TCP RuleTCP78900.0.0.0/0
  • Outbound:

    TypeProtocolPort RangeSource
    All TCPTCP0 - 655350.0.0.0/0
    All UDPUDP0 - 655350.0.0.0/0

接下来后台运行 KcpTun-Server:

1
$ nohup ./server_linux_amd64 -c /path/to/kcptun-server-config.json > /dev/null 2>&1 &

KcpTun 客户端

相应的,客户端机器也需要运行一个 KcpTun-Client 和一个 SS-Client。

选择 1. Shadowsocks-X-NG

如果是在 Mac 机器上,则比较简单:ShadowsocksX-NG-1.7.1 已经在 SS-Client 的基础上集成了 KcpTun-Client,因此只需安装配置一个客户端软件即可。

Shadowsocks-X-NG 配置如下:

  1. Preferences..选择 Kcptun 项:

    Local Kcptun Listen Address127.0.0.1

    Local Kcptun Listen Port 填写客户端机器空闲端口,本例为 7086

    这两项意思为 Kcptun-Client 运行在本地 127.0.0.1:7086

    preferreces-kcptun

  2. 进入ServersServer Preferences..添加配置,勾选 Enable over kcptun,如下图:

    server-settings

    右侧面板以横线为界,上半部分的 Address 为 EC2 的公网 IP;EncryptionPassword 与 EC2 上的 SS-Server 配置一致。

    下半部分的 Kcptun Port , Mode, Encryption 与 EC2 上的 KcpTun-Server 配置一致。

    其中 Kcptun Port 即为 Kcptun-Server 的 listen 值,Password 为 KcpTun-Serve 的 Key

选择 2. 官方客户端

如果客户端机器平台不是 Mac,那么可以直接使用 KcpTun 的官方 Client,为了方便可以建立配置文件,命名为 kcptun-cli-config.json

1
2
3
4
5
6
7
{
  "remoteaddr" : "EC2_IP:7890",
  "localaddr" : "127.0.0.1:7086",
  "mode" : "fast2",
  "key" : "your_kcp_passwd",
  "crypt" : "aes-128",
}

daemon 运行 KcpTun-Client:

1
$ nohup ./client_darwin_amd64 -c /path/to/kcptun-cli-config.json > /dev/null 2>&1 &

Shaowsocks GUI 客户端使用配置:

1
2
3
4
5
6
7
8
9
{
  "method" : "aes-256-cfb",
  "server" : "127.0.0.1",
  "password" : "your_ss_passwd",
  "local_address" : "127.0.0.1",
  "server_port" : 7086,
  "timeout" : 60,
  "local_port" : 1080
}

不出意外,此刻你已体验到了 KCP 的快感。笔者实测,YouTube 视频码率用 Auto 模式,使用纯 SS,加载视频为 480P。当使用 KcpTun 后,加载分辨率跳到了 1080P!

后话

Kcptun-Client 目前没有 iOS 平台的 APP,暂时只能用一台墙内 VPS 运行 Kcptun-Client 作中转,让 iOS 上用普通的 SS-Client 链接使用。另外,KCP 是个双刃剑,流量敏感的用户需要在 KcpTun-Server 上针对性的修改调整更多的参数,达到最好的性价比。

This post is licensed under CC BY 4.0 by the author.

Comments powered by Disqus.