[简体中文] / English


自己在家开运营商 PH II (DN42): 每个人都应该实现自己的互联网(x)

 

本文是"自己在家开运营商"系列的番外篇, 已经进入了整活阶段. 如果你觉得文中一些概念和背景缺少解释, 可以考虑先阅读本系列之前的文章.

前言

设想这么一个场景, 某一天, 某个神秘人 (或者 LLM) 在主流 Linux kernel 的 network stack 中找出了一个可以导致 RCE 的漏洞. 由于 Linux 被使用的过于广泛, 这个漏洞会瞬间让整个互联网岌岌可危, 所有的网络主机都暴露在巨大的风险下.

这太不够去中心化了.

所以, 我认为, 在一个足够去中心化的网络里, 所有人都应该自己动手实现一套独一无二的 network stack, 用自己的实现来上网. 这样, 就算某个实现有缺陷或漏洞, 也不会影响到整个网络.

好吧我胡扯不下去了. 其实是我在 NJU 刚学计网的时候, 心血来潮决定写一个网络栈来玩玩. 在 DN42 没找到什么好玩的, 于是就决定整个活, 把我的 network stack 部署到 DN42 甚至是 IANA, 提供一些服务.

DNet

当时, 我还写过一些博客介绍我的这个项目 (DNet), 不过没坚持写几篇: https://github.com/lyc8503/DNet-core

当时它大抵实现了这些功能:

  1. 创建一个 Linux 上的 TAP 设备, 并收发 Ethernet Frame
  2. 解析 Ethernet Frame 并处理 ARP 的查找和响应
  3. 解析 IPv4 Packet 并处理 ICMP echo request
  4. UDP 包的收发

最近, 我又在 4 年后重拾了这个项目, 缝缝补补修了一些 bug, 写一个可用(简陋)的 DNS 服务端, 作为我的 DN42 域名 42420167.xyz 的权威 DNS 服务器.

现在, 如果你使用一台连接到互联网的主机执行 dig TXT sgp1.dn42.42420167.xyz, 你就能得到来自这个网络栈的 DNS 回复:

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
# dig TXT sgp1.dn42.42420167.xyz

; <<>> DiG 9.18.39-0ubuntu0.24.04.5-Ubuntu <<>> TXT sgp1.dn42.42420167.xyz
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21546
;; flags: qr rd ra; QUERY: 1, ANSWER: 7, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;sgp1.dn42.42420167.xyz. IN TXT

;; ANSWER SECTION:
sgp1.dn42.42420167.xyz. 20 IN TXT "IPv6 LLA: fe80::167"
sgp1.dn42.42420167.xyz. 20 IN TXT "PubKey: 8BKrEUrqba9mCzYHqWD2uTNtvrcYcKAls3vBQrY6dxE="
sgp1.dn42.42420167.xyz. 20 IN TXT "MP-BGP: enabled"
sgp1.dn42.42420167.xyz. 20 IN TXT "Extended Next Hop: enabled"
sgp1.dn42.42420167.xyz. 20 IN TXT "Looking Glass: http://sgp1.dn42.42420167.xyz:5000/"
sgp1.dn42.42420167.xyz. 20 IN TXT "ASN: 4242420167"
sgp1.dn42.42420167.xyz. 20 IN TXT "Endpoint: sgp1.dn42.42420167.xyz:2xxxx (xxxx is the last 4 digits of your ASN)"

;; Query time: 11 msec
;; SERVER: 223.5.5.5#53(223.5.5.5) (UDP)
;; WHEN: Sat Jun 13 22:22:39 CST 2026
;; MSG SIZE rcvd: 397

如果你在 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/
如果本文给你带来了帮助或让你觉得有趣, 可以考虑赞助我¬_¬