• 希望你能勇敢追求自由,去成为海贼王。

2021年8月29日星期日

flyover

    说下,我只是从路边捡到的一个U盘里面看到的,然后觉得有点意思,就写到这里。

    flyover也是说个人对于相关工具的探索暂时告一段乱。

1. 工具和机制

    用过的工具:

  1. VPN, 包括赛风,自由门,蓝灯,无界等。
  2. openvpn,vpngate。
  3. tor,I2P。
  4. ss,ssr等。
  5. v2ray,trojan。
    某博客博主之前也科普过,各种的工具,不同的方案的基本原理。
    本质上来讲,就是代理两个字,本来要访问a,把请求发给b,由b代为访问a,然后把回应发给你。实际略有不同:
  •     vpn是跟服务器进行协商,完成以后,需要建虚拟的网卡,然后分配IP地址,本机再创建不同的路由表,比如在windows上面,route print就可以看到vpn所创建的新的路由标签。
  •     代理软件,就是通过sock代理或者http代理,将流量发给代理的端口,然后该端口后面的程序进行处理,这个程序就是本地安卓的客户端,然后客户端通过其他协议将流量发到服务端进行处理等。
    从攻防来说,就是你要隐藏自己的特征,然后对手去看你的特征,然后进行针对性的中断或者和降速,或者DNS污染等,总之让你用不了,或者用得半死不活。
    VPN的应用,因为需要先要客户端和服务端协商,然后协商完成以后才能开始启动路由代理,这个协商过程的流量特征太明显,已经基本都挂了。
    tor是洋葱路由,匿名化,然后还可以访问暗网,但是因为入口节点有限,直接把IP全封掉就game over。I2P和tor类似,但是I2P实在太慢,基本无法正常使用。
    自由门,蓝灯,无界等,没有怎么研究,都是不开源的程序,用起来有风险。比如老王VPN,基本已经确定后面是被监控和审查的。
    ss的作者已经被叫去喝茶,后将github上面的代码都删了,后有SSR和SSRR.
    v2ray的作者消失,然后就产生了v2fly和xray两个分支,以及相同理念产生的trojan。

2. vless和trojan协议,以及回落分流

    现在是2021年,这场攻防战也打了十几年了,或者不止。2021年的网络环境,https已经基本比较普及了,https也就是http over tls,加密方案是tls。大隐隐于市,如果代理的方案本身从客户端发到服务端的协议本身就是https的,而且如果其他人去直接访问这个服务器的域名,能得到正常的网站应答,打开发现就是个网站,那是不是完美的隐身?

    基于v2fly的v2ray,是一个代理方案,客户端和服务端配置一样,都是配置json文件,支持的协议广泛,最初是内置的vmess,但是看了下基础协议应该也是已经被攻破了,需要配置AEAD加密,而且时间同步要求严格。所以选择了vless协议,当然也可以用trojan协议,可配合传输流的TLS,实现完美的TLS加密传输,同时支持回落分流。

    这里涉及的技术:

  • TLS加密。
  • 回落分流
    TLS的加密,需要进行域名的申请或者购买,DNS的分配,以及HTTPS证书的申请,都有免费的方案,可以用certbot,也可用letsencrypt,甚至直接用cloudflare分配。
    回落分流部分,可以用nginx来进行分流,基于path,判断协议,进行proxy_pass将代理的流量转发给v2ray来处理。
    也可以用vless或者trojan自己的配置进行分流回落。回落的原理是进行判断,如果uuid可以认为是密码认证不通过,协议对不上等,就默认回落给web服务器进行处理,同时可以配置多个回落规则,根据path回落给不同的协议进行处理。
    官方测试是vless自己的回落分流比nginx代理性能要强。

3.WS+CDN。

    这里说下WS配合CDN的目的。客户端要跟服务端建立连接,如果CDN进行了代理的话,DNS解析出来域名是CDN的IP地址,这样客户端相当于直接向CDN的IP建立链接,然后CDN再跟实际的服务端建立链接,保护了服务端的真实IP地址。

    使用WS传输协议的目的,是方便的通过CDN,其他方案应该是无法通过。特别是性能强悍的XTLS。

    VLESS+XTLS号称终极解决方案,但是无法被CDN解密,也就无法通过CDN。

    XTLS的目的是效率,CDN的目的是隐形,当然目标也是不一样的。

4.依然浆糊

    依然没弄太明白的东西还是有的。

  • 安卓上面现在的代理软件也是用得VPN模式,这个VPN模式其实并不是VPN,因为没有虚拟网卡之类的,那么这个VPN的原理是啥?
  • cloudflare只能让ws方式通过,是因为cloudflare需要把协议完全解密,然后发现是ws才给代理,其他方式就不给代理吗?那么cloudflare还可以代理啥协议?
  • 说vmess如果进行DNS处理,是udp over tcp,vmess代理udp的难度和问题是什么?
  • nginx的SNI分流的使用?updateam的配置?
  • vless+tls然后回落到ws+tls,如何通过cloudflare,流向是啥样的?
  • vless回落分流的alpn,都是http的协议版本?是基于http的版本分流吗?
  • vless的首包长度分流是啥?

2021年8月18日星期三

RIME输入法的字库自动同步(windows和安卓)

     对于商业软件,我有种天然的抗拒,虽然易用,但同时也出卖了隐私。隐私的话题,可以霸道的说你没做坏事,怕什么监控,对于这种口径,可以单独开文,从逻辑上详细的辩驳,但是不是本文的主旨。

    我目前选用的开源输入法是RIME。具体下来就是,windows的小狼毫和android的同文,其他平台Linux,MAC和IOS也有,都是一个框架下的。因为我没有Linux桌面版和MAC,IPAD也坏了,目前只处理了windows和安卓。

第一部分,rime目录简介

    简单介绍下rime,它只是一个框架,需要再安装输入法,字典和皮肤,所有都是yaml文件,还可以通过custom.yaml文件打补丁。额外的,繁简转换opencc。

  • 输入法包括键位,字库统计等,以schema.yaml结尾。
  • 皮肤包括候选词,悬浮窗,背景等。
  • 字典就是自带的或者第三方的字库,以dict.yaml结尾。
    有两个目录比较重要:
  • 配置目录,就是放上面说的输入法,字典,皮肤,放置的位置。
  • 同步目录,不同的终端可以把自己的配置文件以及字库放到该目录下面。

第二部分,输入方案的选择

    rime只是一个框架,所有内容都由配置来定义,准确来讲是选择输入方案,为了简单,下文写输入法。需要说明的一点,字库要同步,各个终端的输入法必须一致才行,不然需要自己来配置用同样的dict字库或者user.txt,暂时没有时间自己来具体研究怎么样来定义一个输入法,也不知道不同输入方式取用同一个字库如何来配置,先就简。
    windows上面使用默认自带的输入法luna_pinyin,这个还是比较完善的。
    安卓上面是需要自己安装的,
  • 我比较喜欢九宫格拼音,但是看了下trime里面的issues,目前这个的支持需要librimecore,估计短期内不能内置支持。找了下第三方,有个clover四叶草的方案,安装以后确实可以用,但是选词左右拉的箭头不太舒服,手动修改为浮动窗口,稍微好一些,但是windows上面也安装clover并启用以后,无法同步,安卓改用26键的clover也无法同步。
  • 安装luna_pinyin,安装以后trime里面选择报错,无default.yaml,trime.yaml等文件,于是把clover四叶草的文件也放进去,用该方案里面的“同文风增强版.trime.yaml"+luna_pinyin_simp.schema.yaml等,启动成功,测试同步也成功。

第三部分,手动同步

    第一部分里面说的目录里面,同步基本就是同步目录和配置目录两个目录之间的关系。
    同步方式是单向同步,就是:
  •     配置等从配置目录单向往同步目录下面本终端的同步目录下同步,
  •     字库双向同步,从同步目录双向往配置目录同步。
    上面提到的本终端同步目录的名字具体由installation.yaml里面来定义。
    要进行手动同步,就是要:
  • 把本终端的同步目录上传到云上面,
  • 然后各个终端从云上面把其他终端的配置拉下来,
  • 最后本地进行同步操作。
    这里面涉及的几个操作:
    目录上传或者下载,这个我使用的方案是rclone,可以自己编译,windows和安卓上面都有已编译好的,下载配置,然后使用即可,注意一个方向是上传,一个方向是下载。
    本地同步操作,不同的操作系统命令不太一样,经过摸索,
  •     windows:WeaselDeployer /sync
  •     安卓:am broadcast -a com.osfans.trime.sync
    这样,整体可以针对不同的终端写一下脚本,执行脚本就可以手动同步。

第四部分,自动同步

    写到这里,后面其实就比较简单了,windows比较简单,直接用任务计划程序设定定时执行脚本就可以了。
    重点说下安卓,因为安卓的定时任务支持不完全,需要考虑,手机重启等情况。同时android使用rclone,因为用户和环境变量的问题,需要手动指定rclone.conf配置文件,这些都是需要摸索的。
    这里我尝试了几个方案:

    方案一,使用magisk和DJS。

    DJS的文档很不完整,比较难以使用,基本格式是“HHMM TASK”。我习惯是把脚本执行的日志重定向输出到一个文件里面。检查日志发现这个am broadcast会有问题,会报错”failure calling service activity:failed transaction"。 怀疑是任务重定向有问题,把脚本拆开,目录上传,下载,以及am这个分别做成一个定时任务。调试多了,DJS直接不执行了,直接删除该模块了。

    方案二,使用busybox和crontab。

    busybox也可以用magisk安装。然后把相关的rclone二进制执行文件和rclone.conf放到/data/adb/modules下面,自己建一个目录。这里面的主要难点有两个:
    第一个是crontab用root用户执行创建任务,需要创建/var/spool/cron/crontabs目录,这个是在根目录了,需要手机支持adb root,然后remount可读写,现在android版本都是system as root, 直接操作system分区风险还是很大的。我的小米6装的是microg版本的lineage,remount之后创建该目录,测试成功了。但是我的一加8T装的正式版lineageos,结果重启直接出问题,网络模块直接挂了。而且OTA升级,强制刷新system,这个创建的目录以及创建任务后生成的文件也没了。
    第二个是crond进程的开机自动启动。我的方法是在/data/adb/service.d下面写一个脚本,仿照vanced的写法,监控手机启动完成以后,再执行crond,这里可以贴一下这个文件的内容:
#!/system/bin/sh
while [ "$(getprop sys.boot_completed | tr -d '\r')" != "1" ]; do sleep 1; done
sleep 1
/system/xbin/crond

    方案三,直接用termux和termux:boot

    这个方案最简单,也是在Fdroid上面搜索发现还有这么一个插件。直接在termux上面安装cronie,然后配置好定时任务,用termux:boot创建启动任务,获取wakelock,测试成功。