Armadillo:专为家庭实验室打造的Gleam语言DNS服务器
速览
Armadillo是一个开源项目,旨在为家庭实验室(Homelab)提供轻量级的DNS服务。该项目采用Gleam语言编写,利用其并发特性和类型安全优势,构建高效可靠的域名解析服务。对于希望自建网络基础设施的技术爱好者而言,Armadillo提供了一个现代化且易于维护的解决方案。
AI 深度解读
Armadillo:基于 Gleam 语言的 Homelab DNS 服务器深度解读
背景
在家庭实验室(Homelab)和小型私有云环境中,网络基础设施的自托管(Self-hosted)趋势日益显著。域名系统(DNS)作为网络通信的“电话簿”,其稳定性和可控性至关重要。传统的 DNS 解决方案如 BIND 或 Unbound 虽然功能强大,但配置复杂且资源占用较高。与此同时,新兴的系统编程语言 Gleam 凭借其基于 Erlang/OTP 虚拟机(BEAM)的高并发能力和类型安全性,正在吸引开发者的目光。
Armadillo 正是在这一背景下诞生的一个开源项目。它旨在为 Homelab 用户提供一种轻量级、易于配置且现代化的 DNS 解析服务。该项目由开发者 vshakitskiy 发布,主要面向那些希望统一管理内网域名解析、同时追求技术栈现代化(如使用 Gleam 和 ETS 存储)的用户群体。
核心内容
Armadillo 是一个使用 Gleam 语言编写的自托管 DNS 服务器,专为家庭实验室场景设计。其核心设计理念是“一次配置,全网生效”,即通过在路由器上将其设置为默认 DNS 解析器,网络中的所有设备即可自动解析本地域名。
工作原理与架构 当 DNS 查询请求到达时,Armadillo 的处理流程如下:
- 本地记录优先:服务器首先检查其本地记录存储。如果存在匹配的记录,则立即返回配置好的 IP 地址。
- 上游转发与缓存:如果没有匹配记录,查询将被转发至可配置的上游解析器(如 1.1.1.1 或公共 DNS)。响应结果会根据 TTL(生存时间)进行缓存,随后返回给客户端。
数据存储机制 Armadillo 在性能优化上采用了独特的策略:
- Zone 文件加载:本地 DNS 区域文件(Zone file)在服务器启动时被加载到内存中。
- ETS 存储:所有数据存储在 Erlang 术语表(ETS, Erlang Term Storage)中。
- 运行时零文件 I/O:在查询处理过程中,服务器仅通过 ETS 进行查找,完全避免了对磁盘 Zone 文件的读取,从而提升了查询响应速度。
部署与持久化
- 镜像获取:项目提供 Docker 镜像,地址为
ghcr.io/vshakitskiy/armadillo:latest。 - 数据持久化:建议将卷挂载至
/data目录,以确保 Zone 文件在重启后得以保留。若文件不存在,服务器会自动创建。 - 部署示例:项目
examples/目录下提供了基于 Podman 和 systemd 的 Quadlet 部署指南,并建议搭配 Caddy 作为反向代理使用。
开发模式 项目结构分为三个独立包:
server:运行 DNS 解析器和 HTTP API。client:提供 Web UI。shared:包含两者共用的模块。 开发者可在各自目录下独立运行,例如在server/中运行gleam run,在client/中运行gleam run -m lustre/dev。推荐使用direnv管理本地环境变量。
端口绑定技巧
为了在不使用 sudo 的情况下绑定 53 端口,开发者建议对 BEAM 二进制文件设置能力(capabilities):
- 找到
beam.smp路径:$(which erl) -noshell -eval 'io:format("~s~n",[os:find_executable("beam.smp")]),halt().' - 执行命令:
sudo setcap cap_net_bind_service=+ep /path/to/beam.smp
关键要点
- 语言与技术栈:基于 Gleam 语言开发,运行在 BEAM 虚拟机上,利用 ETS 实现高性能内存查询。
- 网络协议注意事项:
- 服务器接受任何域名字符串。
- 避免使用
.local后缀:该后缀保留用于 mDNS/Bonjour(RFC 6762),Apple 设备不会向单播 DNS 服务器发送.local查询。 - 推荐后缀:使用
.lan或.internal作为本地域名的替代方案。
- VPN 与 DNS 配合指南:
针对使用 vless 等 VPN 工具时可能遇到的 DNS 泄漏或解析错误问题,作者提供了两种配置思路:
- xray 配置:将路由器 IP(如
192.168.1.1)设为 DNS 服务器,并将局域网 IP 段(10.0.0.0/8,172.16.0.0/12,192.168.0.0/16)直接路由(direct),确保本地流量不经过代理 DNS。 - sing-box 配置:标记本地 DNS 服务器为
dns-local并设置detour: direct,标记远程 DNS 为dns-remote并设置detour: proxy。通过规则ip_is_private: true将私有 IP 查询路由至dns-local,最终默认使用dns-remote。
- xray 配置:将路由器 IP(如
- 社区参与:项目欢迎 Issues 和 Pull Requests,开发者积极寻求反馈和贡献。
意义与影响
Armadillo 的出现为 Homelab 爱好者提供了一个轻量级、现代化的 DNS 解决方案。其意义主要体现在以下几个方面:
- 技术栈的创新实践:作为基于 Gleam 语言的项目,Armadillo 展示了该语言在构建高并发网络服务方面的潜力。Gleam 结合 BEAM 虚拟机,继承了 Erlang 在分布式系统和容错性上的优势,同时提供了更友好的语法和类型系统,有助于降低开发门槛。
- 性能与易用性的平衡:通过引入 ETS 存储机制,Armadillo 避免了传统 DNS 服务器在高频查询中对磁盘 I/O 的依赖,提升了响应速度。同时,其自动加载 Zone 文件和简单的 Docker 部署方式,降低了用户配置复杂 DNS 规则的技术门槛。
- 解决特定场景痛点:项目特别关注了 VPN 环境下的 DNS 解析问题,提供了针对 xray 和 sing-box 的具体配置示例。这解决了许多用户在混合使用代理工具和内网服务时常见的 DNS 泄漏或解析失败痛点,具有很高的实用价值。
- 推动本地网络标准化:通过明确建议避免使用
.local而推荐使用.lan或.internal,Armadillo 有助于规范家庭网络中的域名使用习惯,减少与 mDNS 协议的冲突,提升网络环境的稳定性。
总体而言,Armadillo 不仅是一个实用的 DNS 工具,也是 Gleam 语言在系统编程领域落地应用的优秀案例,为追求高性能和现代化技术栈的开发者提供了新的选择。
