Total Pageviews

Sunday 8 May 2016

利用kcptun+http代理服务器程序或socks代理服务器程序翻墙

首先登陆你的linux vps.
mkdir kcptun
cd kcptun
wget https://github.com/xtaci/kcptun/releases/download/v20180316/kcptun-linux-amd64-20180316.tar.gz
tar zxvf kcptun-linux-amd64-20180316.tar.gz
root@kvm:~/kcptun# ls
kcptun-linux-amd64-20180316.tar.gz  server_linux_amd64 client_linux_amd64
root@kvm:~/kcptun# rm -rf  client_linux_amd64 (只需要用到服务器端程序:server_linux_amd64)
root@kvm:~/kcptun# ./server_linux_amd64 -h (查看server_linux_amd64的用法)
  
USAGE:
   ./server_linux_amd64 [global options] command [command options] [arguments...]
  
VERSION:
   20180316
  
COMMANDS:
   help, h    Shows a list of commands or help for one command
  
GLOBAL OPTIONS:
   --listen, -l ":29900"        kcp server listen addr:
   --target, -t "127.0.0.1:12948"    target server addr
   --key "it's a secrect"        key for communcation, must be the same as kcptun client [$KCPTUN_KEY]
   --mode "fast3"            mode for communication: fast, normal, default
   --crypt             
   --help, -h                show help
   --version, -v            print the version
  
root@kvm:~/kcptun#  ./server_linux_amd64 -l 0.0.0.0:29900 -t 127.0.0.1:8118 --key your_key --crypt aes-192 --mode fast3 &
(此命令的意思是程序server_linux_amd64监听服务器上的端口29900,在收到连接端口29900的请求后,转发到同台机器的8118端口。同台机器的8118端口上运行的是一个http代理服务器程序:
https://briteming.blogspot.com/2018/04/gohttpkiss-proxy.html .
如果你想转发到socks代理服务器程序,可搭建mocks,参见http://briteming.blogspot.com/2012/02/socks-server-mocks.html。
这里的端口29900可改为其他未被占用的端口号)
不过此命令:./server_linux_amd64 -l 0.0.0.0:29900 -t 127.0.0.1:8118 --key your_key --crypt aes-192 --mode fast3 &容易退出,我们可以利用systemd来把此命令运行为service:
nano /etc/systemd/system/kcptun.service
其内容为:
[Unit]
After=network.target

[Service]
ExecStart=/root/kcptun/server_linux_amd64 -l 0.0.0.0:29900 -t 127.0.0.1:8118 --key my-key --crypt aes-192 --mode fast3
Restart=always

[Install]

WantedBy=multi-user.target

然后运行:

systemctl start kcptun
systemctl enable kcptun
这样服务器端就运行起来了。

在客户端机器上。
因为我的 客户端机器为mac,于是下载客户端程序的mac版:
mdkir kcptun
cd kcptun
wget https://github.com/xtaci/kcptun/releases/download/v20180316/kcptun-darwin-amd64-20180316.tar.gz
tar zxvf kcptun-darwin-amd64-20180316.tar.gz

yudeMacBook-Air:kcptun brite$ ls
client_darwin_amd64 server_darwin_amd64 kcptun-darwin-amd64-20180316.tar.gz
yudeMacBook-Air:kcptun brite$ rm -rf server_darwin_amd64
yudeMacBook-Air:kcptun brite$ ls
client_darwin_amd64 kcptun-darwin-amd64-20180316.tar.gz
yudeMacBook-Air:kcptun brite$ ./client_darwin_amd64 -h

USAGE:
   ./client_darwin_amd64 [global options] command [command options] [arguments...]
  
VERSION:
   20180316
  
COMMANDS:
   help, h    Shows a list of commands or help for one command
  
GLOBAL OPTIONS:
   --localaddr, -l ":12948"    local listen addr:
   --remoteaddr, -r "vps:29900"    kcp server addr
   --key "it's a secrect"    key for communcation, must be the same as kcptun server [$KCPTUN_KEY]
   --mode "fast"        mode for communication: fast, normal, default
   --crypt            enable tunnel encryption, adds extra secrecy for data transfer
   --help, -h            show help
   --version, -v        print the version
  
yudeMacBook-Air:kcptun brite$ ./client_darwin_amd64 -l 0.0.0.0:12948 -r your_vps_ip:29900 --key your_key --crypt aes-192 --mode fast3
(此命令的意思是客户端程序client_darwin_amd64监听本地机器的12948端口,在收到连接12948端口的请求后,把请求转发到你的vps的29900端口。这里的key的值必须跟服务器上所设置的key的值一致。这里的12948端口可改为其他未被占用的端口号)
这样客户端就运行起来了。

然后设置本地机器的浏览器的http代理为127.0.0.1:12948,浏览器即可翻墙。

程序下载地址:https://github.com/xtaci/kcptun/releases/
(如果是其他桌面系统,则下载相应的版本)
-----------------------

an extremely simple, fast & stealth udp tunnel based on kcp。
TCP流转换为KCP+UDP流,>>>下载地址<<< 用于高丢包环境中的数据传输,工作示意图:
                +---------------------------------------+
                |                                       |
                |                KCPTUN                 |
                |                                       |
+--------+      |  +------------+       +------------+  |      +--------+
|        |      |  |            |       |            |  |      |        |
| Client | +--> |  | KCP Client | +---> | KCP Server |  | +--> | Server |
|        | TCP  |  |            |  UDP  |            |  | TCP  |        |
+--------+      |  +------------+       +------------+  |      +--------+
                |                                       |
                |                                       |
                +---------------------------------------+
kcptun是kcp协议的一个简单应用,可以用于任意tcp网络程序的传输,可以极大的提高软件网络流畅度(如浏览器,telnet等),降低掉线,连不上等情况。

Docker

docker pull xtaci/kcptun

使用方法

D:\>client_windows_amd64.exe -h
NAME:
   kcptun - kcptun client

USAGE:
   client_windows_amd64.exe [global options] command [command options] [arguments...]

VERSION:
   20160507

COMMANDS:
   help, h      Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --localaddr, -l ":12948"     local listen addr:
   --remoteaddr, -r "vps:29900" kcp server addr
   --key "it's a secrect"       key for communcation, must be the same as kcptun server [$KCPTUN_KEY]
   --mode "fast"                mode for communication: fast, normal, default
   --tuncrypt                   enable tunnel encryption, adds extra secrecy for data transfer
   --help, -h                   show help
   --version, -v                print the version

D:\>server_windows_amd64.exe -h
NAME:
   kcptun - kcptun server

USAGE:
   server_windows_amd64.exe [global options] command [command options] [arguments...]

VERSION:
   20160507

COMMANDS:
   help, h      Shows a list of commands or help for one command

GLOBAL OPTIONS:
   --listen, -l ":29900"                kcp server listen addr:
   --target, -t "127.0.0.1:12948"       target server addr
   --key "it's a secrect"               key for communcation, must be the same as kcptun client [$KCPTUN_KEY]
   --mode "fast"                        mode for communication: fast, normal, default
   --tuncrypt                           enable tunnel encryption, adds extra secrecy for data transfer
   --help, -h                           show help
   --version, -v                        print the version

适用范围(包括但不限于):

  1. 网络游戏的数据传输
  2. 跨运营商的流量传输
  3. 其他高丢包,高干扰通信环境的TCP数据传输
from  https://github.com/xtaci/kcptun
-------------------------------------------------------


快速上手

注意,使用前请先阅读页面下方的免责声明
这里下载 最新的对应平台的版本(内含x86/x64/arm)。
执行 client -h 和server -h 查看详细使用方法. 不同平台分别为client_windows_amd64.exe或server_linux_amd64这种平台对应文件名。
我们以加速ssh -D访问为例示范使用方法如下:
  1. 假定服务器(比如ubuntu) IP地址为:xxx.xxx.xxx.xxx
  2. 在服务器端开启ssh -D, 监听127.0.0.1:8080端口,或者你可以在服务器端启动任意的socks代理,例如dante(更快),监听127.0.0.1:8080
    ssh -D 127.0.0.1:8080 ubuntu@localhost
  3. 在服务器启动kcp server:
    server -t "127.0.0.1:8080" // 所有接收到的数据包转发到sshd进程的socks 8080端口
    ------分割线,上面是服务器,下面是客户端 ----
  4. 在本地(比如win10)启动kcp client:
    client -r "xxx.xxx.xxx.xxx:29900" // 连接到kcp server,默认kcp server端口是29900
  5. 将浏览器socks5代理设置为127.0.0.1:12948 // 默认kcp client的端口是12948
完整转发过程为: 浏览器 -> kcp-client(:12948) -> kcp-server(:29900) -> ssh -D(:8080)

特性

  1. 超级快
  2. 跨平台
  3. 采用高安全性AES-256-CFB双重加密(包+流)
  4. UDP数据包一次一密(OTP)无特征,防非法深度检测
  5. 消息摘要采用MD5保证消息完整性
  6. PSK防止MITM攻击
  7. kcptun客户端和服务端分别只有一个main.go文件,易于使用
  8. 核心基于kcp-go
  9. 基于yamux 的多路流复用( N:1 <<------>> 1:N),自动重连
  10. 三种传输模式: fast/normal/default
(注意:要实现高可靠的信息安全,上层TLS/SSL等加密手段依然不可或缺。)

适用范围(包括但不限于):

  1. 网络游戏的数据传输
  2. 跨运营商的流量传输
  3. 其他高丢包,高干扰通信环境的TCP数据传输

参数调整

初步运行成功后,强烈建议通过命令行改变如下参数加强传输安全:
1. kcp server默认端口
2. 默认密码 必须修改 最好是字母数字大小写特殊字符的组合(前往 密码生成)
3. 额外的隧道安全,可以通过 -tuncrypt 在server/client两端同时开启,即使PSK被猜到也难以破译
例如:
server -tuncrypt -l ":41111" -key "yqRhM5T5"

加密流程

                               /dev/urandom
                                     +
+-----------+                        |
|           |                        |                 +---------+   PSK   +-----------+
| PLAINTEXT |                     +--v--+              |                               |
|           |                     | OTP |              |                               |
+-----+-----+                     +--+--+              |                               |
      |                              |                 |                               |
 +----v----+    +--------+       +---v----+       +----+----+                     +----+----+        +--------+                      +-----------+
 |         |    |        |       |        |       |         |                     |         |        |        |                      |           |
 | AES+CFB +----> CIPHER +-------> PACKET +-------->AES+CFB +----> Internet +------>AES+CFB +--------> PACKET |     Copyright by     | PLAINTEXT |
 | ENCRYPT |    |  TEXT  |       |        |       | ENCRYPT |                     | DECRYPT |        |        |     @xtaci           |           |
 |         |    |        |       +---^----+       |         |                     |         |        +---+----+                      +-----^-----+
 +----^----+    +---+----+           |            +---------+                     +---------+            |                                 |
      |             |           +----+----+                      /dev/urandom                            |                                 |
      |             |           |         |                            +                             +---v----+       +--------+      +----+----+
      |             +----------->   MD5   |                            |                             |        |       |        |      |         |
      |                         |         |                        +---v----+                        |  MD5   +-------> CIPHER +------->AES+CFB |
      |                         +---------+                        |        |                        | VERIFY |       |  TEXT  |      | DECRYPT |
      |                                                  +---------+   IV   +-----------+            |        |       |        |      |         |
      |                                                  |         |        |           |            +--------+       +--------+      +----^----+
      |                                                  |         +--------+           |                                                  |
      |                                                  |                              |                                                  |
      +--------------------------------------------------v--------+   PSK   +-----------v--------------------------------------------------+

从源码的安装

预备条件:

  1. 安装好golang
  2. 设置好GOPATH 以及PATH=$PATH:$GOPATH/bin (例如: export GOPATH=/home/ubuntu; export PATH=$PATH:$GOPATH/bin), 最好放到.bashrc 或 .zshrc中

安装命令

  1. 服务端: go get github.com/xtaci/kcptun/server; server
  2. 客户端: go get github.com/xtaci/kcptun/client; client

常见问题

Q: client/server都启动了,但无法传输数据,服务器显示了stream open
A: 先杀掉client/server,然后重新启动就能解决绝大部分的问题
Q: client/server都启动了,但服务器没有收到任何数据包也没有stream open
A: 某些IDC默认屏蔽了UDP协议,需要在防火墙中打开对应的端口
Q: 出现不明原因降速严重,可能有50%丢包
A: 可能该端口被运营商限制,更换一个端口就能解决.

from  https://github.com/xtaci/kcptun/blob/32c19609ab51c87577b23842d5ca63eb52b34bd0/README.md

我又要说中国人就是聪明 。这个程序跟obfstunnel- http://briteming.blogspot.com/2016/04/obfstunnelsockshttp.html有得一比.不过经过几个小时的测试,莫名其妙的,我用kcptun就翻不了墙了,这是怪事,用ps aux|grep 命令检查了客户端程序和服务器端程序都在运行中,而且也检查了服务器上的socks代理服务器程序也在运行中,但就是用kcptun翻不了墙。可见这个kcptun并不够robust.

那个obfsproxy的srcamblesuit版+socks代理服务器程序(http://briteming.blogspot.com/2016/03/obfsproxysockshttp.html)翻墙,不过obfsproxy的服务器端有时容易退出。

我感觉还是obfstunnel(http://briteming.blogspot.com/2016/04/obfstunnelsockshttp.html)比较robust!!我更推荐用obfstunnel翻墙。

https://github.com/luckypoem/multitune
----------------------------

小内存福音,Kcptun加速方案

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


KCP 协议:https://github.com/skywind3000/kcp
Kcptun 项目地址:https://github.com/xtaci/kcptun
如果你在使用过程中有什么问题,也可以添加博主QQ寻求帮助。

相关项目
以下为 Kcptun 的相关项目,如果有兴趣,可以了解一下。
1.Kcp-server:https://github.com/clangcn/kcp-server
Kcp-server 是在 Kcptun 的基础上,添加了配置文件的支持,并简化了安装过程,一条命令即可配置完毕。
如果你是小白,而且看了后面的教程也看不懂的话,推荐直接使用 Kcp-server 吧,就是更新较原版略慢。

2016.06.27 v20160627发布,新参数-nocomp,需要在两端同时使用以禁止压缩传输。
2016.06.17 添加客户端开机自启批处理,重写软件启动vbs脚本。
本教程以 CentOS 6.5 64位为例。
首先下载 Kcptun,可以到 GitHub 上获取最新版.
用Putty 登陆服务器,下载 Kcptun 的预编译版:
mkdir kcptun
cd kcptun
wget https://github.com/xtaci/kcptun/releases/download/v20160701/kcptun-linux-amd64-20160701.tar.gz
tar -zxf kcptun-linux-amd64-*.tar.gz
注:请根据你的系统下载对应版本。32位系统下载 kcptun-linux-386-*.tar.gz,64位系统下载 kcptun-linux-amd64-*.tar.gz
解压之后有两个文件:client_linux_amd64 和 server_linux_amd64,一个用于服务器,一个用于客户端。
这个项目目前还没有 init 脚本,也还不支持配置文件,于是我写了两个简单的 sh 脚本,用于启动和关闭服务端。请在服务端程序相同目录下新建两个文件 start.sh 和 stop.sh。
创建 start.sh
写入以下内容:
./server_linux_amd64 -l :29900 -t 127.0.0.1:8388 -key test -mtu 1400 -sndwnd 2048 -rcvwnd 2048 -mode fast2 > kcptun.log 2>&1 &
server_linux_amd64 对应服务端文件名,请对应修改。
-l 表示 Kcptun 的服务端监听端口,用于接收外部请求和发送数据,默认 29900;
-t 表示要加速的地址,我这里设置的是我服务器的 Shadowsocks 端口;
-key 是 Kcptun 的验证密钥,服务端和本地必须一致才能通过验证,请自行设置;
-mode 为加速模式,默认 fast,这里使用 fast2。
由于可用参数太多,不一一举例,其他参数可以参考项目主页的介绍。
响应速度:
fast3 > [fast2] > fast > normal > default
有效载荷比:
default > normal > fast > [fast2] > fast3
中间 mode 参数比较均衡,总之就是越快越浪费带宽,推荐模式 fast2。
其他参数,请使用 ./server_linux_amd64 -h 查看,更深层次的参数调整需要理解 KCP 协议,并通过“隐藏参数”调整。巭孬嫑乱动
下面是作者给的配置样例,适用大部分ADSL接入(非对称上下行)的参数(实验环境电信100M ADSL)。其它带宽请按比例调整,比如 50M ADSL,把 CLIENT 的 -sndwnd -rcvwnd 减掉一半,SERVER 不变。

SERVER:   -mtu 1400 -sndwnd 2048 -rcvwnd 2048 -mode fast2
CLIENT:   -mtu 1400 -sndwnd 256 -rcvwnd 2048 -mode fast2 -dscp 46
创建 stop.sh,
写入以下内容:
PID=`ps -ef | grep server_linux_amd64 | grep -v grep | awk '{print $2}'`
if [[ "" !=  "$PID" ]]; then
  echo "killing $PID"
  kill -9 $PID
fi

然后可以启动服务端:
sh start.sh
kcptun.log 为日志信息。
停止服务端请使用:
sh stop.sh

配置客户端
以本地 Windows 64位系统为例,首先下载 Kcptun 的 Windows 版本。
我这里先新建一个文件夹,命名为 Kcptun,然后下载:
https://github.com/xtaci/kcptun/releases/download/v20160701/kcptun-windows-amd64-20160701.tar.gz
解压到文件夹下。

本地监听端口为 12948;服务器 IP 地址 10.10.10.10 端口 29900;验证密钥和服务端一致。其他参数说明见上面服务端配置的说明。
v20160616 新增参数:-conn,使用多线程连接。可尝试添加 -conn 4 以使用4线程连接服务器。
新建 stop.bat:
taskkill /f /im client_windows_amd64.exe

速度实测
我用的服务器是搬瓦工 512M 内存,费利蒙机房,以此测试加速效果。
按结论看,Kcptun 的加速效果略逊于 Finalspeed,估计需要细调配置。
刚运行 Finalspeed 时,内存占用就达到了 9.1% 也就是接近 47M;而此时 Kcptun 占用 0.4%,也就是 2M左右。
YouTube 1440p 满跑情况下,FInalspeed 最高内存占用 15.4%,接近 79M;而此时 Kcptun 占用 3% 左右,即 15.5M。
速度方面,Finalspeed 最大速度达到了10000 Kbps +,Kcptun 6000+ Kbps。

以上结论为本人测试所得,仅作为参考;实际情况请自行测试。
------------------------------------------------------------------


双边加速软件kcptun搭建教程(服务器端)



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

KCP 协议:https://github.com/skywind3000/kcp
Kcptun 项目地址:https://github.com/xtaci/kcptun

KCPTun安装

本教程使用的是 Debian 64x 系统。
下载KCPTun,并解压:
注意:下面的KCPTun文件下载可能不是最新的地址,最新文件的下载地址看这里:
Github-kcptun-releases,直接替换第三行 wget 后面链接的版本号就行了。
注意:KCPTun不分系统版本,只分主系统和位数,
比如 64x 就选择 kcptun-linux-amd64-XXX.tar.gz
32x就选择 kcptun-linux-386-XXX.tar.gz ,Centos/Debian/Ubuntu都一样。
  1. mkdir /root/kcptun
  2. # 新建一个文件夹
  3. cd /root/kcptun
  4. # 进入刚才新建的文件夹
  5. wget https://github.com/xtaci/kcptun/releases/download/v20161222/kcptun-linux-amd64-20161222.tar.gz
  6. # 下载最新的 kcptun-linux-amd64 文件
  7. tar -zxvf kcptun-linux-amd64-20161222.tar.gz
  8. # 解压刚才下载的文件
解压之后会发现只有两个文件: client_linux_amd64 server_linux_amd64,第一个是是客户端文件(linux的客户端),第二个是服务端文件。
目前KCPTun已经加入了配置文件设定,但没有任何启动脚本,所以需要新建一些脚本。
注:下面需要 vi 操作。
简单的说就是vi XXX打开文件,按I键 进入编辑模式,然后输入内容后按 Esc键 退出编辑模式,然后按 :wq 保存并退出。
创建 start.sh:
  1. vi /root/kcptun/start.sh
写入以下内容:
  1. #!/bin/bash
  2. cd /root/kcptun/
  3. ./server_linux_amd64 -c /root/kcptun/server-config.json 2>&1 &
  4. echo "Kcptun started."
server_linux_amd64 对应服务端文件名,请对应修改。
创建配置文件:
  1. vi /root/kcptun/server-config.json
写入以下内容:
  1. {
  2. "listen": ":2333",
  3. "target": "127.0.0.1:8388",
  4. "key": "dou-bi.co",
  5. "crypt": "aes-192",
  6. "mode": "fast2",
  7. "mtu": 1350,
  8. "sndwnd": 1024,
  9. "rcvwnd": 1024,
  10. "datashard": 70,
  11. "parityshard": 30,
  12. "dscp": 46,
  13. "nocomp": false,
  14. "acknodelay": false,
  15. "nodelay": 0,
  16. "interval": 40,
  17. "resend": 0,
  18. "nc": 0,
  19. "sockbuf": 4194304,
  20. "keepalive": 10,
  21. "log": "/root/kcptun/kcptun.log"
  22. }
  • listen 表示 Kcptun 的服务端监听端口,用于接收外部请求和发送数据,默认 2333
  • target 表示要加速的地址,由于 Kcptun 和 Shadowsocks 在同一服务器,地址填写 127.0.0.1(不需要改,这是指本机IP,除非你有多个IP),而 8388 为 Shadowsocks 服务端监听端口
  • key 是 Kcptun 的验证密钥,上面的启动脚本参数默认加上了 -key dou-bi.co 如果不需要可以删掉,服务端和本地必须一致才能通过验证,请自行设置;
  • mode 为加速模式,默认 fast2 ;
  • crypt 为加密方式,默认 aes-192 ;
  • nocomp 为压缩传输,默认 false 表示开启压缩传输。
其他参数可以参考项目主页的介绍。
下面是引用官方介绍:
响应速度:
fast3 > [fast2] > fast > normal > default
有效载荷比:
default > normal > fast > [fast2] > fast3
中间 mode 参数比较均衡,总之就是越快越浪费带宽,推荐模式 fast2。
其他参数,请使用 ./server_linux_amd64 -h 查看,更深层次的参数调整需要理解 KCP 协议,并通过“隐藏参数”调整。
作者推荐配置参数:
  1. 适用大部分ADSL接入(非对称上下行)的参数(实验环境电信100M ADSL)。
  2. 其它带宽请按比例调整,比如 50M ADSL,把 -sndwnd -rcvwnd 减掉一半。
  3.  
  4. SERVER:   -mtu 1400 -sndwnd 2048 -rcvwnd 2048 -mode fast2
  5. CLIENT:   -mtu 1400 -sndwnd 256 -rcvwnd 2048 -mode fast2 -dscp 46
注意:客户端和服务端的参数 -sndwnd 2048 -rcvwnd 2048 这两个值不要大于你的本地宽带,否则流量消耗会浪费好几倍,100M就是2048,50M就是1024。这两个值可以逐渐调小,但是不能比本地的实际宽带大!
注意:产生大量重传时,一定是窗口偏大了
创建 stop.sh:
  1. vi /root/kcptun/stop.sh
写入以下内容:
  1. #!/bin/bash
  2. PID=`ps -ef | grep server_linux_amd64 | grep -v grep | awk '{print $2}'`
  3. if [ "" != "$PID" ]; then
  4. echo "killing $PID"
  5. kill -9 $PID
  6. else
  7. echo "Kcptun not running!"
  8. fi
注意:这里的 server_linux_amd64 ,自行替换为你的 服务端名称,64位的系统就是示例的这个,如果是32位的则是 server_linux_386 。
创建 restart.sh:
  1. vi /root/kcptun/restart.sh
写入以下内容:
  1. #!/bin/bash
  2. cd /root/kcptun/
  3. echo "Stopping Kcptun..."
  4. bash stop.sh
  5. bash start.sh
  6. echo "Kcptun started."
给上面创建的脚本添加执行权限:
  1. chmod +x /root/kcptun/*.sh
启动服务端:
  1. sh /root/kcptun/start.sh
日志文件在:/root/kcptun/kcptun.log
监听日志信息:
  1. tail -f /root/kcptun/kcptun.log
停止服务端:
  1. sh /root/kcptun/stop.sh
重启服务端:
  1. sh /root/kcptun/restart.sh

添加开机启动:

Centos系统:
  1. chmod +x /etc/rc.d/rc.local && echo "sh /root/kcptun/start.sh" >> /etc/rc.d/rc.local
Ubuntu/Debian系统:
  1. chmod +x /etc/rc.local && echo "sh /root/kcptun/start.sh" >> /etc/rc.local

升级服务端

重复一开始的步骤,下载最新版本的压缩包然后解压覆盖源文件,记得先 停止KCPTUN运行再覆盖。
  1. cd /root/kcptun
  2. # 进入新建的文件夹
  3. wget https://github.com/xtaci/kcptun/releases/download/v20161222/kcptun-linux-amd64-20161222.tar.gz
  4. # 下载最新的 kcptun-linux-amd64 文件
  5. tar -zxvf kcptun-linux-amd64-20161222.tar.gz
  6. # 解压刚才下载的文件

故障排除

  • 客户端和服务器端皆无 stream opened信息。
连接客户端程序的端口设置错误。
  • 客户端有 stream opened信息,服务器端没有。
连接服务器的端口设置错误,或者被防火墙拦截。
  • 客户端服务器皆有 stream opened信息,但无法通信。
上层软件的设定错误。
注意:日志信息在你的客户端或者服务端同目录下的 kcptun.log 中。

注意事项

KcpTun有个缺点,就是实际流量消耗 最少是 你使用量的两倍!如果参数调整有问题,可能会浪费十几倍的流量,而加速幅度也并不会上升多少。

作者的解释:

  • 出现这个情况有几种可能:
  • ISP 对UDP丢包极高,例如50%
  • 服务器,客户端本身的带宽较低,可以适当调低sndwnd /rcvwnd
  • 可以尝试 -dscp 46参数降低丢包率。
希望你们注意一下这个问题,可能搞不好就被 IDC 以滥用网络的名义封VPS了。
-----------------------------------------------------------

小内存福音,Kcptun Shadowsocks加速方案

通过 Finalspeed 加速 Shadowsocks 的教程,大家普遍反映能达到一个非常不错的速度。Finalspeed 虽好,就是内存占用稍高,不适合服务器内存本来就小的用户;而且现在 Finalspeed 停止维护,就需要寻找一个能替代 Finalspeed 的工具。
今天我就给大家介绍这么一个能替代 Finalspeed 的项目 — Kcptun
Kcptun 是一个非常简单和快速的,基于 KCP 协议的 UDP 隧道,它可以将 TCP 流转换为 KCP+UDP 流。而 KCP 是一个快速可靠协议,能以比 TCP 浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。
Kcptun 是 KCP 协议的一个简单应用,可以用于任意 TCP 网络程序的传输承载,以提高网络流畅度,降低掉线情况。由于 Kcptun 使用 Go 语言编写,内存占用低(经测试,在64M内存服务器上稳定运行),而且适用于所有平台,甚至 Arm 平台。
Kcptun 项目地址:https://github.com/xtaci/kcptun
2016.08.31 v20160831发布,新版支持配置文件!
2016.08.29 新的客户端可视化配置工具可选
2016.08.06 添加Kcptun可视化运行工具和Android使用说明。
2016.06.17 添加客户端开机自启批处理,重写软件启动vbs脚本。

相关项目

以下为 Kcptun 的相关项目,如果有兴趣,可以了解一下。
Kcp-server 是在 Kcptun 的基础上,添加了配置文件的支持,并整合了一个socks5代理,可用不用配合其他软件单独使用,而原版 Kcptun 需要配合其他软件使用而不能单独使用。Kcp-server 简化了安装过程,一条命令即可配置完毕。
基于 Shadowsocks Go 版本,加入了以下特性:
  • 启动后降低权限至 nobody , 增强安全性;
  • 与 kcptun 集成,配合相应客户端可加速传输;
  • 网页控制面板。

部署Kcptun


使用了一键安装脚本之后不用再手动配置了,可用通过 supervisor 命令管理 kcptun
本教程以 Linux 64位系统为例。
首先下载 Kcptun,可以到 GitHub 上获取最新版:https://github.com/xtaci/kcptun/releases/latest
登陆服务器,下载 Kcptun 的预编译版:
注:请根据你的系统下载对应版本。32位系统下载 kcptun-linux-386-*.tar.gz,64位系统下载 kcptun-linux-amd64-*.tar.gz
解压之后有两个文件:client_linux_amd64 和 server_linux_amd64,一个用于服务器,一个用于客户端。
这个项目目前还没有 init 脚本,也还不支持配置文件,于是我写了两个简单的 sh 脚本,用于启动和关闭服务端。请在服务端程序相同目录下新建两个文件 start.sh 和 stop.sh。
下面开始创建启动软件所需要用到的一些文件,都是 vi 的基础操作,我不写具体的编辑保存命令了,不会的可以自己搜索一下。
创建 start.sh
写入以下内容:
server_linux_amd64 对应服务端文件名,请对应修改。

创建配置文件:
写入以下内容:
  • listen 表示 Kcptun 的服务端监听端口,用于接收外部请求和发送数据,这里设置为:29900,请选一个你喜欢的端口;
  • target 表示要加速的地址,由于 Kcptun 和 Shadowsocks 在同一服务器,地址填写 127.0.0.1,而 8388 为 Shadowsocks 端口;
  • key 是 Kcptun 的验证密钥,服务端和本地必须一致才能通过验证,请自行设置(可省略)默认:it’s a secrect,这里自定义为了 test;
  • crypt 为加密方式,这里使用了轻量快速的 salsa20;
  • mode 为加速模式,默认 fast,这里使用 fast2;
  • nocomp 为去掉压缩传输,这里设置为 false 表示开启压缩传输;
  • 其他参数的含义请查看帮助。
创建 stop.sh
写入以下内容:
创建 restart.sh
然后可以启动服务端:
/root/kcptun/kcptun.log 为日志信息。
监听日志信息可以使用:
停止服务端请使用:
重启服务端:
添加开机启动:
Centos:
Ubuntu/Debian:
响应速度:
fast3 > [fast2] > fast > normal > default
有效载荷比:
default > normal > fast > [fast2] > fast3
中间 mode 参数比较均衡,总之就是越快越浪费带宽(根据设置,可能会浪费数倍流量),请自行斟酌。推荐模式 fast2。
可用的参数请使用 ./server_linux_amd64 -h 查看:
更深层次的参数调整需要理解 KCP 协议,并通过“隐藏参数”调整。巭孬嫑乱动.
下面是作者给的配置参数样例,适用大部分ADSL接入(非对称上下行)的参数(实验环境电信100M ADSL)。其它带宽请按比例调整,比如 50M ADSL,把 CLIENT 的 -sndwnd -rcvwnd 减掉一半,SERVER 不变。
带宽计算公式:
在不丢包的情况下,有最大-rcvwnd 个数据包在网络上正在向你传输,以平均数据包大小avgsize计算,在任意时刻,有:
network_cap = rcvwnd*avgsize
数据流向你,这个值再除以ping值(rtt),等于最大带宽使用量。
max_bandwidth = network_cap/rtt = rcvwnd*avgsize/rtt
举例,设rcvwnd = 1024, avgsize = 1KB, rtt = 400ms,则:
max_bandwidth = 1024 * 1KB / 400ms = 2.5MB/s ~= 25Mbps
(注:以上计算不包括前向纠错的数据量)
前向纠错是最大带宽量的一个固定比例增加:
max_bandwidth_fec = max_bandwidth*(datashard+parityshard)/datashard
举例,设datashard = 10 , partiyshard = 3,则:
max_bandwidth_fec = max_bandwidth * (10 + 3) /10 = 1.3*max_bandwidth = 1.3 * 25Mbps = 32.5Mbps
看不懂?那就别管它,你只要会简易自我调优方法就够了:
  1. 同时在两端逐步增大 client rcvwnd 和 server sndwnd;
  2. 尝试下载,观察如果带宽利用率(服务器+客户端两端都要观察)接近物理带宽则停止,否则跳转到第一步。
基本原则:SERVER 的发送速率不能超过 ADSL 下行带宽,否则只会浪费您的服务器带宽。
如果你有任何问题,欢迎加入我们的QQ群寻求帮助:43391448

配置客户端

首先下载 Kcptun 的客户端文件。
请注意:客户端版本建议和服务端版本一致,有许多朋友没有检查两端造成无法连接!
Windows 64位:
Mac 64位:
注意:
1.0830以后的版本不和之前的版本兼容,请确保两端使用相同的版本!
2.下面的软件截图仅供选择软件时参考,请不要照着填写里边的参数!
当前,Kcptun 已经有可视化配置工具了,你可以自行选择使用。如果不想用工具,可以往后翻,手动创建启动文件。
1.Kcptun客户端配置管理工具,
2.kcptun-gui-windows,
注意:客户端和服务端参数必须一致的有:
  • datashard
  • parityshard
  • nocomp
  • key
  • crypt

由于 Kcptun是控制台程序,所以我选择使用 vbs 脚本,来达到后台运行的目的。
新建 run.vbs
新建 client-config.json
  • localaddr 为 kcptun 本地客户端运行的端口,为 12948;
  • remoteaddr 服务器 IP 地址 10.10.10.10,Kcptun 服务端口为 29900
  • key 验证密钥,和服务端一致;
  • conn 单线连接;
  • autoexpire 60 表示一分钟之后重新建立连接;
  • 其他参数说明见上面服务端配置的说明。
新建 stop.bat
然后双击 run.vbs 运行程序,使用 stop.bat 来停止程序,kcptun.log 为输出的日志信息。
开机启动配置:
新建 startUp.bat:
上面的配置过程中出现了多个端口.

Shadowsocks客户端配置

在客户端中新建服务器:
  • 服务器 IP 填写本机:127.0.0.1
  • 服务器端口填写:12948
正确填写你的 Shadowsocks 密码,加密方式,协议和混淆方式。
切换到该服务器上,测试是否正确运行。

速度实测

我用的服务器是搬瓦工 512M 内存,费利蒙机房,以此测试加速效果。
  • 按结论看,Kcptun 的加速效果略逊于 Finalspeed,估计需要细调配置。
  • 刚运行 Finalspeed 时,内存占用就达到了 9.1% 也就是接近 47M;而此时 Kcptun 占用 0.4%,也就是 2M左右。
  • YouTube 1440p 满跑情况下,FInalspeed 最高内存占用 15.4%,接近 79M;而此时 Kcptun 占用 3% 左右,即 15.5M。
  • 速度方面,Finalspeed 最大速度达到了10000 Kbps +,Kcptun 6000+ Kbps。
以上结论为本人测试所得,仅作为参考;实际情况请自行测试,如有纰漏,欢迎指出。

多人同时使用

如果想多人使用同一个服务器并同时使用 Kcptun 加速,需要启动多个 Kcptun 进程:
1.你使用的是本站的一键安装脚本,请使用命令:
来添加一个新实例,新 Kcptun 实例使用的端口需要与其他实例不一致。
2.你是自己创建的启动脚本:
为了启动多个 Kcptun 服务端,你可以将 start.sh 拷贝一份,然后修改其中的 Kcptun 运行端口。

在路由器上使用:

如果需要在路由器上使用 Kcptun,首先你得有个智能路由器,然后能正常进入shell。
编译好的客户端文件请到官方下载:https://github.com/xtaci/kcptun/releases
小米路由器、极路由等大部分国产智能路由器都是 MT7620 的芯片,请下载 mipsle 版本。如果运行失败请尝试下载 mips 或者 arm 版。
---------------------------------------------------------------

使用 Kcptun 加速 Shadowsocks

如果希望进一步减少延迟,或者在网络比较差的地方也想流畅使用代理,这篇文章会对你有帮助。笔者亲测可观看 Youtube 2K 视频。

基本思路

使用代理上网,我们发出的网络请求实际上经过了“本地->代理服务器->目标服务器”两段网络请求,后半段发生在外网的网络请求在上一篇文章中已经介绍过可以通过开启增强版 BBR 增加代理稳定性,这篇文章里讲到的 Kcptun 用法目标则是为了以牺牲一定带宽的方式,降低本地到代理服务器这段网络请求的延迟,以提高上网速度。

实现原理——Kcptun 介绍

Kcptun 是一个非常简单和快速的,基于 KCP 协议的 UDP 隧道,它可以将 TCP 流转换为 KCP+UDP 流。计算机网络课上我们学过,七层网络结构中运输层的 UDP 是一个无连接、尽最大努力的数据传输服务,优点是交付效率高、速度快;缺点是不提供可靠交付,而 KCP 是一个快速可靠协议,以选择性重复发包的方式,能以比 TCP 浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。

搭建 Kcptun

那么,这么好的工具,该怎么用呢?
Kcptun 的安装比较繁琐,万幸的是有人写成了自动安装脚本,包含了常用设置和开机自启的配置,以搭建的 Shadowsocks 为基础,简要介绍一下搭建过程,完整版可见脚本作者博客
登录你的 Shadowsocks 服务器,运行:
wget --no-check-certificate https://github.com/kuoruan/shell-scripts/raw/master/kcptun/kcptun.sh # 下载脚本
chmod +x ./kcptun.sh     # 添加执行权限
./kcptun.sh              # 运行安装
最后一个命令运行的是一个带交互功能的命令工具,除了“需要加速的端口”和“Kcptun 密码”需要自己定义,其他所有提示都可以直接回车使用默认值,脚本运行完后,把“可使用的客户端配置文件”复制下来,保存到本地,命名为 config.json 文件,并记录下服务器版本(如20171201),在启动客户端的时候会用到。
检查时候运行成功:
service supervisord status    # 服务管理服务是否正常运行
supervisorctl status kcptun   # kcptun 是否正常运行
查看状态分别是 Active和 running则说明安装成功。

客户端配置

以命令行的代理为例,加上 Tcptun 后,一次命令行请求的顺序就变成了:proxychains -> ss-agent -> kcptun-agent -> kcptunu-server -> ss-server,也就是说 GoAgent 配置的 ss-agent 不再转发到远程的 ss-server 服务器地址,而是指向本地的 kcptun 监听的地址(127.0.0.1:<监听端口>),而 kcptun-agent 服务则需要知道远程的kcptun-server 的地址和端口。kcptun-agent 的配置不需要亲自操心,已经在服务器 Setup 后记录的 config.json 文件中了,因此客户端的操作是:

第一步:客户端 Kcptun 配置

在 https://github.com/xtaci/kcptun/releases 找到对应服务器版本(在安装完成后显示)的客户端版本(darwin是给 OSX 的),下载并解压,我们只需要client_darwin_amd64.sh这一个文件,在客户端执行:
./client_darwin_amd64.sh -c config.json
看到日志输出 connection: ...则说明连接成功,这个时候在服务器端运行之前用于安装 kcptun 的脚步也应该能看到客户端连上的信息:
./kcptun.sh log

第二步:客户端 GoAgentX 配置

将 GoAgentX 中原有配置的 ServerAdress 改成 127.0.0.1,并把 ServerProt 设置为 config.jsonlocaladdr所指的端口即可。
正如上文所说,现在 Shadowsocks 的服务器地址由 Kcptun 记录,ss-agent 只需要指向 Kcptun 的客户端进程即可;其他所有配置,包括 proxychains 和 SwitchyOmega 都不需要变更。这个时候再用代理上网的时候就可以看到 Kcptun 有数据流开闭的日志,说明 Kcptun 启用成功!
--------------------------------------------------------------------------------------------------------

用 kcptun 加速 Shadowsocks


查了下有没有办法优化,然后发现了 kcptun 这个神奇的玩意。

虽然看上去调参数挺复杂的,不过抱着尝试的心态,我就先用普通的设置把它先跑起来吧。
于是在下载页找了个最新版本的,从网上抄了个配置文件, 把「target」设为 Shadowsocks 的地址(Shadowsocks 的「server」配置也可以从「::」改成「127.0.0.1」,因为不需要对外暴露了),然后用 server_linux_amd64 -c kcptun.json 就跑起来了。
由于我是直接用路由器来翻墙,就不需要装客户端了。打开梅林小宝固件的 Shadowsocks 配置页,勾上「启用KCP协议」,填上「KCP端口」,并在「KCP参数」里填上和服务器配置一致的 key、crypt、datashard、parityshard 和 nocomp。
提交后再打开 Youtube,速度已经提升到 2000 Kbps 了,看 720P 也没压力了。

接下来就调下参数吧。
我把 ping 包的大小改成了 1350 字节(和默认的 MTU 值一样),然后测试丢包率,发现在晚上的高峰时期也只有 4% 左右。又看了下 SNMP 信息,发现 FECRecovered 和 FECErrs 都是 0,于是猜测不需要前向纠错,便把 datashard 和 parityshard 设为了 0。这下再打开 Youtube,速度变成了 5000 KBps,下载搬瓦工的测试文件也到了 1.2 MB/s。
然后慢慢调整窗口大小(rcvwnd 和 sndwnd),从 256 慢慢增加到 1024,Youtube 能到 10000 Kbps,可以流畅看 1440P(勉强能看 4K 的视频,但是我的 CPU 和显卡扛不住),下载搬瓦工的测试文件也到了 2 MB/s。因为家里的网络就是 20 M 的,差不多也到上限了,就懒得再调整别的了。
不过又看了眼路由器的 CPU 占用率,还是比较高的。于是又把 Shadowsocks 的加密算法改成了 chacha20,kcptun 设为 salsa20,这两种算法在 ARM 设备上比较快。此外,互联网上绝大部分的东西都压缩过,所以没必要再用 kcptun 压缩一次,加上 nocomp 参数也是可以的。
其实据我测试,最重要的参数是 nc(关闭拥塞控制),如果不关闭的话,基本没有加速效果,所以预置的几种模式都把它的值设为了 1。

最后,如果觉得麻烦的话,可以用 kcp-server 来安装。不过这个脚本是用 socks5 代理取代了 Shadowsocks,安全性方面可能有些隐患,但是速度可能会更快些。
-------------------------------

使用Kcptun时,如何突破运营商限制?
由于 Kcptun 是基于 UDP 协议,使用时产生的巨大 UDP 流量可能会被网络运营商判定为异常而造成无法正常使用,有效的解决方案就是伪装流量。
在这个 Issue 中,@linhua55 提到了 udp2raw-tunnel 这个工具:
A Tunnel which turns UDP Traffic into Encrypted UDP/FakeTCP/ICMP Traffic by using Raw Socket,helps you Bypass UDP FireWalls(or Unstable UDP Environment).It can defend Replay-Attack and supports Multiplexing.It aslo acts as a Connection Stablizer.
udp2raw-tunnel 将 UDP 流量加密,并可以伪装为 TCP 流量,能有效解决 QoS 限制,但是使用的时候需要同时运行 Kcptun 和 udp2raw-tunnel 客户端,再加上 SS,就是三个客户端了,使用维护都不太方便。
前两天,@hhmob 提到了 kcpraw — 一个 Kcptun 的 Fork ( Issue )
Kcpraw 也是将 UDP 流量伪装为 TCP 流量,它支持混淆,而且还内置了代理和 SS Go,也就是使用的时候只需要运行一个客户端,连 SS 客户端都省了,有兴趣可以试试。
-----------------------------------------------------------------

https://github.com/loveuall/kcptun
https://github.com/kcptunsocks/kcptun
https://github.com/kcptunsocks/kcptun/tree/router
https://github.com/linhua55/some_kcptun_tools/tree/master/udpRelay
-------------

related posts:
https://briteming.blogspot.com/2018/01/kcptun-rawudp-qoskcptun.html
https://briteming.blogspot.com/2020/01/vpskcptunvpstcp.html