Total Pageviews

Sunday, 8 May 2016

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

首先登陆你的linux vps.
mkdir kcptun
cd kcptun
wget https://github.com/xtaci/kcptun/releases/download/v20160507/kcptun-linux-amd64-20160507.tar.gz
tar zxvf kcptun-linux-amd64-20160507.tar.gz
root@kvm:~/kcptun# ls
kcptun-linux-amd64-20160507.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:
   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
  
root@kvm:~/kcptun#  nohup ./server_linux_amd64 -l 0.0.0.0:29900 -t 127.0.0.1:20080 --key your_key --tuncrypt > /dev/null &
(此命令的意思是程序server_linux_amd64监听服务器上的端口29900,在收到连接端口29900的请求后,转发到同台机器的20080端口。同台机器的20080端口上运行的是一个socks代理服务器程序-mocks.搭建mocks,参见http://briteming.blogspot.com/2012/02/socks-server-mocks.html,
--tuncrypt的意思是对隧道进行加密。这里的端口29900可改为其他未被占用的端口号)
这样服务器端就运行起来了。

在客户端机器上。
因为我的 客户端机器为mac,于是下载客户端程序的mac版:
wget https://github.com/xtaci/kcptun/releases/download/v20160507/kcptun-darwin-amd64-20160507.tar.gz
tar zxvf kcptun-darwin-amd64-20160507.tar.gz
cd kcptun-darwin-amd64-20160507
yudeMacBook-Air:kcptun-darwin-amd64-20160507 brite$ ls
client_darwin_amd64 server_darwin_amd64
yudeMacBook-Air:kcptun-darwin-amd64-20160507 brite$ rm -rf server_darwin_amd64
yudeMacBook-Air:kcptun-darwin-amd64-20160507 brite$ ls
client_darwin_amd64
yudeMacBook-Air:kcptun-darwin-amd64-20160507 brite$
yudeMacBook-Air:kcptun-darwin-amd64-20160507 brite$ ./client_darwin_amd64 -h

USAGE:
   ./client_darwin_amd64 [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
  
yudeMacBook-Air:kcptun-darwin-amd64-20160507 brite$ nohup ./client_darwin_amd64 -l 0.0.0.0:12948 --remoteaddr your_vps_ip:29900 --key your_key --tuncrypt > /dev/null &
(此命令的意思是客户端程序client_darwin_amd64监听本地机器的12948端口,在收到连接12948端口的请求后,把请求转发到你的vps的29900端口。这里的key的值必须跟服务器上所设置的key的值一致。--tuncrypt表示对隧道进行加密。这里的12948端口可改为其他未被占用的端口号)
这样客户端就运行起来了。

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

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

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翻墙。

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

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 上获取最新版:小内存福音,Kcptun + Shadowsocks加速方案 - 第2张  | 扩软博客
用 Xshell 或者 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。

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