类库大魔王
类库大魔王 懒惰,傲慢,以及无耐心

Avege WIP(二)

经过大半个月的折腾,兼容SSR混淆和协议的坑终于填上了,目前混淆支持plain、http_simple、http_post、random_head、tls1.2_ticket_auth几种,协议支持origin、verify_sha1即原版SS的One Time Auth、auth_sha1_v4、auth_aes128_md5、auth_aes128_sha1几种。

总的说来这些混淆和协议的实现逻辑都是比较简单的,不过中间不少细节要非常仔细和小心。比如这几天发现auth_sha1_v4往往在下载了几十MB数据时会出现checksum校验出错的情况,直到今天copy了libev版的实现流程,才能正常工作,后来问了 @breakwa11 才搞明白,在计算checksum时用了uint32当中间变量会溢出!而C#版实现时用的ulong是64位的所以不存在这问题,libev版用了uint32后是分块计算的,所以也没问题!


加了个绑定指定IP作为出口的功能,是出于这样一个目的:屋里拉了电信的宽带,前不久买了个联通的日租卡,然后就想着是否可以尽量发挥两者的作用。电信的出国带宽是众所周知的不好,虽然我已经买了喵帕斯家的服务,这个问题基本上不存在了,但联通的出国带宽又是众所周知的比电信好,所以理所当然的想到国内地址都通过电信走,国外地址统一从联通线路走代理。要实现这个目标其实应该有很多现成的办法,比如像chnroutes那样,先把所有路由都设置到联通线路,然后把国内IP的路由设置到电信上。不过不同平台的实现总是有差别,放在avege中使用统一的方法也是不错的,只要在配置文件中写好IP地址段,比如192.168.77.0/24这样,avege从当前系统中所有IP选第一个匹配的,假设192.168.77.100绑定,再连接shadowsocks服务器即可。


之后Avege还有几个比较大的坑要填:

  • UDP转发。原版和SSR的实现不同,据我观察下来原版是直接UDP转发,而SSR据 @glzjin 的说法是UDP over TCP的方式。两种方式各有优缺点,前者latency小,适合游戏之类的场景,但可靠性不保证,后者latency大,但可靠性好。目前各个提供SS服务的商家以SSR的后端为多,所以应该是后者的需求更大, 而SSR for Android的内核是libev版修改而来,UDP转发部分并没有修改成over TCP的方式,所以并不能用来跟SSR商家的服务配合使用。据 @glzjin 说他想试试把libev版改一下,或者干脆把Android版的核心换一个,比如换我的Go版本的,只要UDP转发能兼容SSR后端。
  • IPv6支持。其实并不是那么迫切,只是觉得目前勉强有IPv6的出口了,不兼容不舒服斯基。
  • TCP Fast Open支持。在3.7以上版本kernel的Linux上,开启TCP Fast Open支持可以减少客户端与服务器端连接的时间。但我的需求并不是那么迫切,因为屋里用来当路由器的Banana Pi装的Raspbian内核版本并不达标,所以我其实用不上,有点忧伤。
  • 基于tun的系统级代理。其实就是tun2socks的Go实现,目前代码已经有了,但如何配置让它工作起来还得研究一下。主要是为了在没有翻墙路由器的情况下,我觉得系统级透明代理体验会更好,在Windows和Mac上的需求最为强烈,Linux上用iptables实现NAT配合redir模式已经可以达到类似的使用体验。
  • 基于URL pattern的过滤功能。主要是过滤广告,电脑上的浏览器可以通过插件把大部分广告屏蔽掉,手机上就没这福利,所以要在路由器上解决。但有个限制是只对http内容能进行过滤,https内容仅能对域名进行过滤。
  • 支持ipfw/pf/fw等防火墙。跟redsocks那样,Linux上是iptables,而Mac或其他BSD系统就是其他的防火墙了,如果基于tun的系统级代理实现得好,这个的需求就很弱了。暂且写在这里吧。

顺便,我想把avege开源出去了,就这周末吧,把一些不相关代码留下,仅能编译出avege的代码到github上放一份。

感觉本文不错,不妨小额鼓励我一下!
支付宝扫一扫

支付宝扫一扫

微信扫一扫

微信扫一扫

如果你看不到评论框,说明Disqus被墙了。