自从FS废了以后,老高一直在寻找一个替代品,直到发现了kcptun,老高的搬瓦工又迎来了第二春。
其他工具
下载
项目主页,通过源码我们可以看到它使用了GO语言编写。
发布地址,在对应的平台直接复制链接,然后下面的运行命令即可下载,并解压
[ -d ~/kcptun ] || mkdir ~/kcptun && cd ~/kcptun
wget https://github.com/xtaci/kcptun/releases/download/v20161202/kcptun-linux-amd64-20161202.tar.gz
tar zxf kcptun-linux-amd64-20161202.tar.gz && rm kcptun-linux-amd64-20161202.tar.gz
此时,我们会得到两个文件,我们需要在服务器和客户端都下载好这个文件!
服务器端(Linux)
➜ ls
client_linux_amd64 server_linux_amd64
客户端(macOS)
➜ ls
client_darwin_amd64 server_darwin_amd64
原理
运行前我们先结合下图熟悉一下它的原理,说白了就是将之前shadowsocks的数据流又做了一次代理,让流量跑在更快的UDP协议上!
也就是说我们需要在kcptun的服务器端指定当前shadowsocks服务器的端口,然后在将其代理为一个新的端口。
在客户端,我们也需要运行kcptun,但是我们直接连接的还是原本的shadowsocks客户端,但是我们需要将原客户端的服务器IP改为本地服务器的IP,一般为127.0.0.1,端口改为本地kcptun的服务端口。而kcptun的客户端只需要知道kcptun服务器的IP和地址即可!
需要注意的是对于shadowsocks的服务器来说,可以想象kcptun是不存在的,所以其加密方式是对应的,如果原来用的aes和phpgao作为加密方式和密码,现在的也不需要变化,需要变化的只是服务器的IP和端口。
聪明的你肯定已经想到了,kcptun的服务端与客户端之间也有自己的认证与加密方式,其二者也是对应的。
运行
是时候动手了!
假设
shadowsocks服务加密方式为: rc4-md5
kcptun的服务加密方式为: aes(不指定时默认)
shadowsocks服务器IP地址为: 123.321.123.123
shadowsocks服务器端口号为: 3306
shadowsocks客户端IP地址为: 127.0.0.1
shadowsocks客户端端口号为: 1080
kcptun的服务器端口号为: 4001
kcptun的客户端端口号为: 1070
服务端
./server_linux_amd64 -t "127.0.0.1:3306" -l ":4001" -mode fast2
客户端
./client_darwin_amd64 -r "123.321.123.123:4001" -l ":1070" -mode fast2
然后新建本地shadowsocks客户端的服务器配置为⤵️
以上我们就完成了最简单的配置,现在可以在chrome里配置代理为SOCKS5,IP为127.0.0.1,端口号为1080。
ps. 如果总是出现
getsockopt: connection refused
错误,很有可能是弄错了端口信息!
更多
如果想更便捷的使用kcptun,我们可以这样做。
配置化
kcpdump支持指定配置文件config.json,与shadowsocks类似。
服务器端
# 在服务器端保存为server.json
{
"listen": ":4001",
"target": "127.0.0.1:3306",
"key": "tester",
"crypt": "aes-192",
"mode": "fast2"
}
服务器端执行命令
./server_linux_amd64 -c config.json
客户端
# 在客户端保存为client.json
{
"localaddr": ":1070",
"remoteaddr": "123.321.123.123:4001",
"key": "tester",
"crypt": "aes-192",
"mode": "fast2"
}
客户端端执行命令
./client_darwin_amd64 -c config.json
开机启动
vi /etc/rc.local
# 服务器端
nohup /path/to/server_linux_amd64 -c /path/to/server.json >/dev/null 2>&1 &
# 客户端
nohup /path/to/client_darwin_amd64 -c /path/to/client.json >/dev/null 2>&1 &