udp2raw-tunnel

最近几天,那个墙好像变高了,导致很多服务器用不了了,我运气不错,服务器ip没有被封,不过出现了一个小小的问题,就是之前我说的用kcptun加速服务器有时候会失败,我折腾了好一段时间也没有解决的办法,后来看pull request里面好像有人提到了udp干扰的问题,所以udp2raw-tunnel就是用来解决这个问题.

  1. 先简单介绍下这个东西,udp2raw tunnel,通过raw socket给UDP包加上TCP或ICMP header,进而绕过UDP屏蔽或QoS,或在UDP不稳定的环境下提升稳定性。可以有效防止在使用kcptun或者finalspeed的情况下udp端口被运营商限速。支持心跳保活、自动重连,重连后会恢复上次连接,在底层掉线的情况下可以保持上层不掉线。同时有加密、防重放攻击、信道复用的功能。

  2. 这个的原理大概就是在udp包的上加上tcp的包头,让路由器不会认为这是一个udp的包,udp的包似乎很容易被针对,之前kcptun就有这个问题,速度没有受到影响,但是连接很容易就断掉了,需要重新连接,还是挺麻烦的.


    udp2raw-tunnel_第1张图片
    image.png
  3. 上图是大概的工作原理,看图不难理解,我们运行在pc上的代理软件将我们的流量通过某个端口先给kcptun,产生udp流量,但是udp流量容易受到干扰,所以我们先将udp流量给udp2raw-tunnel,再由udp2raw-tunnel来将流量伪装为tcp流量再转发给服务器,服务器端也需要运行udp2raw-tunnel,它接收到伪装的tcp流量,然后解密校验之后来获得原来的udp流量,然后kcptun接收udp流量了,通过处理之后将信息发送给服务器代理软件的接收端,代理软件再将我们的流量(往往是一些请求)发送到本来不能被访问的服务器(油管之类的),然后获得响应,用与原来相反的方向将信息发送回来.

  4. 我们理解了大致的工作原理之后就能使用了,我们需要一个代理软件纸飞机,然后呢,需要kcptun,然后需要udp2raw-tunnel,下面开始是我折腾了小一会的结果:

    • 首先我们从本地开始,纸飞机的代理要开的,我们的服务器地址是127.0.0.1,这个是我们本机的ip地址,因为这些流量是要先发给kcptun的,服务器端口就写kcptun client在本地监听的端口,比如监听了12321端口,那么我们纸飞机的服务器端口就是12321,不过需要注意的是,纸飞机的密码还是纸飞机的密码,这个和kcptun还有udp2raw-tunnel都没有关系,这个密码是用来纸飞机用来校验解密的.
    • 然后是kcptun了,我大概说一下参数,首先监听的本地端口是12321,上面说过了,然后是服务器地址,注意这里服务器地址需要改为127.0.0.1,因为我们需要将kcptun的流量转发给udp2raw-tunnel,这里kcptun的服务器端口就是我们udp2raw-tunnel client在本地监听的端口,假设是8888吧.值得注意的是,那个mtu参数需要改为1300或者更小(默认是1350),mtu是最大传输单元的英文缩写,这个太大了好像是会导致服务器无法处理等情况,不同协议对mtu的规定也不一样,例如ip协议就规定mtu最大为1500,不过从我个人的使用感觉来看,mtu太小了会影响网速,所以1200左右就差不多了,也不要太小.
    • 然后是本地的udp2raw-tunnel,这里本地的监听地址是-l0.0.0.0:8888,然后是服务器地址就是:我们的服务器地址:我们运行在服务器上的udp2raw-tunnel监听的端口.假设地址为45.66.77.88,端口为8855,参数就是-r45.66.77.88:8855.不过需要注意的是这个应用的使用最好需要root权限,使用起来会方便一点.
    • 然后是服务器端的udp2raw-tunnel,这个的参数实际上就是本地的逆过程,监听本地的8855端口,也就是-l0.0.0.0:8855,然后是-r 127.0.0.1:4000,这里是将流量转发给服务器端的kcptun,4000是kcptun的监听端口.
      最后是kcptun了,在上一步我们已经知道了kcptun的本地监听端口是4000,所以参数中-l :4000,然后服务器地址是127.0.0.1,因为kcptun将流量再转发给纸飞机,目标端口就是纸飞机监听的端口号.注意这里也要设置mtu,kcptun两边mtu最好保持一样.
      到这里就差不多了,这里纸飞机的代理不是我们需要管的东西.我们只需要端口,密码还有加密方式就OK了.
  5. 这里贴下udp2raw-tunnel的github地址:[udp2raw]
    [udp2raw]: https://github.com/wangyu-/udp2raw-tunnel. 文档里面也有教程,不过我觉得我写的更容易理解一点.

结语:到这里就写的差不多了,不得不感慨通信是个非常有用的东西,网络通信是非常需要我们基础知识的领域,我们十分应该多学点这方面的知识.
附录:实际使用的一些参数


udp2raw-tunnel_第2张图片
image.png

kcptun:

./client_linux_amd64 -l ":12321" -r "127.0.0.1:8888" -key "xxxxxx" -mode "fast2" -crypt "aes-128" -mtu 1200 -nocomp "false" > kcptun.log 2>&1 &

udp2raw-tunnel:

./udp2raw_amd64 -c -r45.66.77.88:8855 -l0.0.0.0:8888 --raw-mode fakekcp -a -k"passwd"

服务器端:
udp2raw-tunnel:

./udp2raw_amd64 -s -l0.0.0.0:8855 -r 127.0.0.1:4000 -k "passwd" --raw-mode fakekcp -a

kcptun:

./client_linux_amd64 -l ":4000" -r "127.0.0.1:22" -key "xxxxxx" -mode "fast2" -crypt "aes-128" -mtu 1200 -nocomp "false" > kcptun.log 2>&1 &

你可能感兴趣的:(udp2raw-tunnel)