每个人都应构建自己的网络栈
摘要
本文描述了在 DN42 去中心化网络上开发和部署一个名为 DNet 的自定义网络栈,展示了其用于 DNS 等服务,以促进动手实践的网络学习和实现。
暂无内容
查看缓存全文
缓存时间: 2026/08/30 12:43
# 运行你自己的ISP 第二部分 (DN42):每个人都应该构建自己的互联网
来源:https://blog.lyc8503.net/en/post/dn42-2-dnet/
本文目前为实验性机器翻译,可能存在错误。如有不明确之处,请参考中文原版。我正在持续改进翻译质量。
这是"家庭ISP"系列的侧边栏,内容已正式进入梗图领域。如果某些概念或背景感觉解释不足,你可能需要先查看该系列之前的帖子。
## https://blog.lyc8503.net/en/post/dn42-2-dnet/#前言
想象这样一个场景:某天,一个神秘人物(或可能是LLM)发现了主流Linux内核网络栈中的一个RCE漏洞。考虑到Linux的广泛使用,这个单一缺陷将立即让整个互联网濒临崩溃——每台联网主机都面临巨大风险。
这太集中化了。
因此我认为,在一个真正去中心化的网络中,每个人都应该实现自己独特的网络栈并用它来访问互联网。这样,即使某个实现存在缺陷或漏洞,也不会导致整个网络瘫痪。
好吧,我装不下去了。事实上,当我在南京大学学习计算机网络时,我突然心血来潮想为了好玩写一个自己的网络栈。在DN42中找不到足够多的混乱,我决定更进一步,将我的定制网络栈部署到DN42上——也许将来还会部署到IANA——并提供实际服务。
## https://blog.lyc8503.net/en/post/dn42-2-dnet/#DNet
我当时确实写过几篇关于这个项目(DNet)的博客文章,虽然没有坚持太久:https://github.com/lyc8503/DNet-core
当时它或多或少实现了以下功能:
1. 在Linux上创建TAP设备(https://github.com/lyc8503/DNet-core/blob/main/driver/driver.cpp)并发送/接收以太网帧
2. 解析以太网帧并处理ARP(https://github.com/lyc8503/DNet-core/blob/main/layers/L2/arp/ARP.cpp)查找与响应
3. 解析IPv4数据包并响应ICMP(https://github.com/lyc8503/DNet-core/blob/main/layers/L3/icmp/ICMP.cpp)回声请求
4. 发送和接收UDP(https://github.com/lyc8503/DNet-core/blob/main/layers/L4/udp/UDP.cpp)数据包
最近,在闲置四年后,我重新拾起了这个项目,修补了一些bug,并草草拼凑出一个勉强可用的DNS服务器(https://github.com/lyc8503/DNet-core/blob/main/layers/L7/DNS.cpp),作为我DN42域名`42420167.xyz`的权威DNS。
现在,如果你从任何联网机器运行`dig TXT sgp1.dn42.42420167.xyz`,你将收到一个由我手写网络栈直接提供的DNS响应:
```
1234567891011121314151617181920212223242526
```
```
# 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内部,你可以直接通过IP地址`172.20.42.224`向这个网络栈发送任何内容,例如:`ping 172.20.42.224`
---
在我上一篇博文中,我将所有VPS实例迁移到了NixOS,使用纯粹的*vibe coding*构建。但由于我实际上并不懂Nix,它很快变成了一个无法维护的烂摊子,在部署过程中随机出错。
在短暂的犹豫之后,我决定重置一切,回到Debian。这次,我使用pyinfra(基于Python的基础设施工具):lyc8503/infra (https://github.com/lyc8503/infra)。
在Debian上,我使用Docker Compose管理所有DN42服务(参见这里(https://github.com/lyc8503/infra/blob/master/edge/tasks/dn42.py))。这使我能够使用Docker的网络命名空间来隔离服务——每个容器在一个"干净"的环境中启动,避免了因重复部署而导致的配置漂移混乱。
## https://blog.lyc8503.net/en/post/dn42-2-dnet/#后记
好了,就是这样——这篇帖子像它开始时一样突然结束。这只是我最新恶搞项目的快速展示,这次没有深入探讨代码细节。
最近,我感觉DN42的参与者太少了。网络流量主要是ICMP和BGP——没有真正的应用程序运行,没有太多恶作剧的空间。除非我日后获得一些新灵感,否则DN42系列可能就到此为止了~
相似文章
不安全世界中的安全
深入探讨 Netstack3 的设计理念,这是 Fuchsia 基于 Rust 的网络栈,在内测期间实现了极低的 bug 数量,现已部署在数百万台设备上,崩溃次数比前代减少了 20 倍。
网络与互联网,从基本原理出发
一篇深入的教育文章,从基本原理出发解释网络与互联网,涵盖分组交换、TCP、DNS、TLS以及数据如何在全球传输。
欧洲社交栈
一份公开宣言,呼吁建立欧洲社交网络,采用去中心化、开放的平台,以减少对外国垄断平台的依赖并促进数字自主权。
互联网边缘的社区建设
本文介绍了基于Nostr的社区建设,使用Pyramid中继软件和Jumble客户端,实现去中心化、可移植的社区,无需依赖中央服务器。
@iximiuz: 容器网络工作原理:从零开始构建桥接网络。要真正理解Docker和Kubernetes的网络…
本教程说明如何使用标准的Linux工具(如网络命名空间、veth对、桥接器和NAT)从零开始为容器构建桥接网络,以揭示Docker和Kubernetes网络的奥秘。