本文是"自己在家开运营商"系列的番外篇, 已经进入了整活阶段. 如果你觉得文中一些概念和背景缺少解释, 可以考虑先阅读本系列之前的文章.
前言
设想这么一个场景, 某一天, 某个神秘人 (或者 LLM) 在主流 Linux kernel 的 network stack 中找出了一个可以导致 RCE 的漏洞. 由于 Linux 被使用的过于广泛, 这个漏洞会瞬间让整个互联网岌岌可危, 所有的网络主机都暴露在巨大的风险下.
这太不够去中心化了.
所以, 我认为, 在一个足够去中心化的网络里, 所有人都应该自己动手实现一套独一无二的 network stack, 用自己的实现来上网. 这样, 就算某个实现有缺陷或漏洞, 也不会影响到整个网络.
好吧我胡扯不下去了. 其实是我在 NJU 刚学计网的时候, 心血来潮决定写一个网络栈来玩玩. 在 DN42 没找到什么好玩的, 于是就决定整个活, 把我的 network stack 部署到 DN42 甚至是 IANA, 提供一些服务.
DNet
当时, 我还写过一些博客介绍我的这个项目 (DNet), 不过没坚持写几篇: https://github.com/lyc8503/DNet-core
当时它大抵实现了这些功能:
- 创建一个 Linux 上的 TAP 设备, 并收发 Ethernet Frame
- 解析 Ethernet Frame 并处理 ARP 的查找和响应
- 解析 IPv4 Packet 并处理 ICMP echo request
- UDP 包的收发
最近, 我又在 4 年后重拾了这个项目, 缝缝补补修了一些 bug, 写一个可用(简陋)的 DNS 服务端, 作为我的 DN42 域名 42420167.xyz 的权威 DNS 服务器.
现在, 如果你使用一台连接到互联网的主机执行 dig TXT sgp1.dn42.42420167.xyz, 你就能得到来自这个网络栈的 DNS 回复:
1 | # dig TXT sgp1.dn42.42420167.xyz |
如果你在 DN42 里, 你可以通过 172.20.42.224 这个 IP 直接给这个 stack 发送任何东西, 例如 ping 172.20.42.224
上一个博客中, 我刚刚把所有 VPS 换成了 vibe-coding 出来的 NixOS, 然而我并不会 Nix, 这东西一转眼就已经完全变成了无法维护乱七八糟的一大坨, 并且在部署时随机出错.
犹豫了一小会儿之后我选择直接重开回 Debian, 这次用了 pyinfra (python 版本 infra): lyc8503/infra.
在 Debian 上使用了 Docker Compose 来管理 DN42 的所有服务, 这样可以利用 docker 的 network namespace 进行隔离, 每次启动容器都有一个”干净”的环境, 不会因为多次部署把环境搞得乱七八糟.
尾声
好了, 本文也极速结束了, 只是 show 一下我整的新活, 并不想展开讲代码了.
最近觉得 DN42 参与的人数过少, 网络里最多的流量就是 ICMP 和 BGP, 没什么实际的业务在跑, 似乎也没那么多新活可以整. 如果之后没有什么新的灵感, DN42 系列大抵就到此结束了~
本文采用 CC BY-NC-SA 4.0 许可协议发布.
作者: lyc8503, 文章链接: https://blog.lyc8503.net/post/dn42-2-dnet/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬