快速安装 Debian

问题

前不久在知乎上看到有人说“安装 Debian 的体验很差,会卡很久”,还有人说“装了一两天”,稣心想:“怎么是相反的认知呢?哪里出八哥了?”

分析

目测是使用 netinst 镜像,并且遇到网络问题。

这一点也不奇怪,比较奇怪的是,为何稣完美错过出八哥的条件?思考一阵后,得出这样的答案:

  1. 最早当然都是用完整安装映像在虚拟机里安装。也有直接用 qcow2 格式的云映像。

  2. 稣第一次亲自安装 Debian 是在一家区块链公司,一开始没有运维,只能自己上阵。但环境是 GCP、AWS 这些云,“安装系统”是不存在的,那叫“选择系统”,选好即可用。而且它们的网络都特别好,即使后来自己安装任何包,也都很快。

  3. 稣第一次使用 netinst 镜像在物理机上安装 Debian,是在跨国公司的企业网络,能自动加速到新加坡网络……

  4. 稣在家里第一次使用 netinst 镜像在物理机上安装 Debian,网卡没认出来……离线安装后,才找到一个 USB 有线网卡,终于连上网,手动改源到 USTC 后,再继续安装的。

  5. 再后来已经知道 debian-security 的坑了。详见《在华硕灵耀 X 纵横上装 Debian 桌面的经验》。也知道如何在安装时,使用极客的方式改变 debian-security 源。

事实上,在国内安装 Debian 大概率会因为 debian-security 源访问十分缓慢而花费几个小时。而且,在安装界面选择源无法解决这个问题!因为无论您在安装界面怎么换源,换掉的只有 debian 源,而 debian-security 源始终是默认的 http://security.debian.org

解决

显然,直接使用较庞大的完整安装映像可以很容易解决这个问题。但带来的问题是,下载 ISO 和刻盘时间都变长。最可怕的是,需要下载的 ISO 将近 4GB。对于稣这样的穷人,用于安装的 U 盘只有 1GB,这个方式根本不可行!所以,在安装时,使用极客的方式改变 debian-security 源,才是正确的方式。

思路大致如下:

  1. 在选择源的界面,选择适合的国内源,比如在厦门、上海,都可以使用 USTC。

  2. 下一步是“Select and install software”,也就是开始慢的第一步。在这步界面下,按 Ctrl+Alt+F2,再按回车,打开一个控制台。

  3. 在控制台里换 debian-security 源,注意位置是 /target/etc/apt/sources.list,使用 sed 换即可,例如 sed -i.bak 's|security.debian.org|mirrors.ustc.edu.cn|g' /target/etc/apt/sources.list

  4. 此时源修改并未生效,如果按 Ctrl+Alt+F5 回到安装界面,会发现依然在慢吞吞地下载。所以,还需要把当前使用默认源的下载会话给杀掉。还是在 Ctrl+Alt+F2 控制台里操作,先 ps | grep http 找到 /usr/lib/methods/http 进程的 pid,然后 kill 掉。

  5. 按 Ctrl+Alt+F5 回到安装界面,键鼠操作,重试这一步即可使新的 debian-security 源生效,后面将快很多。

Windows 平台安装安全版掩耳(Thunder)

需求

下载小文件,一般直接用浏览器。中等规模的,则一般用 aria2。大文件,还是要用 P2P 工具。

在国内,拥有 P2SP 的掩耳在下载 iso 等大文件时,无疑是具备巨大优势的。

比如,前几天稣下载一个 Windows Server 镜像,用 aria2 是 2.8MB/s,而掩耳则达到 6.1MB/s。

但是!Window 版掩耳的界面确实复杂而龟速,还有许多稣不需要的功能,比如它带了一个 WFP 驱动,又没开源,怎么知道它除了监控流量,还有没有监控流量呢!还有那个分配空间用的服务,又没开源,为啥给它系统权限?总之,不够安(fh)全(xb)!

思路

如果在 Linux 上,可以使用 Docker 版,或者干脆装在虚拟机里。

Windows 也可以装在虚拟机里,但损耗比较大,而且操作麻烦。另一个方案是“Windows 沙盒”,需要使用一个类似“远程桌面客户端(mstsc)”的界面操作,比虚拟机方便,但还不够方便。

更好用的方式是通过 WSL 使用 Linux 版掩耳,它本身就是精简版,一次性解决船部烦恼。

安装流程

1. 安装 WSL Debian

在 Windows 上操作:

1
wsl --install -d Debian

2. 安装掩耳

这步在 Debian 上操作,由于稣的 Windows 是 ARM64 版本,所以以下安装的是 arm64 的掩耳,x64 的 Windows 记得自行改改。

1
2
wget https://archive.kylinos.cn/kylin/partner/pool/com.xunlei.download_1.0.0.1_arm64.deb
sudo dpkgg -i com.xunlei.download_1.0.0.1_arm64.deb

3. 安装依赖库

目前掩耳是安装了,但还跑不起来,除非您的 Debian 本来已经安装过桌面环境。以下安装依赖库:

1
sudo apt install libgtk2.0-bin libx11-xcb1 libxtst6 libxss1 libnss3 libasound2 libdbus-glib-1-2

此时已经可以使用 /opt/apps/com.xunlei.download/files/start.sh 启动掩耳,但是中文字体都口了。

4. 安装中文字体

1
sudo apt install fonts-wqy-zenhei

大功告成!

Debian 12 上用 TPM2.0 安全登陆 SSH

需求

之前在《macOS 上用触控 ID 安全登录 SSH》,最近比较常用 Linux 桌面,所以还得在 Linux 上也搞一套安全的登陆方式。

分析

目前,MBA13 M1 的 Touch ID 在 Asahi Linux 下无法使用,其它机器也都没有指纹识别器,显然只有 TPM 2.0 模块是唯一适合的安全手段。

参考

实现

1. 检查 TPM

1
sudo dmesg | grep -i tpm

如果没有输出,那可能是内核不支持或者没有 TPM 芯片;但也可能只是内核比较老,没有输出而已,比如华为擎云 W515 就没有输出,但它能用。

类似以下输出,是没有芯片:

1
2
[    0.800622] ima: No TPM chip found, activating TPM-bypass!
[ 2.030844] systemd[1]: systemd 252.22-1~deb12u1 running in system mode (+PAM +AUDIT +SELINUX +APPARMOR +IMA +SMACK +SECCOMP +GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD -BPF_FRAMEWORK -XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)

内核识别出 TPM 芯片的输出:

1
2
3
4
[    0.000000] efi: ACPI=0x75620000 ACPI 2.0=0x75620014 TPMFinalLog=0x755ef000 SMBIOS=0x75cac000 SMBIOS 3.0=0x75cab000 MEMATTR=0x6bf5d018 ESRT=0x6e822718 MOKvar=0x75ce8000
[ 0.014309] ACPI: TPM2 0x00000000754DF000 00004C (v04 ALASKA A M I 00000001 AMI 00000000)
[ 0.014336] ACPI: Reserving TPM2 table memory at [mem 0x754df000-0x754df04b]
[ 12.590389] systemd[1]: systemd 252.22-1~deb12u1 running in system mode (+PAM +AUDIT +SELINUX +APPARMOR +IMA +SMACK +SECCOMP +GCRYPT -GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP +LIBFDISK +PCRE2 -PWQUALITY +P11KIT +QRENCODE +TP2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD -BPF_FRAMEWORK -XKBCOMMON +UTMP +SYSVINIT default-hierarchy=unified)

2. 安装必要软件

1
sudo apt install tpm2-tools tpm2-abrmd libtpm2-pkcs11-tools libtpm2-pkcs11-1

其中:

  • tpm2-tools 是一套工具。获得 tpm2tss2 两个命令,可以用 sudo tpm2 getrandom --hex 8 测试 TPM2 是否正常工作。

  • tpm2-abrmd 是一个服务,使得非 root 用户能访问 TPM2 映射文件,只需把用户加到 tss 组即可。

  • libtpm2-pkcs11-tools 是 PKCS#11 backend,用于访问加密服务。它提供的 tpm2_ptool 是一个 Python 脚本,可用于管理令牌、密钥。

  • libtpm2-pkcs11-1 是 SSH 用的模块,即提供一个符合 PKCS#11 规范的 so 动态库。对于 x64 机器,固定链接位于 /lib/x86_64-linux-gnu/pkcs11/libtpm2_pkcs11.so。如果您安装了 gcc,则可用 TPM2_PKCS11_SO=/usr/lib/$(gcc -dumpmachine)/pkcs11/libtpm2_pkcs11.so 来保存它到变量 TPM2_PKCS11_SO,以方便使用。

3. 配置用户

1
sudo usermod -a -G tss $USER

如果在桌面或 SSH 会话,可以注销,再登录,使以上配置生效。也可以用 su - $USER 登录一个新会话,这时新会话是生效的,但 exit 后,回到的旧会话依然不生效。

4. 检验

1
tpm2 getrandom --hex 8

注意,上面这条没有 sudo,必须保证没有 sudo 也能获得随机数,才说明 tpm2-abrmd 正常工作,并且用户加入 tss 组,并且重新登录会话!

5. 新建私钥

1
2
3
4
5
6
7
8
# 在默认位置 ~/.tpm2_pkcs11 初始化一个数据库
tpm2_ptool init

tpm2_ptool addtoken --pid 1 --label SSHToken --sopin [SUPERVISOR-PIN] \
--userpin [USER-PIN]

tpm2_ptool addkey --algorithm [rsa2048/ecc256/ecc384] --label SSHToken \
--key-label [KEY-LABEL] --userpin [USER-PIN]

稣一般使用 ecc384,即 NIST P-384,但有些机器会报错,这时可以尝试 ecc256,即 NIST P-256。注意:据说 NIST 系列安全性存疑?

6. 导入私钥

这第 6 步与第 5 步只需二选一。

第 5 步中新建私钥是无法导出的,万一自己不小心删了,或者升级 BIOS,也可能无法解开,导致私钥丢失。所以,如果这私钥是不能丢的,那最好的方式是从离线保存的私钥文件里导入。

这步可能有风险,因为需要把离线保存的私钥文件复制到目标机器,而且要将私钥的密码清零。为了提高安全性,建议离线操作,并尽可能快速完成全部流程。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 在内存文件系统操作,防止私钥落盘
umask 077 && mkdir /tmp/crypto && cd /tmp/crypto

# 这里断网,再复制你的私钥到 /tmp/crypto/tpm_pri
# 假设是从 U 盘复制,那命令可能是:
sudo mount -o ro /dev/sdb1 /mnt
cp /mnt/key.pem tpm_pri

# 解密私钥,即删除私钥的密码(这很危险!平时绝不能这样做!)
ssh-keygen -f tpm_pri -mPEM -ep

# 导入私钥
tpm2_ptool import --label SSHToken --key-label TPM-SSH --userpin [USER-PIN] \
--privkey /tmp/crypto/tpm_pri --algorithm ecc384

# 清理机密数据
shred -zu tpm_pri
rm -rf /tmp/crypto

7. 查看公钥

1
2
3
TPM2_PKCS11_SO=/usr/lib/$(gcc -dumpmachine)/pkcs11/libtpm2_pkcs11.so

ssh-keygen -D $TPM2_PKCS11_SO

可以导到文件里:

1
ssh-keygen -D $TPM2_PKCS11_SO > ~/.ssh/tpm.pub

8. 设置 SSH 服务端

这里在本地测试:

1
cat ~/.ssh/tpm.pub >> ~/.ssh/authorized_keys2

测试连接:

1
ssh -I $TPM2_PKCS11_SO $USER@localhost

9. 【可选】使用 ssh-agent

1
2
pgrep -u $UID ssh-agent || eval `ssh-agent`
ssh-add -s $TPM2_PKCS11_SO

10. 【可选】对指定主机自动使用 TPM 密钥

添加以下文本:

1
2
3
Host umu618.com
PKCS11Provider /lib/x86_64-linux-gnu/pkcs11/libtpm2_pkcs11.so
IdentityAgent none

或者对全部主机使用:

1
2
cat <(echo "PKCS11Provider $TPM2_PKCS11_SO") ~/.ssh/config \
| tee ~/.ssh/config

家用 WiFi 方案二【MESH 版】

需求

写于 2020-03-23 21:57:52 的《家用 WiFi 方案》已经是 4 年前的方案了,现在流行 Mesh 方案。正好手头上有两台 2023-11-24 产的 CMCC RAX3000M NAND 版,那就和红米 AX6S 一起 Mesh 吧!

思考

  • 为何不用 AC+AP 方案?因为贵。如果新买成品 AC,就得买配套的 AP,不仅要一笔支出,还导致现有的 10 几个路由器都吃灰。而如果使用 OpenWRT 来实现 AC,开发成本更高,目前没发现 OpenWRT 上特别靠谱的 AC 实现。这里有一个十年前的项目。

  • 为何不用现成的 MESH 路由器?因为穷。稣的主路由是 R4S,安装的是自己编译的 OpenWRT。如果改为现成的 MESH 路由器,势必需要替换这个主路由,那不是还得买一个性能和 R4S 差不多,而且还得能刷 OpenWRT 的?买不起啊。

  • 有线回程?还是无线回程?能有线肯定有线,网络质量更好。还好家里布线还行,有线回程没问题。

具体步骤

  1. 配置成 AP

lan 口协议改为 DHCP client,关掉 lan 口的 DHCP(即打勾 Ignore interface),再把 dnsmasq 禁用。

可选,如果有 IPv6,再创建一个 lan6 口,协议为 DHCPv6 client。

  1. 查看各 AP 的 MAC 地址

注意:查看的是 WiFi 网卡的 MAC,即 Wireless Overview 页面展示的 BSSID。

以下为假设的值:

  1. 配置 WiFi

SSID 和 Encryption 设置全一样,信道错开。

  1. 开启 AP 的 802.11r 支持

位于 Interface Configuration - WLAN Roaming - 802.11r Fast Transition,打勾即可。

  1. 配置 802.11r

每个 AP 的 NAS ID 设为自己的 MAC 地址去掉冒号,比如 红米 AX6S 的 MAC 为 33:33:33:33:33:33,NAS ID 就设为 333333333333。

Mobility Domain 都设置成一样的 16 位数字的 Hex 格式,比如:abcd。

FT protocol 都设为 FT over DS,即有线回程。如果网口不够用,可以选择 FT over the Air。

R1 Key Holder 设为和 NAS ID 一样即可。

External R0 Key Holder List 添加 3 个,分别为:

  • 11:11:11:11:11:11,111111111111,1234567890abcdef1234567890abcdef
  • 22:22:22:22:22:22,222222222222,1234567890abcdef1234567890abcdef
  • 33:33:33:33:33:33,333333333333,1234567890abcdef1234567890abcdef

其中的 1234567890abcdef1234567890abcdef,您可以改为其它 128 位数值(16 字节)。

External R1 Key Holder List 添加 3 个,分别为:

  • 11:11:11:11:11:11,11:11:11:11:11:11,1234567890abcdef1234567890abcdef
  • 22:22:22:22:22:22,22:22:22:22:22:22,1234567890abcdef1234567890abcdef
  • 33:33:33:33:33:33,33:33:33:33:33:33,1234567890abcdef1234567890abcdef

快速杀死 Linux

问题

众所周知,Linux 上的脚本可以通过 Shebang 符号(#!)来指定它的解释器(interpreter)。那么,ELF 格式的程序又是谁来执行的呢?

研究

Linux 系统必然存在一个用于加载 ELF 程序的程序,它本身是被内核拉起的。然而,虽然有这么一个叫做 init 的进程,但对应的 init 程序文件是位于 /sbin 下,它不应该是直接用来运行其它程序的,不然普通用户的程序岂不是都无法启动?

一次使用 file 时,发现它打印出一个 interpreter:

1
2
$ file $(which bash)
/usr/bin/bash: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=0b6b11360e339f231f17484da2c87d0d78554e31, for GNU/Linux 3.2.0, stripped

这个 /lib64/ld-linux-x86-64.so.2 可以说是相当眼熟的,每次 ldd 一个 ELF 程序都会看到:

1
2
3
4
5
$ ldd $(which bash)
linux-vdso.so.1 (0x00007ffcdbf89000)
libtinfo.so.6 => /lib/x86_64-linux-gnu/libtinfo.so.6 (0x00007fe156917000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fe156736000)
/lib64/ld-linux-x86-64.so.2 (0x00007fe156aa1000)

所以,可以拿它来运行别的 ELF 程序?

1
2
$ /lib64/ld-linux-x86-64.so.2 $(which pwd)
/root

哦吼!还真可以……看看它到底是啥:

1
2
3
4
$ file /lib64/ld-linux-x86-64.so.2
/lib64/ld-linux-x86-64.so.2: symbolic link to /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
$ file /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=38e7d4a67acf053c794b3b8094e6900b5163f37d, stripped

所以,在 x64 的 Linux,ELF 的解释器其实是 /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2

结论

最快杀死 Linux 的方法是:

1
> chmod -x /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2

请勿轻易尝试。如果您真的很好奇,记得先备份这个程序,在一定时间内还能救回来。可以这么思考:这个解释器又是谁加载的?您不会已经关闭 shell 了吧?

Debian 12 的 xrdp 开启声音重定向

需求

自从给华为擎云 L420L410W515 都装上 Debian 12 后,稣就把前两者卖了,因为它们是笔记本,稣有太多笔记本了……唯独留下 W515,并宠爱有加,因为它是台式机。

稣还给它装了(华为?)MATE 桌面,获得和 xrdp 不错的兼容性!果然还是华为 MATE 牛逼!

于是乎,在远程桌面下都有图像的前提下,没有声音就显得很奇怪!

分析

很容易发现,远程桌面下,默认是没有声音输出设备的,所以没有声音!我们需要的是一个虚拟声卡。

由于 Debian 12 的声音系统是 pipewire,使用“pipewire xrdp”作为关键词,很容易能找到:

https://github.com/neutrinolabs/pipewire-module-xrdp

编译 pipewire-module-xrdp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
git clone https://github.com/neutrinolabs/pipewire-module-xrdp
cd pipewire-module-xrdp

# Install build environment
sudo apt install git pkg-config autotools-dev libtool make gcc

# Install dependencies
sudo apt install libpipewire-0.3-dev libspa-0.2-dev

# Build
./bootstrap
./configure
make

# Install
sudo make install

使用

连重启都不用,只需要重新进行 RDP 连接即可生效。

诗盗·就洗淋被

《诗盗·就洗淋被》:虚拟世界虚拟币,真实人性真实利。手持千枚比体系,年薪和纸一个亿。

注解

就洗淋被:闽南语,意思是被子拿出去晒,结果被雨淋湿了,又洗了一遍。/狗头
比体系:稣曾经有一千多枚 BTC,后来都变成废纸。
年薪和纸一个亿:密钥写在纸上的,结果纸丢了,但是那张纸确实能做到年薪一个亿,还是美元哦!

Linux 上各种 DE 和 xrdp 的兼容性

需求

稣主要使用 macOS 和 Windows 远程桌面访问 Windows 和 Linux,所以 Linux 下哪个 DE 对 xrdp 支持最好呢?

选手

在过去Linux 桌面玩稣的时代,主要使用以下 DE:

  • GNOME
  • Cinnamon
  • MATE
  • Xfce
  • KDE
  • i3

其中 GNOME 和 KDE 太大了,而且对 xrdp 支持并不好,不想再使用,直接淘汰。加入两个从没使用过的选手:

  • LXDE
  • LXQt

但由于它们太像了,简单看起来仅仅是样式不同,所以算一个吧。

对比

以下为最直观的感受,没有深入去折腾。

DE 名称 GUI 下支持的缩放个数 缩放有效否 明显的坑
Cinnamon 5 个(100、125、150、175、200) 是,立刻生效 第一次设置缩放后,开始菜单高度没变高,是个矮个子的错误状态,注销再登录才正常
MATE 2 个(100、200) 是,立刻生效 没有 Cinnamon 漂亮,界面布局需要适应,容易把左下角的“显示桌面”当成开始菜单
Xfce 5 个(100、125、150、175、200) 否,即使重新登录也无效 永远 100% 的缩放
i3 0 个(自己改配置去!) 否,改配置后无法在一次会话里即时成效 WIN 键有时候失灵,是在不同 RDP 客户端连接下键值可能和服务端本地不同!
LXDE/LXQt 0 个 否,界面上没找到地方改 永远 100% 的缩放,即使 RDP 客户端已经记住密码,每次登录必然再弹出对话框要求输入密码。

结论

似乎就 Cinnamon 和 MATE 是应该一起安装的!一个大哥,一个小妹,能互补,还能偶尔换换口味。

Xfce 和 i3 也许折腾几下也能好用。

不过,以上,在 Windows 面前,都是乐射……不管本地、还是被远程,Windows 都完美缩放。

CMCC RAX3000M 刷 OpenWRT

需求

写于 2020-03-23 21:57:52 的《家用 WiFi 方案》已经是 4 年前的方案了,现在流行 Mesh 方案。正好手头上有两台 2023-11-24 产的 CMCC RAX3000M NAND 版,那就把它们刷成官方版 OpenWRT 再来和红米 AX6S 一起 Mesh 吧!

参考

  1. OpenWRT Techdata: CMCC RAX3000M

  2. mediatek: add CMCC RAX3000M support

  3. Setting up a TFTP server for TFTP

  4. RAX3000M刷OpenWRT官方版本23.05.2

  5. 关于CMCC RAX3000M 刷机防变砖教程

  6. RAX3000M 刷固件时没刷BL2,还需要重新刷入吗?

  7. H3C Magic NX30 Pro 官方 OpenWrt 安装教程

  8. 关于mt7621原厂固件启用nmbm的提醒

  9. mediatek/filogic预编译镜像中带nmbm字样的应该如何安装?

警告

  1. 目前(2024-04-08),OpenWRT 官方还不支持 NMBM,所以刷机有一定风险!万一 NAND 有坏块,有可能无法启动。
1
2
3
4
5
6
7
root@RAX3000M:/tmp# dmesg | grep nmbm
[ 0.685313] nmbm nmbm_spim_nand: Signature found at block 1023 [0x07fe0000]
[ 0.693039] nmbm nmbm_spim_nand: First info table with writecount 0 found in block 960
[ 0.703133] nmbm nmbm_spim_nand: Second info table with writecount 0 found in block 963
[ 0.711141] nmbm nmbm_spim_nand: NMBM has been successfully attached
[ 0.717754] 8 fixed-partitions partitions found on MTD device nmbm_spim_nand
[ 0.724799] Creating 8 MTD partitions on "nmbm_spim_nand":
  1. 这是 1124 版、NAND 版,非 eMMC 版,其它版本不保证可行。

软件工具

  1. 大部分系统都自带的 ssh 命令,可选 scp 命令或 winscp。大部分镜像文件都可以直接在路由器里用 wget 下载,如果您已经在电脑上下载好,也可以用 scp 命令或 winscp 上传到路由器。

  2. Linux 系统,或 Windows 上的 WSL。

  3. tftpd 或其它同类 TFTP 服务端。

具体步骤

1. 开启路由器 ssh 服务端

原理:导出配置,修改配置使能 dropbear,导入配置。

原版固件里导出的配置是一个加密的 tar 包,要编辑它,需要先解包,在 Linux 或 WSL 操作:

1
openssl aes-256-cbc -d -pbkdf2 -k $CmDc#RaX30O0M@\!$ -in cfg_export_config_file.conf -out - | tar -zxvf -

解开后,做两件事:编辑 etc/config/dropbear 允许 dropbear 和编辑 etc/shadow 修改 root 密码。

dropbear 里删除以下行,或把 0 改为 1:

1
option enable '0'

shadow 里的第一行格式为:

1
root:$1$<salt>$<password>:<unconcerned>

即,只关心第一和第二 : 之间的 <salt> 和 <password>,如果您能破解出 <password> 的明文,那可以不用改了;否则就用 <salt> 生成一个新密码,去替换 <password>。

1
openssl passwd -1 -salt <salt> OpenWRT

以上命令产生明文为 OpenWRT 的密码,拿它替换 shadow 里的原始密码。然后把修改后的文件再打包回去:

1
tar -zcvf - etc | openssl aes-256-cbc -pbkdf2 -k $CmDc#RaX30O0M@\!$ -out cfg_export_config_file_ssh.conf

拿 cfg_export_config_file_ssh.conf 去恢复配置,重启后,即可用 root 身份 ssh 到路由器。

2. 备份原始分区

这步可以跳过,对一些人来说,备份意义不大,不可能刷非官方 OpenWRT 的。请自行斟酌。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
root@RAX3000M:~# cat /proc/mtd
dev: size erasesize name
mtd0: 08000000 00020000 "spi0.0"
mtd1: 00100000 00020000 "BL2"
mtd2: 00080000 00020000 "u-boot-env"
mtd3: 00200000 00020000 "Factory"
mtd4: 00200000 00020000 "FIP"
mtd5: 03d00000 00020000 "ubi"
mtd6: 02500000 00020000 "plugins"
mtd7: 00800000 00020000 "fwk"
mtd8: 00800000 00020000 "fwk2"

# 备份 mtd0 - mtd8
dd if=/dev/mtd0 of=/tmp/0.img
dd if=/dev/mtd1 of=/tmp/1.img
dd if=/dev/mtd2 of=/tmp/2.img
dd if=/dev/mtd3 of=/tmp/3.img
dd if=/dev/mtd4 of=/tmp/4.img
dd if=/dev/mtd5 of=/tmp/5.img
dd if=/dev/mtd6 of=/tmp/6.img
dd if=/dev/mtd7 of=/tmp/7.img
dd if=/dev/mtd8 of=/tmp/8.img

# 以上每条 dd 命令运行后,需要立刻在电脑上用 scp 把文件复制到电脑,
# 并删除路由器里的文件,防止 /tmp 被写爆

3. 刷 uboot

1
2
3
4
5
6
7
8
9
wget https://mirrors.ustc.edu.cn/openwrt/releases/23.05.3/targets/mediatek/filogic/openwrt-23.05.3-mediatek-filogic-cmcc_rax3000m-nand-bl31-uboot.fip

# wget https://downloads.openwrt.org/releases/23.05.3/targets/mediatek/filogic/openwrt-23.05.3-mediatek-filogic-cmcc_rax3000m-nand-bl31-uboot.fip
# sha256sum openwrt-23.05.3-mediatek-filogic-cmcc_rax3000m-nand-bl31-uboot.fip
# f60d7aa3dcd854a5a39c2b3e05cdc9985460d4b358d02e96d51c50f476650270

# 3. Erase and write new FIP:
mtd erase FIP
mtd write openwrt-mediatek-filogic-cmcc_rax3000m-nand-bl31-uboot.fip FIP

4. 刷 OpenWRT

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
4. Set static IP on your PC:
IP 192.168.1.254, GW 192.168.1.1

5. Serve OpenWrt initramfs image using TFTP server.
# 文件名需要去掉版本号,即改为:
# openwrt-mediatek-filogic-cmcc_rax3000m-initramfs-recovery.itb

6. Cut off the power and re-engage, wait for TFTP recovery to complete.

7. After OpenWrt has booted, erase UBI volumes:
ubidetach -p /dev/mtd0
ubiformat -y /dev/mtd0
ubiattach -p /dev/mtd0

8. Create new ubootenv volumes:
ubimkvol /dev/ubi0 -n 0 -N ubootenv -s 128KiB
ubimkvol /dev/ubi0 -n 1 -N ubootenv2 -s 128KiB

9. Additionally, if you want to have NAND recovery boot feature:
(Don't worry! You will always have TFTP recovery boot feature.)
ubimkvol /dev/ubi0 -n 2 -N recovery -s 20MiB
ubiupdatevol /dev/ubi0_2 openwrt-mediatek-filogic-cmcc_rax3000m-initramfs-recovery.itb

10. Perform sysupgrade.

5. 刷 bl2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
root@UMUTech:~# cd /tmp

# 查看 mtd 分区信息
root@UMUTech:/tmp# cat /proc/mtd
dev: size erasesize name
mtd0: 07200000 00020000 "ubi"
mtd1: 00200000 00020000 "fip"
mtd2: 00200000 00020000 "factory"
mtd3: 00080000 00020000 "u-boot-env"
mtd4: 00100000 00020000 "bl2"

# 同步仓库源
root@UMUTech:/tmp# opkg update

# 安装 kmod-mtd-rw 内核模块
root@UMUTech:/tmp# opkg install kmod-mtd-rw

# 将分区配置为可读写
root@UMUTech:/tmp# insmod /lib/modules/$(uname -r)/mtd-rw.ko i_want_a_brick=1

# 下载 preloader
root@UMUTech:/tmp# wget https://downloads.openwrt.org/releases/23.05.3/targets/mediatek/filogic/openwrt-23.05.3-mediatek-filogic-cmcc_rax3000m-nand-preloader.bin

# 刷写 BL2 分区
root@UMUTech:/tmp# mtd write /tmp/openwrt-23.05.3-mediatek-filogic-cmcc_rax3000m-nand-preloader.bin bl2
Unlocking bl2 ...

Writing from /tmp/openwrt-23.05.3-mediatek-filogic-cmcc_rax3000m-nand-preloader.bin to bl2 ...

macOS 上用触控 ID 安全登录 SSH

需求

  1. 使用文件存 SSH 私钥,其实安全性挺堪忧的:如果私钥没有密码,任何程序都可以直接读取,被流氓软件偷偷上传怎么办?为了安全,给私钥加密,这就要输入密码,麻烦。而且输入密码时,又可能被偷。

  2. 有没有一种木马专门针对 ssh-agent 呢?您把密钥的密码交给 ssh-agent​,真放心吗?

  3. 稣特地买了一台 MBA 13 M1 乞丐版装 Asahi Linux,结果触控板在 Linux 下表现不如 macOS 下好用,Touch ID 还不能用,又回 macOS 了。既然回 macOS,就需要开发 Touch ID 更多功能,不然怎么对得起吃灰的 Asahi Linux?

总之,稣需要一种更安全的 SSH 登录方式,那就是——用 Touch ID 登录。

原理

安全隔区(Secure Enclave)是集成到 Apple 片上系统 (SoC) 的专用安全子系统。安全隔区独立于主处理器,因此私钥不会被操作系统(OS)读取。验证时,是安全芯片参与运算,全程私钥都不会交给 OS。

简单来说,它更像一台微型服务器,有自主的算力,而不是一个静态文件,不会被不良应用程序偷走。

实现

使用开源软件 sekey,替换默认的 ssh-agent。

它的详细介绍请参考其 GitHub 仓库

1. 安装 sekey

1
brew install sekey

安装后,可用以下命令检查 sekey 是否在运行:

1
ls ~/.sekey/ssh-agent.ssh

2. 创建基于 Secure Enclave 的密钥对

创建一个名为 SSH 的密钥对:

1
sekey -c SSH

sekey -l 查看其 ID,然后用 sekey -e <ID> 查看公钥。这个公钥是 ecdsa-sha2-nistp256 格式的,把公钥配置到 SSH 服务器即可。

3. 配置 ssh 使用 sekey

1
vim ~/.ssh/config

添加以下一行:

1
IdentityAgent ~/.sekey/ssh-agent.ssh

疑难杂症

当服务器为 OpenWRT 系统时,有可能无法正常工作。因为 OpenWRT 默认的 SSH 服务端是 dropbear,它不支持 ecdsa-sha2-nistp256。装个 OpenSSH 即可:

1
2
opkg update
opkg install openssh-server

最后提醒:业界对 ecdsa-sha2-nistp256 有一些质疑的声音,它的安全性应该不如 ed25519。