通过KCP协议加速科学上网


情况

有一台境外的VPS(以下简称A-VPS)和一台大陆的VPS(以下简称B-VPS)。A-VPS提供SS和Anyconnect等科学上网服务,B-VPS通过Haproxy复用端口并提供科学上网中转(启用锐速),用于直连A不佳的区域。

中继服务器B-VPS平时基本上可以跑满带宽,延迟在50ms左右,但是傍晚时间和偶尔会出现A-VPS和B-VPS之间出现连接不稳定和丢包的问题,延迟飙升,体验糟糕。

KCP协议

由于网络质量是一个很复杂的问题,在国内由于众所周知的原因,网络质量的体验更像是一个玄学问题。

无意之中发现了一个有意思的KCP协议,据其开发者描述,“KCP是一个快速可靠协议,能以比 TCP浪费10%-20%的带宽的代价,换取平均延迟降低 30%-40%,且最大延迟降低三倍的传输效果。纯算法实现,并不负责底层协议(如UDP)的收发,需要使用者自己定义下层数据包的发送方式,以 callback的方式提供给 KCP”,刚好有一个现成的狗洞项目实现,于是就想想可以在A-B之间这段用这KCP协议来试试。

事实证明启用之后延迟降低,带宽峰值影响不大,相对于直接Haproxy转发来说效果相当不错!

timg.jpg

中继设置步骤

I. 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

II. 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科学上网服务,并且可以轻松地将Anyconnect也映射到中继服务器上去。

顺便提一下,在iptables中现在推荐用 -m conntrack来代替-m state ,最后推荐一个iOS的APP:shadowrocket,虽然还有很多小问题没解决,但是没赶上Surge的同学这次别再错过了。


「倘若有所帮助,不妨酌情赞赏!」

Holmesian

感谢您的支持!

使用微信扫描二维码完成支付

发表新评论
已有 15 条评论
  1. cosgody

    dog-tunnel 和 kcptun哪个好用?

    cosgody 回复
  2. wx2020

    3389端口是干啥的?

    wx2020 回复
    1. Holmesian

      @wx2020

      正常3389端口是RDP协议用的(Windows的远程桌面),我这里是随机取的。

      Holmesian 回复
  3. yoman

    你好,请问启动之后延迟降低了多少呢?有对比过数据吗?

    yoman 回复
  4. water

    wingy

    water 回复
  5. water

    wingy

    water 回复
  6. qcwd

    教程需要更新了,新代码编译出来的文件是 dtunnel 和 dtunnel_s

    qcwd 回复
  7. liwanglin12

    2333 不怕查水表么

    liwanglin12 回复
  8. faywong

    博客主题不错,有material design的风格

    faywong 回复
  9. vizo

    请问只有一台国外ss vps能行吗 直接在那个服务器上装kcp—server?
    windows端用ss—go ?

    vizo 回复
    1. Holmesian

      @vizo

      如果直连国外KCP Server的话,客户端直接用KCP Client就好,弄一台国内服务器开启SS中转只是为了方便全平台。毕竟KCP Client的移动端支持还不那么好。

      Holmesian 回复
  10. sn6727

    我输入命令后出现no file or no direction 是怎么回事

    sn6727 回复
    1. Holmesian

      @sn6727

      这个提示就是字面意思,没有找到文件或路径,你要在dtunnel所在的目录执行,并且精简版和完整版的文件名是不一样的。

      Holmesian 回复
  11. chronos

    用了狗洞,最后效果如何?我最近正在试finalspeed,国内翻墙提速效果很明显。

    chronos 回复
    1. holmesian

      @chronos

      用几天了,直观感觉效果不错,尤其是在傍晚高峰期,体验好多了。

      holmesian 回复