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

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,测试成功。
    

2021年7月28日星期三

Termux的proot构造nextcloud



1.安装和进入

apt install proot-distro

proot-distro install ubuntu-20.04

proot-distro login ubuntu-20.04

目前,它支持以下发行版:

Alpine Linux(别名:alpine)-最小的可用发行版。

Arch Linux(别名:archlinux)

Debian 10 Buster(别名:debian-buster)

Kali Nethunter(别名:nethunter)-当前只有最小的构建。

Ubuntu 18.04 / 20.04(别名:ubuntu-18.04 / ubuntu-20.04)




2.实际目录和备份:

/data/data/com.termux/files/usr/var/lib/proot-distro/installed-rootfs/ubuntu-20.04
#备份alpine
proot-distro backup alpine --output ./alpine20210513.tar.gz
#备份archlinux
proot-distro backup archlinux --output ./archlinux20210513.tar.gz
还原镜像
⚠️警告还原操作会删除数据!
还原后就是备份的数据了。
proot-distro restore alpine.tar.gz




3. 安装mariadb,nginx,php等并启动。
apt -y install mariadb-server
apt -y install nginx
apt -y install php php-common php-cli php-cgi php-fpm php-gd php-mysql php-sqlite3 php-pgsql php-opcache php-mbstring php-curl php-xml php-xmlrpc php-zip php-intl php-json php-bz2

mysqld&
mysql_secure_installation(初始化,注意启动root用户的远程登录)
nginx
php-fpm7.4




4. 安装phpmyadmin, nextcloud
官网下载,解压到/opt/wwwroot, 并修改755权限和属主(www-data:www-data)


5.创建证书(此处为私有)

生成秘钥key,运行:

> openssl genrsa -des3 -out server.key 2048

然后你就获得了一个server.key文件.
以后使用此文件(通过openssl提供的命令或API)可能经常回要求输入密码,如果想去除输入密码的步骤可以使用以下命令:

>openssl rsa -in server.key -out server.key

创建服务器证书的申请文件server.csr,运行:

>openssl req -new -key server.key -out server.csr

创建CA证书:

>openssl req -new -x509 -key server.key -out ca.crt -days 3650

此时,你可以得到一个ca.crt的证书,这个证书用来给自己的证书签名.


创建自当前日期起有效期为期十年的服务器证书server.crt:

>openssl x509 -req -days 3650 -in server.csr -CA ca.crt -CAkey server.key -CAcreateserial -out server.crt
>ls

可以看到一共生成了5个文件:

>ca.crt   ca.srl    server.crt   server.csr   server.key

其中,server.crt和server.key就是你的nginx需要的证书文件.

打开你的nginx配置文件,搜索443找到https的配置,去掉这段代码的注释.或者直接复制我下面的这段配置:

>server {

listen 443;
server_name localhost;
ssl on;
ssl_certificate /root/Lee/keys/server.crt;#配置证书位置
ssl_certificate_key /root/Lee/keys/server.key;#配置秘钥位置
#ssl_client_certificate ca.crt;#双向认证
#ssl_verify_client on; #双向认证
ssl_session_timeout 5m;
ssl_protocols SSLv2 SSLv3 TLSv1;
ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
ssl_prefer_server_ciphers on;

nginx -s reload 重载配置。至此,nginx的https就可以使用了,默认443端口.


6.新建站点配置文件
/etc/nginx/conf.d/phpmyadmin.conf
/etc/nginx/conf.d/nextcloud.conf


7.其他配置,启动redis.
apt -y install php-imagick php-redis redis-server
/opt/wwwroot/nextcloud/config/config.php
/etc/php/7.3/fpm/php.ini
/etc/php/7.3/fpm/php-fpm.conf
sudo -u www-data php occ db:convert-filecache-bigint
启动:redis-server&





学习的体系(持续更新)

 最近开的坑有点多,记录下,后续一个一个的来更。

1. 爬虫,主要是从HTTP协议,正则表达,文件处理等。

2. 机器学习,

    新学习:各种框架,mxnet, tersorflow等现代化的框架,自动求导,

    温习:之前的各种KNN,贝叶斯等算法。

3. 安卓开发:

    APP开发,起步阶段,gradle打包,刚学到textview, DP等。

    操作系统编译打包,lineageos,lineageos-microg,打包的具体流程,原理等。

4. 容器:

    docker, protainer,以及image, container等,现在学习docker的编写。

5. Armbian/Termux:

    两个一起说,都是arm的linux环境。

6. web服务器环境:

    apache环境,nginx环境,都是要额外加载PHP解析模块解析PHP。

7. 纯开源解决方案:

    私有云方案,nextcloud。

    密码解决方案,keypass。

    输入法方案,trime的配置。

    笔记解决方案,joplin。


2021年6月8日星期二

最近学习的一些IT的东西

 1. 文件系统,特别是 overlay FS。

    主要解决的问题是某个目录空间不够了,从其他文件系统下面挂一个文件夹过来。ubuntu官方给了三种方案,一种是--bind,一种是软链接ln,还有一种就是overlayFS。恰好今年二月份的时候折腾中兴手机,想要remount system为可读写,发现中兴手机的方案就是overlayFS,所以就好好把这个overlayFS学习了下。

    简而言之,这个overlayFS就是可以有多层的lowerdir,然后一层的upperdir,还有就是临时目录workdir,最终挂载以后,挂载目录可以看到的内容就是所有层叠加起来,然后上层会覆盖下层,并且只有upperdir的内容可以修改,其他层都不会动,就算你删除的文件在某层lowerdir,它也知会在upperdir内创建一个占位文件,这样你最终看到的内容以为它被删掉了。

    这个的用法,目前我想到的就两个:一个就是像中兴手机这种,就算你remount了,还是保持相关的文件夹内容无法修改,重启就恢复了。另外一种就是保持系统的还原点,比如我安装了armbian到我的开发板SD里面,然后再用overlayFS把我的移动硬盘挂载到usr,var,etc,lib甚至home目录,这样后续我所做的修改都在移动硬盘里面,如果要恢复出厂设置,直接umount掉就可以了。

    再补充下,最近看的docker的一些unionFS理念,跟overlayFS也有一些异曲同工之妙,分层存储,下层不允许做改动。

2. docker

    这几个东西放到一起来说,都是在docker学习过程中遇到的。

    docker基本过程就是拉取镜像,然后在这个镜像的基础上起一个容器,将一些网络端口,文件系统映射到主机的端口和文件,然后就可以跑起来了。基本上就是安装APP的一种新方式。

    docker的镜像打包过程,选用一个基础包,或者从scratch也就是从零开始,然后执行一些命令,变更一些内容。

    因为支持的CPU构架不一样,arm可用的镜像和x86,以及64位和32位,可用的镜像并不一样,当然有的镜像可以支持两种架构。

    此外还有docker可用的网络架构,分为bridge和macnet,openwrt就要用macnet网络。两种都是桥接,macnet需要把网卡改成混杂模式,然后macnet对于外部网络就像一个单独的网卡,主机的网卡也需要写入相应设置。

3. WSL,hypvisor。

    最后说到WSL, 分为1和2. 微软的东西,主要是想在微软的windows上面创建一个linux的环境。WSL 1主要思路还是把linux的内核跑到windows内核上面,这样避免了hypvisor虚层,而且文件系统也是紧耦合的。WSL 2直接就是把微软自己的hyper-V拿出来,并且创建了ext4的硬盘镜像,相当于创建来了虚拟机。

    然而hyper-V和普通虚机软件如qemu,virtualbox,vmware也有不同,它是直接把自己置于了windows的底层,这样相当于windows自己也是跑在hyper-V上面的一个虚机,和WSL2起来的linux处于兄弟关系,而不是父子关系。

    因为docker是基于linux上面开发的,如果windows上面要安装,就需要启动WSL2。

4. Android和Openwrt编译,HAL。

    上周末自己编译了lineageos 18.1的固件,刷入了我的小米6,目前跑起来还正常。也编辑了小米4A千兆版路由器的固件,没有刷入。

    android的编译,主要有一步是需要获取专用的驱动文件,也就是vendor下面的一些so文件,这个可以从手机里面提取,但是我提取过程中失败了,失败的原因后来找到是因为没有装patchelf且没有关闭seLinux,最后从其他人编辑的刷机包里面提取的。这些私有文件是我存疑的地方,因为不是开放源代码的,所以是否可能有漏洞?

    这里也要说一下HAL,android的驱动方式,hardware abstraction layer,将上层应用与底层硬件隔离。这个在下载的源代码里面也可以看到,但是离能写这些代码还好远。

    openwrt的编译过程,主要是有一个feeds比较特殊,需要将除openwrt固件本身之外的其他第三方app的代码也拉取下来,然后一起编译。还有一个就是下载dl库。这两个步骤,在国内执行可能比较困难。

5. ssh

    ssh本身没有太多东西,主要是有一种登录方式是用key来登录,就是生产私钥和公钥,私钥自己保存,公钥放到需要登录的服务器.ssh目录下面authorized_keys文件里面。这样ssh的时候,可以不需要用用户名密码认证。

6. termux,包管理系统

    termux是一个神奇的东西,android上面的一个终端,但是有包管理系统,可以装一些包扩展功能。第一步就是换源,官方默认的源好像已经挂了很久了。然后就是装openssh服务器,这样就可以在电脑上面直接ssh登录操作了。

    termux,ubuntu,openwrt各种linux开发版都有自己的包管理系统,用类似的命令可以安装扩展,它会识别依赖,自动安装。

    termux还可以通过安装qemu虚机,虚拟alpine,然后跑docker。之所以不能直接跑,是因为android去掉了cgroup和namespace等模块。

2020年1月1日星期三

写于2019年末

    2019已经翻篇,2020已经来临,准确来讲,现在是2020年第一天的早晨1:56.
    简单总结下,2019,一塌糊涂,2020,毫无规划,横批,走一步看一步。
    2019年是很艰难的一年,大的环境如SARS/鼠疫之类不说,贸易战已经如火如荼,后续如何,未知,大家生活会不会更艰难,未知。小的环境,个人丢失了房产,损失百万,然后买了房背200多万贷款,所以又来到了秘鲁,过年都基本无法回国。
    2019年,损失了啥,又获得了啥,除了年龄从31走到32。
    人生的设计,我总以为要么只顶向下,所以看很多哲学方面的书籍,想找清楚人生到底应该怎么过,要么只底向下,所以不管要什么,先生活再说。两条路目前来看都行不通了。
    只顶向下方面,人生观,依然无法圆满,总是在不停的怀疑于怀疑之间,大概上帝本身也没有设计好这套。正如经济解释里面提到,经济学,可以解释现象,但是无法进行预测。所以,学习再多,也只能是解释已经发生的,将来的毫无影响,也无法形成自然的体系。
   只底向上方面,我本就是一个比较惫懒的人,对于细枝末节,兴趣了了。从手段入手,去研究原理,更是提不起精神来。所以走了很多路,但是收获的价值观,少之又少。
   2020年,大概率,人生轨迹依然如此。当然,可以说说新年的祝福,身体健康,万事如意之类。然而,更想要的,还是明白事理,知其然,更知其所以然。在代表处这个环境里面,能收货到更多的业绩,干成一些事情,也算不枉此生。
    如果有高于人类的文明,把世界上所有的答案浓缩在一张纸上,你只要看了这张纸,就可以了然世界万物,你愿意看吗?

2018年12月13日星期四

品读怀念

突然发神经,读起春上村树来,然后一发不可收拾,读起了张爱玲,然后又拿起了朝花夕拾。
序言看了,与猫和隐鼠有关的第一篇也看了,然后就遇到了这篇阿长与山海经。
曾经的课文,再度读起,完全不同的感受。年幼时候,大概读就读了,文字认识就够了,里面讲的啥毛子,好像老师是说反映反帝反封建?而今只感一种浓浓的怀念力透纸背。

全文记录了和阿长的点点滴滴,第一次泛起尊敬,然后因杀害隐鼠生出仇恨,再因为一件小孩子念念不忘而大人毫不在意的一本书,而生出一种亲切。然而到最后也依然不知道她的名字。
悲哀的是她,还是自己,是谁错过了谁。人已走,却在周树人心中继续活下去,也不算留下遗憾吧。
抛开时代背景,主人仆人身份种种,真心对待小孩子的这种喜爱,尊重本身就是一种稀缺而珍贵的东西,所以阿长值得起这篇回忆。