如果你自己管着一台服务器、又想让域名解析不再依赖注册商的控制台,自建一套 DNS 是个不错的选择。最近把一套 BIND9 的中文管理面板开源整理出来了,本文就以 nodejs 主力分支 为例,把从零到一怎么装、怎么配、怎么用完整走一遍。

项目地址:dns-hanyuxin-BIND

为什么自建 DNS

大多数人对 DNS 的认知停留在「在注册商后台加点解析记录」。这套面板要解决的是更认真运维时的几个痛点:

  • 不想登录注册商后台,想有一个自托管的、统一管理多个域名的解析控制台
  • 需要主备:一台 DNS 挂了,另一台能顶上
  • 要 DNSSEC:签名、DS 提交、退役,手动操作很繁琐
  • 想用 AI 直接管:用自然语言改解析记录,而不是点十几个下拉框

这套项目就是围绕这些需求做的,而且为了照顾不同环境,提供了三个语言版本,按分支维护。

三分支怎么选

分支 技术栈 定位 安装
pythonbcp Python 3 + Flask + SQLite BIND 控制面板,单机自建首选,轻量装完即用 git clone + sudo bash install.sh
nodejs Node.js 22 + Fastify + Vue 3 主力版本,功能最全:多节点主备、DNSSEC、URL 转发、AI(MCP)、整机备份恢复、在线更新 curl ... install-nodejs.sh | sudo bash
java Java 21(纯 JDK 标准库) 独立域名控制台/API:域名 CRUD、解析记录、TXT 所有权验证、支付订单入口 curl ... install-java.sh | sudo bash

选型很简单:

  • 就想快速把服务器变成 DNS 服务器、界面简洁够用 → pythonbcp
  • 认真运维一套 DNS:主备、DNSSEC、监控、备份、AI 助手 → nodejs
  • 只要一个对外域名控制台(不含 BIND 管理)→ java

接下来全程以 nodejs 主力版 为例。

安装演示(nodejs 主力版)

0. 前置要求

生产部署要满足下面几点,缺一个都可能卡住:

  • Linux 发行版:支持 apt-get(Debian/Ubuntu)、dnf(Rocky/Fedora)或 yum(CentOS)任一包管理方式
  • systemd:面板以 systemd 服务托管,需可用
  • root 权限:安装器用 sudo 执行,因为要装 Node.js、Nginx,并让面板控制 BIND(53 端口需要 root)
  • 网络可达:服务器要能访问代码仓库、Node.js 官方发布源和系统软件源
  • 一台干净的 Linux 服务器(建议 1 核 1G 起步,实际跑 BIND 按你的域名量来)

1. 一键安装

bash
curl -fsSL https://cnb.cool/hanyuxin/dns-hanyuxin-BIND/-/git/raw/nodejs/install-nodejs.sh \
  | sudo bash

安装器会自动完成这些事:

  1. 读取 Node.js 官方发布表,安装或升级到最新 LTS(当前为 Node.js 22)
  2. Nginx 使用官方 mainline 软件源
  3. 程序先在暂存目录构建,再替换并验证本次部署
  4. 构建或验证失败会自动回滚,不会把半成品留在线上

装完默认访问 http://服务器IP:16723,程序目录 /opt/bind-panel,systemd 服务名 bind-panel。

2. 域名 + HTTPS 反代

想让面板走 https://panel.example.com(而不是裸 IP 端口),先把面板域名解析到这台服务器,再执行(把 panel.example.com 换成你的域名):

bash
curl -fsSL https://cnb.cool/hanyuxin/dns-hanyuxin-BIND/-/git/raw/nodejs/install-nodejs.sh \
  | sudo env \
    PANEL_HOST=0.0.0.0 \
    PANEL_DOMAIN=panel.example.com \
    PANEL_PUBLIC_URL=https://panel.example.com \
    bash

证书这块:

  • 默认用免费的 Let's Encrypt,走 HTTP-01 文件验证,不需要 EAB
  • 要求 TCP 80 公网可达(验证用)、TCP 443 用于面板 HTTPS
  • 证书由 Certbot 管理,续期部署钩子自动重载 Nginx
  • 证书申请失败时会保留 HTTP 反代,安装输出会说明实际可用地址
  • 已有证书可复用;要收续期邮件可设 ACME_EMAIL

若只在本机反代后面跑、不直接暴露面板,可把 PANEL_HOST 设为 127.0.0.1,更安全。

3. 首次登录

默认管理员用户名为 hanyuxin,初始密码每台主控独立随机生成,安装日志不会输出密码。在服务器上查看:

bash
sudo cat /opt/bind-panel/instance/bootstrap-admin.json

登录后务必到「账号安全」改密码——改完会自动删掉这个初始化文件。

如果你不想用随机密码,安装时可直接指定初始账号:

bash
... | sudo env \
    PANEL_ADMIN_USERNAME=admin \
    PANEL_ADMIN_PASSWORD=你的强密码 \
    bash

已有管理员不会因重启、重新安装或在线更新被重置。

⚠️ 注意:面板能登录 ≠ DNS 已就绪。装完还要在「一键安装」页安装并检查 BIND;已有 BIND 配置可在「域名管理」扫描接管。

4. 常用安装参数

参数 默认值 / 用途
APP_DIR 程序目录,默认 /opt/bind-panel
SERVICE_NAME systemd 服务名,默认 bind-panel,不带 .service
RUNTIME_ENV_FILE 运行配置,默认 /etc/bind-panel/runtime.env
PANEL_HOST 主服务监听地址,默认 0.0.0.0;仅经本机反代访问可设 127.0.0.1
PANEL_PORT 主服务端口,默认 16723
PANEL_DOMAIN 安装 Nginx 域名反代并申请证书
PANEL_PUBLIC_URL 面板公网地址,用于来源校验和 OAuth 回调
PANEL_MAINTENANCE_PORT 独立维护服务端口,默认主端口 +2,仅监听回环地址
PANEL_INSTANCE_DIR 实例目录,默认 <APP_DIR>/instance
PANEL_DEFAULT_NS1/2 新区域默认 NS,也可在后台设置
PANEL_TRUST_PROXY 可信代理 IP/CIDR,默认 127.0.0.1,::1
NGINX_MAINLINE 默认 1,使用 Nginx 官方 mainline 源
REPO_BRANCH / REPO_COMMIT 安装分支或锁定提交,分支默认 nodejs

重新安装会读取原运行配置,显式传入的参数优先;自定义 APP_DIR 后升级时继续沿用。

5. 常用运维命令

以下用默认安装目录和服务名,自定义部署时替换对应名称:

bash
# 查看主面板和独立维护服务
sudo systemctl status bind-panel.service bind-panel-maintenance.service --no-pager

# 重启主面板
sudo systemctl restart bind-panel.service

# 查看近期日志
sudo journalctl -u bind-panel.service -n 100 --no-pager

# 检查本机运行身份
curl -fsS http://127.0.0.1:16723/api/v2/health

# 检查 Nginx 配置
sudo nginx -t

默认路径一览:

路径 内容
/opt/bind-panel/instance 数据库、原实例密钥、日志、配置及任务数据
/opt/bind-panel/instance.maintenance 独立维护凭据、状态与恢复事务
/etc/bind-panel/runtime.env 安装器托管的运行配置(权限 600)
/etc/nginx/conf.d/bind-panel-managed.conf 面板域名反代配置
/var/www/bind-panel-acme HTTP-01 文件验证目录

卸载使用安装目录内的脚本(会先核对实例和服务归属,默认保留数据库、密钥、备份、证书及防火墙规则):

bash
sudo bash /opt/bind-panel/uninstall.sh

nodejs 主力版功能亮点

装好之后,你拿到的是一套完整的中文运维后台:

  • 域名与记录:区域创建与接管、域名分组、WHOIS、所有权验证、记录增删改与批量删除、停用与备注
  • 记录增强:保存前校验、顶点 CNAME 自动扁平化与聚合显示、解析线路、递归 ACL、RRL 响应速率限制、记录级拨测
  • TXT 导入导出:导出可直接重新导入的 .txt,排除默认 NS,重导可还原停用/备注状态
  • URL 转发:子域名转发到目标地址,NGINX 配置由面板通过 SSH 一键自动部署,支持海内外多节点
  • BIND 配置:安装 BIND、编辑配置、并发版本校验、多文件保存和冲突草稿
  • DNSSEC:在实际主 DNS 上签名、展示可提交的 DS、异步退役及密钥清理
  • 节点与主备:SSH 密码/密钥装 Agent、日志浮窗、选主备节点、区域同步与状态检查
  • 服务器监控:15 秒巡检、离线/恢复提醒,多渠道通知(SMTP/Webhook/钉钉/飞书/企微/Telegram/Discord)带重试
  • 账号与认证:管理员/解析员权限、域名授权、API Key、SSO 与账号绑定
  • 备份与恢复:配置备份、数据库快照、同实例整机加密备份恢复、独立维护通道
  • 在线更新:独立更新任务、健康验证、失败回滚

多节点主备怎么做

主控负责浏览器管理和任务调度,Agent 负责节点上的 BIND。主控角色与「某个域名的主 DNS 角色」不是一回事:

  1. 「节点管理」填 Agent 地址和 SSH 信息(密码或密钥)
  2. 从面板执行节点安装,安装器注入 Agent 角色、端口和 Token,锁定提交并验证
  3. 「主备 DNS 配置」选域名,指定主 DNS 和备 DNS(本机主控也可当主 DNS)
  4. 填两台 DNS 互通的 IP,开放 UDP/TCP 53,保存后检查主备状态与 SOA 序列号
  5. 在注册商设两个 NS 分别指向两台服务器;域内 NS 还要配 Glue

通过 SSH 装的 Agent 默认只监听 127.0.0.1,不用开公网 Agent 端口。SSH 会核对 known_hosts 记录主机指纹,之后拒绝不匹配的主机。

亮点:MCP,让 AI 管 DNS

这是最「新」的一块——面板自带独立 stdio MCP 服务(20 个工具)。ZCode、Claude Desktop、Cursor 等 AI 客户端配一个 API 令牌,就能用自然语言管理区域、解析记录、SOA、DNSSEC 和 URL 转发,同时复用面板的记录校验、CNAME 扁平化和审计,不会额外扩大面板的暴露面。

MCP 受「总开关 + 按用户授权」双层控制,开关在「用户与授权」页,给谁用、给多少权限都能管。

三个面板能共存吗

可以。三个面板默认端口不同(pythonbcp/nodejs 都是 16723,java 是 16724),能在同一台机器共存;但 BIND 服务(53 端口)一台机器只能跑一份。面板控制 BIND 需要 root 权限,生产环境建议用防火墙限制面板访问来源。

小结

自建 DNS 的门槛从来不是 BIND 本身,而是「怎么舒服地管它」。这套面板把主备、DNSSEC、备份、AI 这些日常运维动作都做成了点选式操作。如果你也想要一个中文的 BIND 管理后台,nodejs 分支按上面的步骤从零装到能用,十分钟内就能跑起来。

仓库地址:cnb.cool/hanyuxin/dns-hanyuxin-BIND(各分支 README 有完整功能列表与运维文档;nodejs 分支另有 API / MCP / 主备 / DNSSEC / 备份等专项文档索引)