KCPTun 服务端安装及简单配置教程

服务器被 TCP 阻断后想起来 KCP 是 UDP 协议,并且逗比网有详细的教程,虽然还是踩了一些坑,但是终于能连上外网啦,便把这些记下来以共备用。本教程来源于逗比根据地,但是教程很久没更新了,便稍加修改。

KCPTun 简介

Kcptun 是一个非常简单和快速的,基于 KCP 协议的 UDP 隧道,它可以将 TCP 流转换为 KCP+UDP 流。而 KCP 是一个快速可靠协议,能以比 TCP 浪费 10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。是 KCP 协议的一个简单应用,可以用于任意 TCP 网络程序的传输承载,以提高网络流畅度,降低掉线情况。由于 Kcptun 使用 Go 语言编写,内存占用低(经测试,在 64M 内存服务器上稳定运行),而且适用于所有平台,甚至 Arm 平台。

  • GitHub 项目地址
  • KCPTun - GitHub 下载地址
  • KCPTun - Android

KCPTun 服务端安装

本教程使用的系统为 Debain9 64bit

  • 下载 KCPTun 及解压

    注意:KCPtun 不分系统版本,只分 64 位(下载 kcptun-linux-amd64.xxx.tar.gz 的)和 32 位(下载带 kcptun-linux-386.xxx.tar.gz 的)先去 GitHub 下载最新的版本然后复制到下面的 wget 后面即可。

    # 新建一个文件夹
    mkdir /root/kcptun
    # 进入刚才新建的文件夹
    cd /root/kcptun
    # 下载最新的 kcptun-linux-amd64 文件
    wget https://github.com/xtaci/kcptun/releases/download/v20180316/kcptun-linux-amd64-20180316.tar.gz
    # 解压刚才下载的文件
    tar -zxvf kcptun-linux-amd64-20161222.tar.gz

解压之后会发现只有两个文件: client_linux_amd64 和 server_linux_amd64,第一个是是客户端文件(linux 的客户端),第二个是服务端文件。

目前 KCPTun 已经加入了配置文件设定,但没有任何启动脚本,所以需要新建一些脚本。

  • 创建 start.sh

    nano /root/kcptun/start.sh

    写入以下内容:

    #!/bin/bash
    cd /root/kcptun/
    ./server_linux_amd64 -c /root/kcptun/server-config.json 2>&1 &
    echo "Kcptun started."
    # server_linux_amd64 对应服务端文件名,请对应修改。
  • 创建配置文件:

nano /root/kcptun/server-config.json

写入以下内容:

{
"listen": ":32143",
"target": "127.0.0.1:23546",
"key": "password",
"crypt": "salsa20",
"mode": "fast2",
"mtu": 1350,
"sndwnd": 1024,
"rcvwnd": 1024,
"datashard": 10,
"parityshard": 3,
"dscp": 46,
"nocomp": false,
"log": "/root/kcptun/kcptun.log"
}

listen 表示 Kcptun 的服务端监听端口,用于接收外部请求和发送数据,默认 2333
target 表示要加速的地址,由于 Kcptun 和 Shadowsocks 在同一服务器,地址填写 127.0.0.1(不需要改,这是指本机 IP,除非你有多个 IP),而 8388 为 Shadowsocks 服务端监听端口;
key 是 Kcptun 的验证密钥,上面的启动脚本参数默认加上了 -key passwaord ,如果不需要可以删掉,服务端和本地必须一致才能通过验证,请自行设置;
mode 为加速模式,默认 fast2
crypt 为加密方式,默认 aes-192
nocomp 为压缩传输,默认 false 表示开启压缩传输。
其他参数可以参考 项目主页 的介绍。

注意:客户端和服务端的参数 -sndwnd 2048 -rcvwnd 2048 这两个值不要大于你的本地宽带,否则流>量消耗会浪费好几倍,100M 就是 2048,50M 就是 1024。这两个值可以逐渐调小,但是不能比本地的实际宽带大!

注意:产生大量重传时,一定是窗口偏大了

  • 创建 stop.sh:

    nano /root/kcptun/stop.sh

    写入以下内容:

    #!/bin/bash
    PID=`ps -ef | grep server_linux_amd64 | grep -v grep | awk '{print $2}'`
    if [ "" != "$PID" ]; then
    echo "killing $PID"
    kill -9 $PID
    else
    echo "Kcptun not running!"
    fi
  • 创建 restart.sh:

    vi /root/kcptun/restart.sh

    写入以下内容:

    #!/bin/bash
    cd /root/kcptun/
    echo "Stopping Kcptun..."
    bash stop.sh
    bash start.sh
    echo "Kcptun started."
  • 给上面创建的脚本添加执行权限:

    chmod +x /root/kcptun/*.sh
  • 启动服务端:

    sh /root/kcptun/start.sh

日志文件在:/root/kcptun/kcptun.log

  • 监听日志信息:

    tail -f /root/kcptun/kcptun.log
  • 停止服务端:

    sh /root/kcptun/stop.sh
  • 重启服务端:

    sh /root/kcptun/restart.sh
  • 添加开机启动

    Centos 系统:

    chmod +x /etc/rc.d/rc.local && echo "sh /root/kcptun/start.sh" >> /etc/rc.d/rc.local

    Ubuntu/Debian 系统:

    chmod +x /etc/rc.local && echo "sh /root/kcptun/start.sh" >> /etc/rc.local

    这里的命令有些问题,执行后会添加到末尾但是会在exit 0后面,造成开机并不能自启,此时需要手动修改文件。

    注意 Debian9+/Ubuntu17+ 默认不带有 /etc/rc.local 文件,但是rc.local还在,转到 创建教程

  • 升级服务端

    重复一开始的步骤,下载最新版本的压缩包然后解压覆盖源文件,记得先停止 KCPTUN 运行再覆盖

    # 进入新建的文件夹
    cd /root/kcptun
    # 下载最新的 kcptun-linux-amd64 文件
    wget https://github.com/xtaci/kcptun/releases/download/v20161222/kcptun-linux-amd64-20180534.tar.gz
    # 解压刚才下载的文件
    tar -zxvf kcptun-linux-amd64-20161222.tar.gz
  • 故障排除
    客户端和服务器端皆无 stream opened 信息。
    连接客户端程序的端口设置错误。

    客户端有 stream opened 信息,服务器端没有。
    连接服务器的端口设置错误,或者被防火墙拦截。

    客户端服务器皆有 stream opened 信息,但无法通信。
    上层软件的设定错误。

    注意:日志信息在你的客户端或者服务端同目录下的 kcptun.log 中。

更新日志2018-07-08:发现开机自启的问题,提出手动修改。