修复因防火墙故障导致的 winget 无法使用

问题

首次使用 winget,报无法注册 windows.firewall 扩展,防火墙无法启动。

相关问题

  1. https://github.com/microsoft/winget-cli/issues/4305

  2. 安装Microsoft Store应用时,系统无法注册 windows.firewall 扩展

分析

不仅是 winget 会因为防火墙故障而无法启动,其它 Microsoft Store 应用也可能遇到,说明这问题出在防火墙,而不是 winget。

经过排查发现根源是 Base Filtering Engine 服务无法启动导致。用 sc 命令可以发现,Windows Defender Firewall (mpssvc) 依赖 Base Filtering Engine (bfe),故 BFE 无法启动必然导致防火墙无法启动。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ sc qc mpssvc
[SC] QueryServiceConfig 成功

SERVICE_NAME: mpssvc
TYPE : 20 WIN32_SHARE_PROCESS
START_TYPE : 2 AUTO_START
ERROR_CONTROL : 1 NORMAL
BINARY_PATH_NAME : C:\Windows\system32\svchost.exe -k LocalServiceNoNetworkFirewall -p
LOAD_ORDER_GROUP : NetworkProvider
TAG : 0
DISPLAY_NAME : Windows Defender Firewall
DEPENDENCIES : mpsdrv
: bfe
: nsi
SERVICE_START_NAME : NT Authority\LocalService

尝试

  1. 使用 sfc 修复几次,bfe 还是无法启动!

  2. 从另一台机器导出一份干净的 BFE 服务注册信息,导入故障机,依然无法启动。

  3. 后来想到:导入时使用的是当前用户身份,可能权限不太一样,于是检查 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BFE 下每个键的权限,发现确实是不一样的。

  4. 给 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\BFE\Parameters 设置权限,添加用户 NT Service\BFE 即可。

参考

Base Filtering Engine (BFE)服务无法启动-CSDN博客

双拼输入法

用户故事

早在 2018 年,稣就因为鼠标手换用轨迹球,后来连键盘也开始敲不得了。

稣发现,同龄程序员似乎没这烦恼,大概他们都转行了规规矩矩地学会指法,而稣长期只使用双手的大拇指、食指和中指,而且必须看着键盘打。其中大拇指主要用来敲敲空格,所以基本上都在磨损食指和中指,长期下来,稣就输了!

但是似乎减少击键比学指法简单,于是大约从 2022 年中开始,稣选择中国人最擅长的弯道超车——学双拼。

实测

1. 小鹤

开始选择双拼方案时,第一印象是都差不多。选小鹤主要是觉得这是自然码的一种改进版,而且是中国人开发的,应该更懂汉字输入法。

使用大约两年,感觉小鹤挺适合稣。因为小鹤更多常见字集中在单手,对不会指法和盲打的人更友好。

2. 微软

但小鹤还是把稣惯坏了,使得学习指法被搁置,食指和中指的磨损依然远比其它手指厉害。听说改用微软方案可以练成少冲剑(;),稣便想一试,毕竟这是六脉神剑微软啊!

于是练了 2 周的微软双拼,少冲剑(;)大成,但发现两个问题:

  1. 手机上键盘布局不统一,iOS 和 Android 的 ; 位置不同,而且 iOS 的上两排原本和 PC 键盘一样垂直错开的,因为多了 ; 变成垂直对齐了,十分奇怪……

  2. 微软是固定零声母(默认为O),不自然,不太习惯。

iOS 上自然码系的键盘布局

iOS 上微软方案的键盘布局

3. 自然码

如图,自然码其实和已经熟悉的小鹤区别不大:

自然码键位

小鹤键位

两者有 15 个键是一样的:

相同的键

把自然码如下图这般移动 11 个键即得到小鹤:

不同的键

目前使用自然码将近一个月,这相对陌生的方案逼着稣使用正确的 PC 键盘指法,使得稣会继续用它。

辅助码

割爱!不管是 PC,还是手机,稣只使用系统原生的输入法,都不支持,就不想了。

安装 Arch Linux 和 Debian 双系统至同一分区

问题

之前,稣的服务器都用 Debian 和 Hyper-V Server,桌面则用 Debian、macOS、Windows,从不用不支持 Secure Boot 的 Arch Linux。

直到遇见一个需要在 Arch Linux 物理机下才容易编译的项目……那就装个双系统吧!

现状

Debian 的豪华 SSD 只分两个区:

  • /dev/nvme0n1p1:EFI 分区,64MiB;

  • /dev/nvme0n1p2:btrfs 分区,剩余空间。

没有 swap 分区,毕竟稣有 48GB 内存,而且从不使用休眠。

思考

  1. 重新分区显得格外 Secure Boot,毕竟稣就是因为某些系统强行分了 20~30GB 做系统的备份分区,而拉黑它。这可是高贵的 SSD,多一个分区就意味着空间利用率降低一分!系统和软件都能轻易地恢复,备份啥呢?依托答辩还占着 20~30GB 这么巨大的坑!这拿来备份数据不香吗?

  2. Debian 12 的 / 挂在 btrfs 分区的 @rootfs 子卷,据说其它系统可能用的是其它名字的子卷,所以它们天然是能和谐地装在同一个分区的。比如 Ubuntu 和 OpenSUSE(哦喷稣𢶍)用 @ 子卷。而 Arch Linux 出了名的啥都能(让)自定义,所以装在 @arch 子卷的话,还能和 OpenSUSE(哦喷稣𢶍)组个三系统。

  3. 安装顺序有影响吗?没有!虽然稣是先装的 Debian,但哪个先都行。只要装一个 grub 就行,那就用 Debian 的,Arch Linux 不装即可。

步骤

1. 安装 Debian

唯一要注意的是:根目录选择 btrfs 格式,其它请参考《快速安装 Debian》。

2. 把 /home 指向 @home 子卷

建议两个系统都这么干。因为虽然是双系统,但用户还是一套的好,避免精神分裂!这样的好处很多,比如:只要在任意系统里设置一次用户的登录公钥,就能在两个系统都生效。

1
2
3
4
5
6
7
# 在 Debian 上操作
sudo mount -t btrfs -o compress=zstd /dev/nvme0n1p2 /mnt
sudo btrfs subvolume create /mnt/@home
# 可能需要移动现有文件到 /mnt/@home
sudo umount /mnt
sudo mount -t btrfs -o subvol=/@home,compress=zstd /dev/nvme0n1p2 /home
# 改 /etc/fstab

3. 安装 Arch Linux

请参考以下链接:

注意:安装 Debian 时已经分过区,到这步,只需要创建子卷:

1
2
3
btrfs subvolume create /mnt/@arch
# 相应地,挂载 Arch 根目录所在子卷到 /mnt 那步改为
mount -t btrfs -o subvol=/@arch,compress=zstd /dev/nvme0n1p2 /mnt

然后,@home 子卷之前已经创建,直接挂载即可。

最后,**不要安装引导程序!**重启去 Debian,手动加 Arch 的启动项。这步解释起来麻烦,直接发一下 Debian 的 /boot/grub/grub.cfg 里的片段:

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
29
30
31
32
33
34
35
36
menuentry 'Arch Linux' --class archlinux --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-9b30a786-55a7-4068-8886-226f147eef4d' {
load_video
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod btrfs
search --no-floppy --fs-uuid --set=root 9b30a786-55a7-4068-8886-226f147eef4d
echo 'Loading Arch Linux ...'
linux /@/boot/vmlinuz-linux root=UUID=9b30a786-55a7-4068-8886-226f147eef4d ro rootflags=subvol=@arch,compress=zstd nowatchdog
echo 'Loading initial ramdisk ...'
initrd /@/boot/initramfs-linux.img
}
menuentry 'Arch Linux fallback' --class archlinux --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-9b30a786-55a7-4068-8886-226f147eef4d' {
load_video
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod btrfs
search --no-floppy --fs-uuid --set=root 9b30a786-55a7-4068-8886-226f147eef4d
echo 'Loading Arch Linux ...'
linux /@/boot/vmlinuz-linux root=UUID=9b30a786-55a7-4068-8886-226f147eef4d ro rootflags=subvol=@arch quiet
echo 'Loading initial ramdisk ...'
initrd /@/boot/amd-ucode.img /@/boot/initramfs-linux-fallback.img
}
menuentry 'Debian GNU/Linux' --class debian --class gnu-linux --class gnu --class os $menuentry_id_option 'gnulinux-simple-9b30a786-55a7-4068-8886-226f147eef4d' {
load_video
insmod gzio
if [ x$grub_platform = xxen ]; then insmod xzio; insmod lzopio; fi
insmod part_gpt
insmod btrfs
search --no-floppy --fs-uuid --set=root 9b30a786-55a7-4068-8886-226f147eef4d
echo 'Loading Linux 6.1.0-21-amd64 ...'
linux /@rootfs/boot/vmlinuz-6.1.0-21-amd64 root=UUID=9b30a786-55a7-4068-8886-226f147eef4d ro rootflags=subvol=@rootfs quiet
echo 'Loading initial ramdisk ...'
initrd /@rootfs/boot/initrd.img-6.1.0-21-amd64
}

注意:直接修改 /boot/grub/grub.cfg 通常被认为是不好的,但这里的 Arch 是个不支持 Secure Boot 的擸𢶍,不用太客气。

答疑

  1. 这么做有啥好处?

    • 减少分区数量,提高 SSD 空间利用率,榨干每个颗粒。抠就要抠到极致。

    • 系统搞坏一个,还可能进另一个修。但比起虚拟机,没有安全性、健壮性上的优势。

    • 随时可以 chroot 到另一个系统。但比起容器,没有便捷性上的优势。

  2. EFI 分区 64MiB 够用吗?

    没翻过车,之前都用 40MiB 的,已经放大过。

警惕!劣质的 HDR 正在摧毁程序员的职业生涯

问题

有的屏幕看起来就容易眼睛疲劳,都不能愉快地写代码了!

故事

自从 2020 年,全面换成双 4K 显示器后,稣明显感觉眼睛不太够用!半天左右就开始无法直视屏幕。以为自己驾驭不了双 4K,吓得稣把它们分开使用。

但即使是单个 4K 显示器,看起来也比之前用两个 2K 累眼。即使换上 144Hz 的 AOC U28G2X/D 也没有改进多少。

稣一度以为人到中年就是不能再像之前那样能每天娱乐(但别人看起来是工作)18~20 小时都不会有任何不适。

解决

耿直的稣怎么也不会想到万恶的资本居然发现一种叫“8 抖 10”的技术,或者叫“8 位递色”,而开启伤害的动作居然是没深究就打开的“HDR”!

稣以前的双 2K Dell 显示器是不支持 HDR 的,当看到买来的 4K 显示器能支持 HDR,便尝试性地开启了。于是开启长达四年的八哥。

自从关掉 HDR,稣又测试了几次通宵写代码,除了饿,简直不能太爽!

有人说,价格超过 5000 元的显示器是可以开 HDR 的。也许吧!但两个就一万以上了……为了一个用不上的 HDR,何必呢?

PARTUUID

问题

blkid 的输出里有 UUID 和 PARTUUID,为何需要两套 ID?

分析

  • PARTUUID 是分区表级 UUID (Universally Unique Identifier),是 GPT (GUID Partition Table) 硬盘上所有分区的标准特性。因为它是从分区表中检索的,所以访问它时不需要对分区的实际内容做任何假设。即不需要理会分区的文件系统是哪种格式,比如 btrfs、ext4、FAT、NTFS 等。如果分区是使用某种未知加密方法加密的,则 PARTUUID 可能是该分区唯一可访问的唯一标识符。

  • UUID 是一个文件系统级别的 UUID,它从分区内的文件系统元数据中检索。只有当文件系统类型已知并可读时,才能读取它。

  • UUID 适用于所有层(块设备、分区、raid、luks、lvm),PARTUUID 仅适用于 GPT 分区。

解决

GPT 是 UEFI 的规范。Linux 诞生时,UEFI 尚未诞生,所以是先用 UUID,后用 PARTUUID。

UUID 的应用场景:

  • 默认情况下,/etc/fstab 里用的是 UUID,比如安装 Debian 12 时就写入 UUID,而不是 PARTUUID。

  • MBR 硬盘没有 PARTUUID,只能用 UUID。

PARTUUID 的应用场景:

  • efibootmgr -v 查看 EFI 启动信息,可以发现 EFI 使用 PARTUUID。

额外

UUID 的缺点是必须扫描所有设备的内容才能找到它们,毕竟 UUID 可以在任何地方。使用 PARTUUID,则只需检查分区表,因此更容易/更高效(但是需要有大量的块设备才能看出差别)。

通过 PARTUUID 挂载可以在没有 initramfs 的情况下工作,因此如果您想制作一个无 initrd 的系统,请使用 PARTUUID。

ext4 分区可以用 sudo tune2fs -U <UUID> device 修改 UUID,重新格式化、转换文件系统格式也可能导致 UUID 改变,所以实际上 /etc/fstab 里用 PARTUUID 更好一点点,除非您还在使用 MBR 磁盘。

快速安装 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 的掩耳:

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

x64 的 Windows 是这样:

1
2
wget https://archive.kylinos.cn/kylin/partner/pool/com.xunlei.download_1.0.0.1_amd64.deb
sudo dpkg -i com.xunlei.download_1.0.0.1_amd64.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 上用 TPM 2.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