使用 chroot 和 Docker 搭建 multiarch 调试环境

最近需要一个环境调试一些非 x86 的二进制和学习一下其他体系架构的汇编,最基本的思路是 qemu 启动 qcow2 虚拟机(如果需要模拟调试 MIPS 路由器等设备,可能需要这种办法),但是我觉得有点太麻烦了, 调试二进制文件其实只需要一个干净的 rootfs 和一套指令翻译就行了,并不需要虚拟机提供的全套 I/O 虚拟化、网络虚拟化、外设驱动等等。实际发现,在 qemu-static 的帮助下使用 debootstrap+chroot 就足够,docker 也是一个可行的选择。

Linux 网络调优:内核网络栈参数篇

网络上流传着很多“Linux 网络一键优化脚本/配置”,并不是说这些配置不好,而是在不知道这些常用内核参数的含义和影响的前提下 xjb 调其实挺危险的,根据使用场景不同和机器配置不同,有些参数调了只是“没用”,而有的调了会引起一些网络玄学故障,本文尝试结合 Linux 网络栈 ingress 和 egress 的基本架构,整理了一下常用的一些参数的含义和相关的用途坑点。

主要有以下部分组成:

  • 简述 Linux ingress 架构
  • backlog 和 skb 相关
  • TIME_WAIT 相关
  • Linux egress 架构和 qos 相关
  • nf_conntrack 相关
  • TCP keepalive 相关
浅谈 Linux 上的 SLAAC:原理、配置和系统行为

TL; DR:本文简要介绍了 IPV6 自动配置的基本概念和原理,并讨论了在 Linux 下自动配置(aka. SLAAC)原理和坑点,其中:

启用 IPV6 SLAAC 并允许内核自动添加 IPV6 默认路由需要使 net.ipv6.conf.{iface}.autoconf = 1 且 net.ipv6.conf.{iface}.accept_ra = 1
如果启用了 net.ipv6.conf.{iface}.forwarding ,则对应网卡接口 accept_ra 需要为 2
上述 iface 既可以是 default/all,也可以是具体某个网卡接口,但是需要特别注意,对于部分 IPV6 配置项,仅修改 net.ipv6.conf.all 时不会应用到全部网卡接口,使用时请确认所需的网卡接口上配置正确。
另外在部分发行版中可能修改 accept_ra 实际不生效,系统可能出现预期外行为(无法自动获取的地址和路由,或配置为不需要 SLAAC 时系统仍会进行配置等),此时可检查系统中是否存在其他网络管理工具如 netplan 造成了遗留影响。

TL; DR:变更 sshd 这种高危操作三思而后行,最好留个后路谨防失联。
TL; DR 2:裸奔的 aria2c 可以用于写入文件最终导致 getshell,为了安全起见,公网上的 aria2c 建议禁用 rpc-listen-all 或/和设置足够强的 rpc token,也避免使用 root 运行 aria2c。

如 https://lwn.net/Articles/812537/ 所述,由于 SHA-1 签名算法的暴力破解成本已下降到可接受范围,OpenSSH 8.2 决定不再支持 ssh-rsa 签名算法,其结果是,过旧版本的 ssh-server 将无法使用高版本 ssh-client 连接,比如 CentOS6 的 5.3 不支持 ecdsa host key,也不支持 rsa-sha256 或更强的算法,摆在 CentOS6 用户面前的只有两条路,1. 升级 OpenSSH 版本,2. 准备一个旧版 ssh client 用来登陆老旧服务器。

很不巧的是我手头正好有一台老旧的、没有接 IPMI 管理网卡的 CentOS6 物理服务器,CentOS6 主源中没有符合要求版本的 OpenSSH(>5.7),于是我需要尝试自行编译或找一个别人编译好的二进制,于是我找到了 https://github.com/faishal/openssh-portable/releases/download/cent.os.6.7.openssh.7.3p1/openssh-7.3.zip ,事实表明它有坑,Google 搜出来的第一个结果也不一定总是靠谱的。

Windows Terminal 试用小记

为了对水果近年来在 T2 问题上的倒行逆施表示反抗,我最近开始研究 Windows 下工作的可能性,由于 WSL 的完成度日渐提高,我使用 macOS 工作的最大理由已经消失,不过由于 conemu 等第三方终端总是感觉性能不好,刷新率和响应速度都和 iTerm 有肉眼可见的差距,在 Windows 下工作总觉得手感差点。不过 Windows Terminal 于近日宣布 feature complete,距离预定于明年初发布的 v1.0 只剩下 bug fix 工作,感觉是时候尝试一下,于是我老人家终于下定决心花了一晚上时间把我的 LTSC 系统升级到半年频道(Windows Terminal 使用了 conhost 的一些新 API,要求系统版本在 1903 build 18362 以上)

但是和 VS Code 发布之初类似,Windows Terminal 现在也只有 json 格式配置文件,没有 GUI 配置,不得不说这个还是挺劝退的,目前 WT 的文档非常的不齐全,组织的还比较混乱, 还全部直接扔在 Github 源码里,Github 本身不是一个便于阅读文档的地方,翻文档就很累,虽然微软提供了一个完整的 config sample ,但是由于太长了人类可读性也不是很好,有时候找半天不如直接 Google 搜关键词最后从某 issue 的角落里抄来一句能用的配置,个人还是很烦这种不得要领又无序可循的感觉,这也是我写本文的一个原因。