通过KCP协议加速上网
情况
有一台境外的VPS(以下简称A-VPS)和一台大陆的VPS(以下简称B-VPS)。A-VPS提供SS和Anyconnect等上网服务,B-VPS通过Haproxy复用端口并提供科X学上网中转(启用锐速),用于直连A不佳的区域。
中继服务器B-VPS平时基本上可以跑满带宽,延迟在50ms左右,但是傍晚时间和偶尔会出现A-VPS和B-VPS之间出现连接不稳定和丢包的问题,延迟飙升,体验糟糕。
KCP协议
由于网络质量是一个很复杂的问题,在国内由于众所周知的原因,网络质量的体验更像是一个玄学问题。
无意之中发现了一个有意思的KCP协议,据其开发者描述,“KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,以 callback的方式提供给 KCP”,刚好有一个现成的狗洞项目实现,于是就想想可以在A-B之间这段用这KCP协议来试试。
事实证明启用之后延迟降低,带宽峰值影响不大,相对于直接Haproxy转发来说效果相当不错!
中继设置步骤
1.A-VPS设置
打开一个狗洞远端端口,监听3389端口,接受所有的操作,启用加密并把密钥设置成yourpassword:
./dtunnel_lite -service 0.0.0.0:3389 -action "" -xor yourpassword &
用iptables打开相应端口:
iptables -A INPUT -p udp -m tcp --dport 3389 -j ACCEPT
iptables -A INPUT -p tcp -m tcp --dport 3389 -j ACCEPT
2.B-VPS设置
编译ss,添加一个用户,然后启动ss-server(监听1234端口,密码为password):
git clone https://github.com/madeye/shadowsocks-libev.git
cd shadowsocks-libev
./configure && make && make install
adduser --no-create-home shadowsocks
/usr/local/bin/ss-server -a shadowsocks -s 0.0.0.0 -t 600 -p 1234 -k password -m rc4-md5 -f /var/run/ss.pid
打开一个透明代理模式的狗洞近端,监听本地8888端口,开启10线程,设置密钥与远端相同(x.x.x.x为A-VPS的IP地址):
./dtunnel_lite -service x.x.x.x:3389 -action route -encrypt -xor yourpassword -local :8888 -pipe 10
设置iptables,设置转发并打开相应端口:
iptables -t nat -A OUTPUT -p tcp -m owner --uid-owner shadowsocks -j REDIRECT --to-port 8888
iptables -A INPUT -p tcp -m tcp --dport 1234 -j ACCEPT
至此,一个端口为1234的SS转狗洞科学上网服务就完成了。
更优雅的做法
上面用的方法是将SS服务端部署在中继服务器上,通过透明代理连接A-VPS。如果有多台中继服务器像上面那样做就很麻烦,所以可以将SS服务端部署到A-VPS上,再通过狗洞的端口映射功能将SS端口映射到中继服务器上。在B-VPS上设置(x.x.x.x为A-VPS的IP地址,假设A-VPS上的SS端口为80):
/root/soft/dtunnel_lite -service x.x.x.x:3389 -v -action x.x.x.x:80 -encrypt -xor yourpassword -local :1234 -pipe 10
同样可以实现一个端口为1234的SS科X学上网服务,并且可以轻松地将Anyconnect也映射到中继服务器上去。
顺便提一下,在iptables中现在推荐用 -m conntrack来代替-m state ,最后推荐一个iOS的APP:shadowrocket,虽然还有很多小问题没解决,但是没赶上Surge的同学这次别再错过了。
「倘若有所帮助,不妨酌情赞赏!」
感谢您的支持!
使用微信扫描二维码完成支付
用来 流量很恐怖, 还是BBR吧
dog-tunnel 和 kcptun哪个好用?
3389端口是干啥的?
@wx2020
正常3389端口是RDP协议用的(Windows的远程桌面),我这里是随机取的。
你好,请问启动之后延迟降低了多少呢?有对比过数据吗?
wingy
wingy
教程需要更新了,新代码编译出来的文件是 dtunnel 和 dtunnel_s
2333 不怕查水表么
博客主题不错,有material design的风格
请问只有一台国外ss vps能行吗 直接在那个服务器上装kcp—server?
windows端用ss—go ?
@vizo
如果直连国外KCP Server的话,客户端直接用KCP Client就好,弄一台国内服务器开启SS中转只是为了方便全平台。毕竟KCP Client的移动端支持还不那么好。
我输入命令后出现no file or no direction 是怎么回事
@sn6727
这个提示就是字面意思,没有找到文件或路径,你要在dtunnel所在的目录执行,并且精简版和完整版的文件名是不一样的。
用了狗洞,最后效果如何?我最近正在试finalspeed,国内翻墙提速效果很明显。
@chronos
用几天了,直观感觉效果不错,尤其是在傍晚高峰期,体验好多了。