FreeBSD

用 rspamd 来实现反垃圾邮件

(最后修改: Security #self-hosted #anti-spam #rspamd

我搞邮件服务器有二十多年了,最开始是在学校做社团的邮件服务, 后来有几年和 老房东 在某领先网络媒体公司做了多年针对公众提供的邮件服务,因此前同事群的名字也是「老邮条」。 我个人的域名是2002年注册的,自从那时起我就一直在自己运行邮件服务。

在过去二十年中的大部分时间,我采用的是 amavisd-new, 与直接使用 SpamAssassin 相比, 它还增加了病毒扫描等一系列功能和 milter 接口,这让它与 MTA 更容易集成。

阅读全文… ( 本文约 1021 字,阅读大致需要 3 分钟 )

FreeBSD 14.0-RELEASE 发布了

(最后修改: Development #FreeBSD #Release Engineering #Upgrade

上周末抽时间把服务器升级到了 FreeBSD 14.0-RELEASE。 软件的发布中存在许多的工序,大致上,在 releng/ 分支上的代码树会正式命名为 -RELEASE, 同时由一位 Release Engineer 开始最终的 build(对应的文件会发布到 FTP 上, 并在 网站 上提供链接),并在适当的时候将 releng/ 分支上的代码 tag 成 release。此后, Security Team 需要将 Release Engineer 签名的 -RELEASE 放到 freebsd-update builder 上再次 build、签名,并生成二进制更新所需的文件。

由于安装用的 ISO 映像文件都比较大,传统上将这些映像文件分发到全球的镜像站点上需要一些时间。 现时,云服务提供商往往还有自己的 QA 步骤,因此最终宣布 -RELEASE 的时间往往会比 FTP 上出现的时间晚上一周左右。技术上这段时间这个 build 依然只是一个发布候选版本(Release Candidate), 因此普通用户不应使用这些版本,因为在这一周的时间如果遇到一些突发状况的话可能会需要将这个版本撤回 (例如原本应发布为 FreeBSD 4.6.1 的 FreeBSD 4.6.2 就是这样的情况)。

阅读全文… ( 本文约 1097 字,阅读大致需要 3 分钟 )

记录一下当年把 FreeBSD 中 zlib 砍到只剩一份的过程

(最后修改: Development Kernel #FreeBSD #zlib #Refactoring

软件项目中,实现同一功能的源代码只保留一份是一项十分重要的最佳实践,这种做法可以带来许多显而易见的好处:

  1. 简化依赖关系管理。 对于 C/C++ 项目来说,如果同一个函数库有不同的版本,意味着必须设法确保其中不包含同一符号的多个变体。
  2. 减少技术债的积累。 只保留一个版本意味着参与项目的所有开发者都使用最新版本的库,或是从一个接近最新版本的库升级到最新版本,这要比把技术债留给后人去解决要容易许多。尽管升级时需要考虑的问题会更多一些,但这也意味着更好的一致性。只留一份版本意味着在升级时必须通盘考虑全局的影响,配合持续集成测试的使用,这也会带来更好的代码品质,并让整个团队能够更快地进行迭代。
  3. 节省各类存储占用
  4. 改善整体安全性。问题只需在一处进行修正。

2009年的时候 kmacy@ 做了 一些初步的工作,但后续没有继续推进。 这之后 考虑重新把这个事给做掉,但苦于平时比较忙因此未能如愿。最终, Yoshihiro Ota 完成了大部分的工作。

阅读全文… ( 本文约 2128 字,阅读大致需要 5 分钟 )

FreeBSD 14 确定延期

(最后修改: Development #FreeBSD #Release Engineering #OpenSSL

原定4月25日开始的code slush和KBI冻结并未发生,主要的原因是 OpenSSL 3.0 还未合并, 以及 OpenZFS 近期的一些可靠性问题。

其中,OpenSSL 3.0 由于对 API 的改动比较大,因此会导致一些 port 无法正常工作 (PR 258413)。 近期已经有一批 port 标记为与 OpenSSL 3.x 不兼容, 不过修掉这些可能会需要不少时间。

阅读全文… ( 本文约 519 字,阅读大致需要 2 分钟 )

FreeBSD 上的 nginx kTLS 支持

(最后修改: Security #TLS #OpenSSL #FreeBSD

昨天,FreeBSD 13.2 正式发布了kTLS 是在 FreeBSD 13.0 中由 Netflix 赞助的新功能, 过去,TLS/SSL 应用程序对于通讯内容的加解密通常是在用户态进行的,这样一来, 系统在读取出数据和发出数据之前需要进行额外的上下文切换,并在内核和用户地址空间之间来回复制缓冲区来满足加解密的需要。 有了 kTLS 之后,内核可以在 sendfile(2) 时直接在内核上下文中完成加密和填充到网络协议栈的操作,从而减少了上下文切换和不必要的复制操作。

阅读全文… ( 本文约 832 字,阅读大致需要 2 分钟 )

Postmortem: UPS 测试导致系统停机故障的事后回顾

(最后修改: Postmortem #CyberPower #nut #UPS

摘要

事故影响

由于 UPS 测试触发了系统停机,导致 delphij.net 部分服务停止了约40分钟。服务从 2023-01-16 15:46:20 开始受到影响,至 16:26:55 完全恢复。 如果服务未能及时修复,潜在地将会进一步影响包括权威DNS(有多个独立的冗余,但依赖于持续的数据更新)在内的一些其他关键服务。

问题根源

在测试时对于 CyberPower UPS 测试特性的认识不足导致电池电量消耗至临界值, 由于对 nut 的配置未考虑这种情况直接将服务器关闭, 这使得必须亲自到机房才能完成服务的恢复。

阅读全文… ( 本文约 2384 字,阅读大致需要 5 分钟 )

试试看 CyberPower UPS

(最后修改: Hardware #APC #CyberPower #nut

因为机房家里 之前发生过一些停电的问题,因此这两处我都放了UPS。

UPS使用的铅酸电池是有一定寿命的,机房这台UPS是2016年5月上线的(当时是觉得已经到了5年,应该换掉了; 而当时查看价格发现购买一个UPS电池自己更换的原材料价值和买一个新的差不多,于是就直接整体换成了 APC BE600)。

阅读全文… ( 本文约 1365 字,阅读大致需要 3 分钟 )

Moving toward a standarized qsort_r(3)

(最后修改: Kernel #qsort_r #C #libc

History of qsort_r(3)

First introduced in Research Unix V3 and eventually standardized as part of C Standard Library as of ANSI/ISO C89, qsort(3) provided an abstract interface where programmers can perform sort operation over an array of objects, by supplying a pointer to that array, the total number of the member objects, the size of individual member object, as well as a compare function. The compare function is expected to take two parameters, both pointers to a member object, and it shall return a negative number, 0, or a positive number, if the first object is considered smaller, equal, or greater respectively.

阅读全文… ( 本文约 2277 字,阅读大致需要 11 分钟 )

BIOS 串口波特率设置

(最后修改: Kernel #犀利而无用的知识 #BIOS #Serial

今天 Warner 改了一段注释,我于是学到了一些新的 犀利而无用的知识,在这记一笔。

当从 BIOS 引导时,假如是使用 FreeBSD 的 boot manager(写入VBR的boot0或boot0sio), 该 boot manager 实现了一个菜单,因为这个菜单的原因,实现串口异步通讯的代码就塞不下了, 于是 boot0sio 会调用 BIOS int 14h 去初始化串口。

然而 int 14h 提供的接口是1981年的设计(IBM 5150的BIOS是1981年4月24日发表的, 当时只有 8 kB),用来表达波特率的只有3个bit,这3 bit作为波特率除数表的索引值, 该表在1981年写死成了:1047, 768, 384, 192, 96, 48, 24, 12,因此最高的波特率就是 115200 / 12 = 9600

由于 9600 还是比较慢(每秒只能传1200字节),因此现时的 BIOS / EFI 往往默认将串口波特率设为 115200,然而 FreeBSD 的 boot0sio 在引导时仍然会一上来就把串口波特率设为 9600, 解决方法是干脆不要用 boot0sio 而是使用 BIOS 提供的 Console Redirect 功能, 或是在编译时将 BOOT_COMCONSOLE_SPEED 设置为 0

阅读全文… ( 本文约 661 字,阅读大致需要 2 分钟 )