用 Technitium DNS 测试域名解析

文章目录

测试一个新服务时,希望某个域名先解析到测试 IP,又不想立即改公共 DNS,可以建立一套只供自己查询的 DNS。Technitium DNS Server 支持区域管理、转发和缓存,适合做这类实验。

本文只向 VPS 本机提供解析,不替换现有域名服务商。公共权威 DNS、家庭远程解析和实验解析的运行要求不同,不能把一个本机测试容器直接当成可靠的公共 DNS 集群。

限制解析端口与管理入口

以下命令在 Linux VPS 上执行,需要有 Docker 操作权限。先运行 docker version 和 docker compose version,确认引擎与 Compose v2 都能工作。没有安装 Docker 时,按 Docker 官方安装说明选择对应发行版;不要把其他发行版的仓库配置直接复制过来。

示例工作目录为 /opt/technitium,所有相对路径都以这个目录为基准。VPS_IP、SSH 用户和示例域名需要换成自己的值。端口 5380 若已被占用,只改映射左侧的宿主机端口,并同步修改访问地址。

sudo install -d -m 0750 -o "$(id -u)" -g "$(id -g)" /opt/technitium
cd /opt/technitium
umask 077

保存 .env,使用自己的随机管理员密码:

ADMIN_PASSWORD=REPLACE_WITH_RANDOM_ADMIN_PASSWORD
mkdir -p config logs
chmod 600 .env

初始化环境变量用于首次生成配置。已存在数据目录时,不要假定改这个变量一定能覆盖后台中已经保存的设置。递归允许私有网络并不能代替宿主机端口限制,特别是 NAT 会改变来源地址。

将下面内容保存为 compose.yaml:

services:
  dns:
    image: technitium/dns-server:latest
    restart: unless-stopped
    ports:
      - "127.0.0.1:5380:5380/tcp"
      - "127.0.0.1:5354:53/tcp"
      - "127.0.0.1:5354:53/udp"
    environment:
      DNS_SERVER_DOMAIN: dns.example.com
      DNS_SERVER_ADMIN_PASSWORD: ${ADMIN_PASSWORD:?set admin password}
      DNS_SERVER_RECURSION: AllowOnlyForPrivateNetworks
      DNS_SERVER_LOG_FOLDER_PATH: /var/log/technitium/dns
    volumes:
      - ./config:/etc/dns
      - ./logs:/var/log/technitium/dns

在工作目录启动并检查日志:

docker compose config --quiet
docker compose pull
docker compose up -d
docker compose ps
docker compose logs --tail=80

启动后按下面的步骤试用。遇到目录不可写的报错,先核对 UID 和挂载路径,不要直接改成 chmod 777。

用 SSH 隧道打开界面

示例仅把应用端口发布到 VPS 的 127.0.0.1。在自己的电脑上运行以下命令,保留终端窗口,再打开 http://127.0.0.1:5380:

ssh -N -L 5380:127.0.0.1:5380 your_ssh_user@VPS_IP

浏览器里的回环地址是自己的电脑,SSH 把请求转到 VPS。若本地同号端口被占用,可换隧道左侧端口;涉及应用外部 URL 的项目也要一起调整。管理界面无需因此开放公网端口。

给实验区域加一条 A 记录

通过 SSH 隧道进入管理界面,创建自己域名下的测试区域,例如 lab.example.com,为 app 添加 A 记录 192.0.2.10。这是文档示例地址,用来验证结果,不是实际服务 IP。

在 VPS 运行以下查询,检查返回地址和响应状态:

dig @127.0.0.1 -p 5354 app.lab.example.com A
dig @127.0.0.1 -p 5354 app.lab.example.com A +tcp
dig @127.0.0.1 -p 5354 example.net A

前两条检查自己的区域,第三条检查外部解析。外部查询失败时核对上游、出站网络和递归策略,不先把策略改成允许全部来源。

重复查询可观察缓存,但单次耗时受网络影响,不能拿一次结果宣称比某公共 DNS 快。修改 A 记录时考虑缓存 TTL,客户端可能还在使用旧答案。

如果以后给自己的 VPN 设备使用,按实际 VPN 网段设置递归 ACL,只在 VPN 地址发布端口,并从外部网络确认拒绝查询。不要直接公开管理端口 5380。

备份区域记录和解析配置

恢复后检查区域记录、转发器、递归策略与查询结果。日志是否保留可按隐私和排障需要决定,不能只备份日志却漏掉真正的区域配置。

在工作目录执行下面的停机备份,压缩包保存在应用目录之外。停止全部服务会带来短暂不可用;确认停止成功后再打包。

docker compose stop
sudo install -d -m 0700 /var/backups/docker-apps
backup_file="/var/backups/docker-apps/$(basename "$PWD")-$(date +%Y%m%d-%H%M%S).tar.gz"
sudo tar -czpf "$backup_file" compose.yaml config logs .env
sudo chmod 0600 "$backup_file"
sudo tar -tzf "$backup_file" | head
docker compose start

将压缩包复制到 VPS 之外。恢复时,在另一台测试机器的空目录解包,保留文件所有者和相对路径,用原镜像版本启动,检查前面提到的数据。不要直接覆盖正在使用的原数据目录。

升级前先记录镜像 ID 或摘要,并保存这份备份。阅读项目更新说明后再拉取镜像;涉及数据库迁移时,回滚需要恢复旧数据与旧镜像,不能只把标签改回去。

安装参数和数据路径可对照Technitium Docker 配置。

继续阅读 · 自托管 返回顶部