Holmesian Blog

通过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的同学这次别再错过了。

当前页面是本站的「Google AMP」版。查看和发表评论请点击:完整版 »