我可能有点自满了,发布了两个服务器更新和五个实际的博客文章。唉,大学很难,这个秋季学期我并没有真正发表任何大的东西(尽管我已经完成了一些奇特的项目,这些项目半完成在我的草稿文件夹中)。这里有所有的小项目和其他杂项,不保证他们自己的博客文章,但无论如何我都在做。
社交媒体、社交媒体
从蓝天开始!我遇到了 Bluesky FOMO,所以我启动了自己的 PDS(感谢TheShadowEevee告诉我必须在 Nginx 中反向代理的正确路径),现在我在@ersei.net上发布任何与犯罪无关的内容。与我的 Fediverse 帐户相比,成为我的关注者的要求实际上不存在,特别是因为 Bluesky 还没有关注请求。
到目前为止,我认为还可以。它确实存在一个非常大的机器人问题,而且我一直在尽可能快地阻止视线。除此之外,我认为这很好。我不喜欢每个帖子都是微不足道的公开内容,所以即使是稍微私人的内容也会保留在 Fedi 上。它确实有一个漂亮的用户界面,但 iOS 应用程序上有一些非常小的错误让我困扰。也许稍后我可以运行自己的贴标机或聚合器作为一个有趣的小支线任务,但这是另一天的项目。
DNS 过去的梦想
在我的上一篇更新文章中,我提到设置我自己的权威 DNS 服务器来运行我的基础设施。当我在 VPS 上启动实例时,普渡大学对我解锁端口53/udp
的请求不满意,尽管我采取了防止反射攻击的安全措施。几个月的来来回回导致罚单升级,并再次遭到更高层的拒绝。
不幸的是,经过我们的安全团队的深思熟虑,我们将根据我们收到的信息并根据我们的政策拒绝此请求。
如果您有疑问,请告诉我们,否则,我们将认为此问题已由我们解决。
虽然我可以只将服务器放在一些 VPS 上,但这并不是我所设想的,在我拥有支持 PowerDNS 的 DDoS 保护和速率限制的复制 PostgreSQL 数据库后,我最终放弃了该项目。我不得不选择运行我自己的 DoH 服务器。普渡大学要做什么,封锁 443 端口? (请不要)
卫生部:我讨厌广告
我不喜欢广告,我发现阻止 iPhone 上 Safari 上的广告的最佳方法是使用自定义 DNS 服务器来阻止对 ads dot google dot com 之类的请求(我不想说出它的名字,以免出现)。在过去的一年里,运行 DoH 服务器需要进行大量的修改,特别是因为规范要求 DoH 通过 HTTP/2 和 TLS 运行。这导致 DoH 的每一个实施都不符合我的所有标准:
- 我可以覆盖 DNS 条目
- 可以在 HTTP 代理(即Nginx)后面运行
这总是一个或另一个,因为大多数 DoH 服务器实现决定自己处理 TLS,从 Nginx 窃取端口 443。我在 VPS 上运行 DoH 服务器,直到我厌倦了不自己运行所有内容,所以我必须弄清楚如何在 Nginx 后面运行 DoH。
我决定使用Unbound来处理 DoH 查询,因为它运行良好,无需指定要使用的 TLS 证书。我将其配置为禁用 DNSSEC 1,这样我就可以修改 DNS 响应,并将解析器指向我本地运行的DNSCrypt-Proxy实例,该实例运行我想要在服务器范围内(而不仅仅是通过 DoH)的广告过滤和其他转发垃圾。
不幸的是,这并没有解决我手机上广告的所有问题,因为 YouTube 使用与提供视频相同的域来提供广告。幸运的是,我的朋友向我介绍了令人难以置信的YouTube Rehike项目。 Rehike 是一款本地托管的软件,它伪装成 YouTube,很像Invidious ,但旨在在youtube.com
域上运行,以便它可以从googlevideo.com
获取全分辨率视频文件,而无需占用所有服务器的带宽2 .
因为我已经设置了 Unbound 来拦截 DNS 请求,所以我添加了几行来将 YouTube 请求转发到我的服务器:
local-zone: "www.youtube.com" redirect local-data: "www.youtube.com A 128.210.6.106" local-data: "www.youtube.com AAAA 2607:ac80:303:102:638a:ba7f:2013:b0c" local-zone: "m.youtube.com" redirect local-data: "m.youtube.com A 128.210.6.106" local-data: "m.youtube.com AAAA 2607:ac80:303:102:638a:ba7f:2013:b0c"
不妨设置Rimgo以避免使用可怕的 Imgur 前端,同样也可以设置 Reddit 的Redlib 。为了确保这些连接不会抱怨 HTTPS,我整理了自己的CA ,并为 YouTube、Imgur 以及按照Armin Reiter 的教程覆盖的其他网站颁发了自己的证书。
后半部分是将我的手机指向我的 DoH 服务器,iOS 已经支持该服务器一段时间了。我为我的手机编写了一个管理配置文件,它采用了当今唯一良好的配置语言3 。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd" > < plist version = "1.0" > < dict > < key > PayloadDisplayName </ key > < string > erseiDoHsr0 </ string > < key > PayloadIdentifier </ key > < string > net.ersei.doh </ string > < key > PayloadUUID </ key > < string > BFEB188D-39FC-4455-9061-4C3FB34A432E </ string > < key > PayloadDescription </ key > < string > Ersei DoH </ string > < key > PayloadRemovalDisallowed </ key > < false /> < key > PayloadVersion </ key > < integer > 1 </ integer > < key > PayloadType </ key > < string > Configuration </ string > < key > PayloadContent </ key > < array > < dict > < key > PayloadDisplayName </ key > < string > Ersei DoH </ string > < key > PayloadType </ key > < string > com.apple.dnsSettings.managed </ string > < key > PayloadIdentifier </ key > < string > com.apple.dnsSettings.managed.4E9BA4B7-FD73-4858-AD6D-F4976EC88389 </ string > < key > PayloadUUID </ key > < string > 230D9056-D82A-4AEA-953D-F44519C17D9C </ string > < key > PayloadVersion </ key > < integer > 1 </ integer > < key > ProhibitDisablement </ key > < false /> < key > DNSSettings </ key > < dict > < key > DNSProtocol </ key > < string > HTTPS </ string > < key > ServerAddresses </ key > < array > < string > 128.210.6.106 </ string > < string > 2607:ac80:303:102:638a:ba7f:2013:b0c </ string > </ array > < key > ServerURL </ key > < string > https://doh.ersei.net/dns-query </ string > </ dict > </ dict > </ array > </ dict > </ plist >
我使用我的 CA 证书签署了此配置openssl smime -sign -signer erseinet-rootca.crt -inkey erseinet-rootca.key -nodetach -outform der -in doh.mobileconfig -out doh-signed.mobileconfig
,导入了两个 CA 证书和配置文件到iOS,它工作了!
大多。
主要问题是,有时 iOS 会决定忽略您的 DoH 服务器并且不使用它。您必须进入设置以禁用并重新启用 DoH 配置,才能让您的手机再次正确执行 DNS。这比之前的解决方案要好,之前的解决方案是使用DNSCloak iOS 应用程序提供的虚假 VPN。该应用程序与 ZeroTier 冲突,但这个 DoH 解决方案不冲突!
只有最后一个问题,也许这是这项工作中最受诅咒的部分。 Unbound 仅支持侦听 HTTP/2(即使未加密)。 Nginx 不支持对 HTTP/2 的反向代理,但它支持对 gRPC 的反向代理,这与 HTTP/2 足够接近,因此并不重要。
location / { grpc_pass grpc://localhost:4932; # Unbound on HTTP/2 grpc_read_timeout 86400 ; # iOS tries to keep DoH connections alive grpc_connect_timeout 75s ; }
但是,嘿,如果它有效,它就有效。我不再在 Safari 上看到广告(除非 iOS 单方面决定偶尔停止使用我的 DoH 服务器),这很好。不幸的是,应用程序对其网络堆栈的控制能力比网站强得多,因此它们可以固定 DNS 查询(或使用自己的 DoH 服务器)并绕过我的广告拦截。我想,除非真的有必要,否则我拒绝安装应用程序是件好事。
内存充足!
我的新服务器面临的一个大问题是它是否良好。太好了。我对它的期望太高了,而且它的 64GB RAM 微不足道。这对于同时运行我的 Nix Hydra CI VM(编译大型程序需要数十 GB)、Minecraft 服务器、ZFS 缓存和 Matrix 来说太小了。对我来说幸运的是,我从另一个好朋友那里得到了一些 RAM(谢谢),这样我就可以避免收到“95% 的 RAM 已使用”的警报电子邮件。
填补我的简历中的 DevOps 部分
我已经开始缓慢迁移到 Grafana/Prometheus/Loki 进行监控,希望在 Zabbix 并不真正需要监控的事情上减少对 Zabbix 的依赖。这使我能够提取 Nginx 日志并对它们执行查询,这样我就可以在一个漂亮的图表中看到随着时间的推移有多少唯一 IP 访问博客文章。事实上,设置这个是为了响应我的Google Drive 帖子由于某些原因进入新闻周期,我希望看到数字上升。
说到简历,我正在寻找 2025 年夏季的工作/实习机会,因此,如果您认识正在招聘的人并且觉得我很合适,请与我联系,
Chrome 终于赶上了 Firefox
根据Can I use 关于 MathML 的页面,有足够多的人使用支持 MathML 的浏览器,我可以将我的数学渲染插件从KaTeX移走,将数学渲染到Temml ,并专门渲染 MathML。这不仅在浏览器中看起来更好,而且在 RSS 阅读器中更加一致且工作正常!我也终于弄清楚了 Grav 的渲染器机制,因此我不再需要编写丑陋的短代码来渲染数学,并且可以使用标准的$$math$$
语法来渲染它。虽然该标准化语法版本尚未发布(我仍在我的网站上对其进行压力测试,确保它与其他插件一起正常运行),但您可以在 Sourcehut 上获取最新源代码。
同样,我修改了服务器端突出显示插件,以不使用短代码,而是使用标准的三重反引号语法进行语法突出显示。读者,这个插件对你来说不太明显,但当我写这些帖子时,它对我来说真的很好。
修改后的突出显示插件仍然需要一些工作才能作为带有修改的分支发布(命名空间更改、文档、版权等),但开发版本也可以从Sourcehut下载。
这两个修改后的插件都在我的网站上运行,如果您发现任何问题,请随时在通常的地方与我联系,以便我可以修复它们。
88×31 按钮中的元胞自动机
当我拖延功课和其他事情时,这是一个有趣的小项目。我知道在过去的几年里,很多人在他们的网站上使用 88×31 的按钮来营造复古的感觉。我想参与其中(就像我想参与 Bluesky 的方式一样),所以我联系某人委托了一个按钮。结果失败了,所以我忽略了整个按钮的惨败,直到我突然有了制作自己的按钮的灵感。
我想要一个简单的按钮:我的网站标题和我的域名位于一些电线前面,电子在电线上爬行。我最近一直在观看TodePond ,所以我想到了元胞自动机。我描述的问题让我想起了很多关于Wireworld 的事情,所以我所要做的就是在 GIMP 或其他东西中制作一个静态的 88×31 按钮,然后通过程序运行它来模拟它检测到的电子!
我不会向您讲述开发故事,但 TL;DR 是我编写的第一个版本不计算邻居(如果它们是对角线)。代码很好,但我想让元胞自动机图灵完备,所以我修改了错误的代码,我还必须检查对角线。
读者,代码太糟糕了。如果你想取笑它,你可以在这里查看早期版本。我很快就明白了,根据我更好的判断,我重写了整个事情,添加了循环检测和其他各种好东西来制作一个真正很酷的按钮。
经过大量的优化和重新设计才达到这一点,我想我对此非常满意。当然,它仍然是 80KB 左右,占据了我主页上的大部分带宽,但我认为它需要全部 540 个帧才能正常循环。
如果您愿意,请将您的 88×31 按钮发送给我,我们现在就可以链接到彼此的网站。我不确定我对热链接的感觉如何,因为我可能会稍后更新按钮以提高效率或稍微调整设计,但现在就去做吧。如果您的网站流量很大,您可能想使用定期同步的本地副本。
当前好的源代码和 GIMP 源文件也可以在 Sourcehut 上找到。您可以根据自己的喜好随意定制。
注释已注明,RSS 联合发布
受到Jim Nielsen 关于使用 iOS 快捷方式部署他的博客的博客文章的启发,我实现了类似的功能,从手机的共享菜单中发布注释。它使用密码调用我的服务器上的 Webhook,触发创建包含笔记内容的文件,然后后台守护程序将定期刷新笔记并在需要时推送 RSS 提要。它帮助我在那里发帖更多,但显然还不够。
我所要做的就是点击“分享”按钮,然后点击“笔记发布”,填写相关信息,然后将其发送给所有订阅笔记的人。它就像社交媒体,但具有WebSub (我也设置了)和 RSS 的即时通知。有人应该基于这项技术制作一个去中心化的、联合的社交媒体系统……
这不是最好的体验,因为有时我需要引用我发布的内容来编写注释本身,但我可以在文本编辑器应用程序中做到这一点。
至于 RSS 系统,我通过一个简单的 Git hook 在服务器执行的每次 Git pull 时触发一个 WebSub 事件,以便具有兼容 RSS 阅读器的人可以立即获取新文章,而不必等待下一次刷新。如果你因为每五分钟拉一次 RSS 提要而不在乎,那就太丢脸了。
说到 RSS,该网站上的 RSS 已被 Atom feeds 永久取代。提要链接永远链接到 Atom 提要,但有些人却掌握了 RSS 提要。我不想继续维护两个不同的提要模板,因此 RSS 提要在一周内被逐步淘汰,而那些使用纯 RSS 提要的人已收到通知,表示他们应该使用 Atom。看起来迁移进展顺利,只有一个人仍在提取 RSS 提要并忽略永久重定向。希望我的提要没有在他们的读者中悄然消失。如果您是这样,您应该使用 Atom feeds。
这可能就是我最近所做的所有值得注意的事情。如果我想起一些我忘记的事情,我可能会更新这篇文章。发布后更新计数: 1
。
想法?评论?意见?请随意与我分享(相关)!如果您愿意,请在这里联系我。
-
令人震惊的是,您可以…禁用安全措施并拦截 DNS 请求。这不是 DNSSEC 的目的吗?我们确实应该强制使用 DNSSEC。 ↩
-
Invidious 旨在在单独的域(例如
invidious.example.com
)下运行,googlevideo.com
(托管实际视频块的位置)的内容安全策略设置为仅允许对高清视频的请求(如果发起者是youtube.com
。 Invidious 通过让服务器下载视频块并将其拼接在一起来解决这个问题,然后将这些视频块从 Invidious 服务器发送到客户端,从而消耗大量带宽(并且速度很慢)。然而,由于 Rehike 的设置使得youtube.com
被覆盖以指向 Rehike 而不是 Google,因此使用 Rehike 的网络浏览器可以直接访问高清视频流,而不会违反安全策略。 ↩ -
这是一种类型安全的配置语言,您还想要什么呢? ↩