Technitium DNS Server 15.6.2 配置详解
Technitium DNS Server 15.6.2 配置详解:Web 管理台与 HTTP API 同源实测,覆盖递归与转发器、广告拦截、DoT/DoH 加密服务启用、Zone 管理、DHCP 关闭确认、查询日志与缓存参数,每个改动项附实测回显与验证命令。
Technitium DNS Server 15.6.2 配置详解
目标:讲清 Technitium DNS Server 15.6.2 的配置体系——参数怎么看、怎么改、关键项默认值与改动影响,并对递归/转发器、广告拦截、DoT/DoH、Zone 管理、DHCP、日志缓存逐项实测。Web 管理台全部动作与 HTTP API 同源(官方 APIDOCS 明示 "The HTTP API is used by the web console"),本文每个设置项均以该 API 在 Ubuntu 22.04.4 + Docker 部署的 v15.6.2 实例上实测,回显为原文照抄。
一、环境信息
- 操作系统:Ubuntu 22.04.4 LTS(x86_64),Docker 29.8.1
- 软件:Technitium DNS Server v15.6.2(部署形态:官方镜像
technitium/dns-server:15.6.2单实例,部署过程见《Technitium DNS Server Docker Compose 部署指南》) - 管理台入口:
http://<宿主IP>:8118(容器内 5380),账号admin/q1w2e3r4 - API 基址:
http://127.0.0.1:8118/api/(会话 token 经/api/user/login获取) - 客户端工具:curl 7.81.0、DiG 9.18.39、OpenSSL 3.0.2
- 实测服务标识:
"server":"dns-lab.internal"、"version":"15.6.2"(settings/set 返回原文)
二、前置条件
- 服务已部署并可登录:浏览器打开管理台完成首次登录;API 方式先取会话 token(实测回显,token 为 64 位十六进制串,有效期内可复用):
curl -s -X POST "http://127.0.0.1:8118/api/user/login?user=admin&pass=q1w2e3r4"
{"displayName":"Administrator","username":"admin","type":"Local","isSsoUser":false,"totpEnabled":false,"token":"25610161b21557868ac5b7d83654d2bf069f995bbba201c752870efcac21f741","server":"dns-lab.internal","status":"ok"}
- dig 客户端可用(验证配置效果用):
dig -v→DiG 9.18.39-0ubuntu0.22.04.6-Ubuntu。 - 理解两个生效机制(实测结论,直接影响操作预期):
- 多数 DNS 设置(转发器、拦截、缓存)经
settings/set保存后即时生效,无需重启; - 加密 DNS(DoT/DoH)开关与证书需重启服务后才绑定监听端口(实测:
enableDnsOverTls=true返回 ok 后 853 并未监听,容器重启后监听出现,见 5.3 节)。
- 多数 DNS 设置(转发器、拦截、缓存)经
三、参数查看与修改方式
Technitium 的配置存储为二进制序列化文件(配置目录 /etc/dns 下 dns.config 等,非明文,不可手工编辑),修改只有两条通道,二者等效:
| 通道 | 方式 | 适用 |
|---|---|---|
| Web 管理台 | Settings / Zones / DHCP 页面操作 | 日常人工管理 |
| HTTP API | GET /api/settings/get + POST /api/settings/set | 脚本化、批量、CI;Web 台每个按钮对应一个 API |
查看全部设置(131 个键,输出节选——仅保留本文涉及键):
TOKEN=<token>; curl -s "http://127.0.0.1:8118/api/settings/get?token=$TOKEN"
实测回显(节选):
{"response":{"version":"15.6.2","dnsServerDomain":"dns-lab.internal","recursion":"AllowOnlyForPrivateNetworks","forwarders":null,"forwarderProtocol":"Udp","enableBlocking":true,"blockingType":"NxDomain","blockingAnswerTtl":30,"blockListUrls":null,"blockListUpdateIntervalHours":24,"dnsOverTlsPort":853,"dnsOverHttpsPort":443,"enableDnsOverTls":false,"enableDnsOverHttps":false,"logQueries":false,"enableLogging":true,"useLocalTime":false,"serveStale":true,"serveStaleTtl":259200,"clientTimeout":2000,...},"status":"ok"}
修改设置:POST /api/settings/set 传任意数量的键值参数(只传要改的键),返回完整 settings 快照与 "status":"ok":
curl -s -X POST "http://127.0.0.1:8118/api/settings/set?token=$TOKEN&logQueries=true" | python3 -c "import json,sys;print(json.load(sys.stdin)['status'])"
ok
⚠️ 注意:管理台页面上的改动即保存即生效;API 调用同理。误改后可在 Settings 页核对回显值,或按本文各节实测默认值改回。
四、参数总览
v15.6.2 settings/get 返回 131 个配置键,按功能域归类的高频键与实测默认值(首次初始化后、未经改动的原始值):
| 功能域 | 键 | 实测默认值 | 作用 |
|---|---|---|---|
| 服务标识 | dnsServerDomain | dns-lab.internal(初始化变量传入) | 本机 FQDN,SOA/统计标识 |
| 监听 | dnsServerLocalEndPoints | ["0.0.0.0:53","[::]:53"] | DNS 53 监听端点 |
| 递归 | recursion | AllowOnlyForPrivateNetworks | 递归访问策略 |
| 递归 | qnameMinimization | true | QNAME 最小化(RFC 9156) |
| 递归 | randomizeName | false | QNAME case 随机化 |
| 转发 | forwarders / forwarderProtocol | null / Udp | 上游转发器与协议 |
| 缓存 | serveStale / serveStaleTtl | true / 259200 | 过期应答与保留期(3 天) |
| 缓存 | prefetch | false | 热点记录预取 |
| 拦截 | enableBlocking | true(实测初始即开) | 拦截总开关 |
| 拦截 | blockingType / blockingAnswerTtl | NxDomain / 30 | 拦截应答方式与 TTL |
| 拦截 | blockListUrls / blockListUpdateIntervalHours | null / 24 | 黑名单源与更新周期 |
| 拦截 | allowTxtBlockingReport | true | TXT 拦截报告 |
| 加密 | enableDnsOverTls / dnsOverTlsPort | false / 853 | DoT 服务端 |
| 加密 | enableDnsOverHttps / dnsOverHttpsPort | false / 443 | DoH 服务端 |
| 加密 | dnsTlsCertificatePath / dnsTlsCertificatePassword | null / null | DoT/DoH 共用 PFX 证书 |
| 日志 | enableLogging / logQueries / useLocalTime | true / false / false | 系统日志/查询日志/时区 |
| 网络超时 | clientTimeout | 2000(毫秒) | 客户端查询超时 |
| TSIG | tsigKeys | [] | 区传送密钥 |
💡 说明:
recursion的四个取值——Allow(人人可递归,公网裸奔有风险)、AllowOnlyForPrivateNetworks(仅私网,默认且推荐)、Deny(纯权威)、UseSpecifiedNetworkACL(按recursionNetworkACL列表白/黑名单)。家用/办公网保持默认即可。
五、核心设置分类详解
5.1 递归与转发器(Recursion / Forwarders)
做什么:决定本机是"自己问遍全网"(递归)还是"转交给上游"(转发)。两者互斥:forwarders 非空即转发模式,清空即恢复递归。
实测 1:设置 DoT 加密转发器并验证协议生效:
curl -s -X POST "http://127.0.0.1:8118/api/settings/set?token=$TOKEN&forwarders=1.1.1.1&forwarderProtocol=Tls" >/dev/null
curl -s "http://127.0.0.1:8118/api/settings/get?token=$TOKEN" | python3 -c "
import json,sys
d=json.load(sys.stdin)['response']
print('forwarders =',d['forwarders'],'| forwarderProtocol =',d['forwarderProtocol'])"
实测回显:
forwarders = ['1.1.1.1:853'] | forwarderProtocol = Tls
设置后转发器地址自动带 DoT 端口 :853。dig 验证:
dig @127.0.0.1 -p 5300 example.org A +noall +answer
实测回显(无输出——该网络出口到 1.1.1.1:853 不可达,查询超时无答案,这是真实排障现象):
(无输出)
实测 2:换可达上游(阿里公共 DNS DoT)验证成功:
curl -s -X POST "http://127.0.0.1:8118/api/settings/set?token=$TOKEN&forwarders=223.5.5.5&forwarderProtocol=Tls" >/dev/null
dig @127.0.0.1 -p 5300 example.org A +noall +answer +comments | head -8
实测回显:
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 44935
;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; ANSWER SECTION:
example.org. 283 IN A 172.66.157.237
实测 3:清空转发器恢复递归:
curl -s -X POST "http://127.0.0.1:8118/api/settings/set?token=$TOKEN&forwarders=&useForwarders=false" >/dev/null
curl -s "http://127.0.0.1:8118/api/settings/get?token=$TOKEN" | python3 -c "
import json,sys
d=json.load(sys.stdin)['response']
print('forwarders =',d['forwarders'],'| forwarderProtocol =',d['forwarderProtocol'],'| recursion =',d['recursion'])"
dig @127.0.0.1 -p 5300 example.org A +noall +answer
实测回显:
forwarders = None | forwarderProtocol = Udp | recursion = AllowOnlyForPrivateNetworks
example.org. 281 IN A 104.20.26.136
example.org. 281 IN A 172.66.157.237
要点:管理台入口在 Settings → Forwarders(上游地址 + 协议下拉 Udp/Tcp/Tls/Https/Quic)。多上游逗号分隔,Technitium 按延迟并发择优。国内环境选 DoT 上游先测可达性(1.1.1.1:853 常被墙,223.5.5.5:853/223.6.6.6:853 可用)。
5.2 广告拦截(Blocking)
做什么:挂黑名单源并验证全网拦截生效。管理台入口 Settings → Blocking / Blocking 页(黑名单 URL 管理 + 立即更新按钮)。
实测 1:设置黑名单源并强制更新:
curl -s -X POST "http://127.0.0.1:8118/api/settings/set?token=$TOKEN&blockListUrls=https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts" | head -c 120
curl -s -X POST "http://127.0.0.1:8118/api/settings/forceUpdateBlockLists?token=$TOKEN"
实测回显:
{"response":{"version":"15.6.2","uptimestamp":"2026-10-19T05:03:04.07854Z","clusterInitialized":false,...}}
{"response":{},"server":"dns-lab.internal","status":"ok"}
更新落地证据:黑名单缓存文件出现在配置目录(sha256 命名,StevenBlack hosts 全量约 2.1 MB):
ls -la /opt/data/quzuo/technitium-dns/config/blocklists/
实测回显:
total 2148
drwxr-xr-x 2 root root 4096 10月 19 13:06 .
drwxr-xr-x 7 root root 4096 10月 19 13:06 ..
-rw-r--r-- 1 root root 2189155 10月 19 13:06 603e776c4f62b98ab5930dbb790e02bc215a3a571e56cc472e020ca36c8d44dd
实测 2:dig 验证拦截(默认 NxDomain 应答):
dig @127.0.0.1 -p 5300 doubleclick.net A +comments 2>&1 | head -8
实测回显:
; <<>> DiG 9.18.39-0ubuntu0.22.04.6-Ubuntu <<>> @127.0.0.1 -p 5300 doubleclick.net A +comments
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 1129
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available
实测 3:TXT 拦截报告(allowTxtBlockingReport=true 的独有能力,说明被拦原因与来源):
dig @127.0.0.1 -p 5300 doubleclick.net TXT +noall +answer
实测回显:
doubleclick.net. 30 IN TXT "source=block-list-zone; blockListUrl=https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts; domain=doubleclick.net"
实测 4:正常域名不受影响(对照):
dig @127.0.0.1 -p 5300 www.baidu.com A +noall +answer | head -2
www.baidu.com. 1200 IN CNAME www.a.shifen.com.
www.a.shifen.com. 120 IN A 110.242.69.21
💡 技术拓展:
blockingType三种应答方式的取舍——
取值 行为 取舍 AnyAddress返回 0.0.0.0(IPv6::)兼容性最好,客户端"秒失败";部分应用会把 0.0.0.0 当本机 NxDomain(默认)返回域名不存在 语义正确,客户端重试行为清晰 CustomAddress返回 customBlockingAddresses指定地址可指向自建"拦截提示页"Web 服务 本文保持默认
NxDomain。另有两个运维利器:POST /api/settings/temporaryDisableBlocking?minutes=5临时全关拦截 5 分钟(排查"网页打不开"是否误杀时用);blockingBypassList按客户端 IP 整机豁免拦截。
5.3 加密 DNS:DoT 与 DoH 服务端启用(Services)
做什么:把本机变成 DoT(853)/DoH(443)服务端。前置条件:准备 PFX 证书(自签或正式证书)→ 设置证书与开关 → 重启服务。管理台入口 Settings → Services 区块。
实测 1:生成自签 PFX 证书并放入配置目录(宿主侧 openssl,挂载进容器):
mkdir -p /opt/data/quzuo/technitium-dns/config/tls && cd /opt/data/quzuo/technitium-dns/config/tls
openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 3650 -nodes -subj "/CN=dns-lab.internal"
openssl pkcs12 -export -in cert.pem -inkey key.pem -out dns-lab.pfx -passout pass:q1w2e3r4
实测回显(证书文件生成):
-rw-r--r-- 1 root root 1131 10月 19 13:11 cert.pem
-rw------- 1 root root 2547 10月 19 13:11 dns-lab.pfx
-rw------- 1 root root 1704 10月 19 13:11 key.pem
实测 2:设置证书并启用 DoT,观察"不重启不监听"现象:
curl -s -X POST "http://127.0.0.1:8118/api/settings/set?token=$TOKEN&dnsTlsCertificatePath=/etc/dns/tls/dns-lab.pfx&dnsTlsCertificatePassword=q1w2e3r4&enableDnsOverTls=true" | python3 -c "import json,sys;print('status:',json.load(sys.stdin)['status'])"
# 查看容器内监听
docker exec technitium-dns-15.6.2-server sh -c "cat /proc/net/tcp6 | awk 'NR>1 && \$4==\"0A\" {print \$2}'"
实测回显(保存成功但 853 未出现——设置返回 ok ≠ 监听生效):
status: ok
00000000000000000000000000000000:1504
00000000000000000000000000000000:0035
(:1504 = 5380 Web 台,:0035 = 53;无 :0355 = 853)
实测 3:重启后 853 监听出现并全链路验证:
docker compose restart # 容器内无 systemd,重启容器等效"重启 DNS 服务"
docker exec technitium-dns-15.6.2-server sh -c "cat /proc/net/tcp6 | awk 'NR>1 && \$4==\"0A\" {print \$2}'"
实测回显:
00000000000000000000000000000000:0035
00000000000000000000000000000000:0355
00000000000000000000000000000000:1504
(:0355 = 853 已监听)。dig over TLS 验证权威与递归(宿主 8530→853):
dig @127.0.0.1 -p 8530 +tls lab.internal A +noall +answer
dig @127.0.0.1 -p 8530 +tls www.baidu.com A +noall +answer | head -3
实测回显:
lab.internal. 3600 IN A 10.89.46.10
www.baidu.com. 917 IN CNAME www.a.shifen.com.
www.a.shifen.com. 120 IN A 110.242.69.21
证书握手确认(自签告警属预期):
echo | openssl s_client -connect 127.0.0.1:8530 2>/dev/null | grep -E "^subject|^issuer|Verify return"
subject=CN = dns-lab.internal
issuer=CN = dns-lab.internal
Verify return code: 18 (self-signed certificate)
实测 4:启用 DoH 并以 RFC 8484 wireformat 验证(enableDnsOverHttps=true + 重启后,宿主 9543→443):
# 构造 lab.internal A 的 DNS wireformat 查询体后:
curl -sk "https://127.0.0.1:9543/dns-query" -H "content-type: application/dns-message" --data-binary @/tmp/doh_q.bin | xxd | head -4
实测回显:
00000000: 1234 8580 0001 0001 0000 0000 036c 6162 .4...........lab
00000010: 0869 6e74 6572 6e61 6c00 0001 0001 c00c .internal.......
00000020: 0001 0001 0000 0e10 0004 0a59 2e0a ...........Y..
解析:flags 8580(QR+RD+RA)、ANCOUNT 1、TTL 00000e10=3600、RDATA 0a592e0a=10.89.46.10,与权威 zone 数据一致。v15.6.2 的 DoH 按 RFC 8484 实现(wireformat),不支持 Google 风格 JSON 查询(实测 accept: application/dns-json GET 返回空体)。
⚠️ 注意:生产对外提供 DoH/DoT 应使用正式证书(Let's Encrypt 等),客户端证书校验才能通过;自签证书仅适合内网测试(
+tls或+tls-ca指定信任)。HTTP/3(DoH3)需额外开enableDnsOverHttp3并放行 UDP 443。
5.4 Zone 管理(权威域)
做什么:管理本机权威的域名。管理台入口 Zones 标签页(新建 Primary/Secondary/Stub/Conditional Forwarder zone、记录增删改查、DNSSEC 签名入口)。API 与实测:
创建 Primary zone(实测回显):
curl -s -X POST "http://127.0.0.1:8118/api/zones/create?token=$TOKEN&zone=lab.internal&type=Primary&useSoaSerialDateScheme=false&primaryNameServerAddresses=&soaResponsibility=&refresh=0&retry=0&expire=0&minimumTtl=0&defaultTtl=0&disableNS1Soa=false"
{"response":{"domain":"lab.internal"},"server":"dns-lab.internal","status":"ok"}
添加 A 记录(实测回显节选,注意 soaSerial 自动从 1→2):
{"response":{"zone":{"name":"lab.internal","type":"Primary","lastModified":"2026-10-19T05:03:40.5678041Z","disabled":false,"soaSerial":2,"catalog":null,"dnssecStatus":"Unsigned","hasDnssecPrivateKeys":false,"notifyFailed":false,"notifyFailedFor":[]},"addedRecord":{"name":"lab.internal","type":"A","ttl":3600,"ttlString":"1h","disabled":false,"rData":{"ipAddress":"10.89.46.10"},...}},"server":"dns-lab.internal","status":"ok"}
添加 CNAME 记录(web.lab.internal → lab.internal,TTL 600,实测 soaSerial→3):
{"response":{"zone":{...,"soaSerial":3,...},"addedRecord":{"name":"web.lab.internal","type":"CNAME","ttl":600,"ttlString":"10m","disabled":false,"rData":{"cname":"lab.internal"},...}},"status":"ok"}
dig 回显验证(CNAME 自动追加目标 A 记录):
dig @127.0.0.1 -p 5300 lab.internal A +noall +answer
dig @127.0.0.1 -p 5300 web.lab.internal A +noall +answer
dig @127.0.0.1 -p 5300 lab.internal SOA +noall +answer
lab.internal. 3600 IN A 10.89.46.10
web.lab.internal. 600 IN CNAME lab.internal.
lab.internal. 3600 IN A 10.89.46.10
lab.internal. 900 IN SOA dns-lab.internal. hostadmin.lab.internal. 3 900 300 604800 900
zone 列表核对:
curl -s "http://127.0.0.1:8118/api/zones/list?token=$TOKEN" | python3 -m json.tool
{
"response": {
"zones": [
{
"name": "lab.internal",
"type": "Primary",
"lastModified": "2026-10-19T05:03:40.5916066Z",
"disabled": false,
"soaSerial": 3,
"catalog": null,
"dnssecStatus": "Unsigned",
"hasDnssecPrivateKeys": false,
"notifyFailed": false,
"notifyFailedFor": []
}
]
},
"server": "dns-lab.internal",
"status": "ok"
}
💡 说明:zone 文件落盘在配置目录
zones/<域名>.zone(实测lab.internal.zone)。Secondary zone 走 AXFR/IXFR 同步主服务器;Conditional Forwarder zone 可对特定域指定上游;Single-label 等特殊域不受限制。记录级操作均支持 enable/disable(便于灰度测试)。
5.5 DHCP(默认关闭项确认)
做什么:确认内置 DHCP 处于关闭状态、明确"要不要开"。结论先说:v15.6.2 默认未启用 DHCP,三重实测证据:
- 设置面无 DHCP 开关键:
settings/get全部 131 键中无dhcpServerEnabled项; - 租约接口返回空:
GET /api/dhcp/leases/list→HTTP 200+{"response":{"leases":[]},"server":"dns-lab.internal","status":"ok"}; - 网络面未暴露:容器 EXPOSE 67/udp 但 compose 未映射,宿主
ss -lun | grep ':67 '无监听。
若确需启用:管理台 DHCP 标签页 → Enable DHCP Server → 建 Scope(网段/网关/租约期);容器形态需映射 67:67/udp,官方 compose 注明 DHCP 部署建议改用 network_mode: "host"(实查官方 docker-compose.yml 注释)。本文实测环境保持关闭(内网已有独立 DHCP)。
5.6 查询日志与缓存
查询日志(默认关,D2 巡检依赖它):logQueries=false(实测默认值)时查询日志不落盘。开启并验证:
curl -s -X POST "http://127.0.0.1:8118/api/settings/set?token=$TOKEN&logQueries=true" >/dev/null
curl -s "http://127.0.0.1:8118/api/settings/get?token=$TOKEN" | python3 -c "import json,sys;d=json.load(sys.stdin)['response'];print('logQueries =',d['logQueries'])"
dig @127.0.0.1 -p 5300 www.baidu.com A +noall +answer >/dev/null
ls /opt/data/quzuo/technitium-dns/logs/
实测回显:
logQueries = True
2026-10-19.log
日志按天滚动(<日期>.log),配合 DNS_SERVER_LOG_MAX_LOG_FILE_DAYS=90(部署时设置)自动清理。useLocalTime=false 默认 UTC 时间戳。
缓存:serveStale=true(默认开)+ serveStaleTtl=259200(3 天)——上游故障时用过期缓存应答;clientTimeout=2000 毫秒。这两项默认值即合理,无需改动。
六、生产配置模板
适用于 16GB 内存/普通 SSD/50-500 终端的办公或家庭网络(单节点,Docker Compose 部署为底,本文全部参数已实测):
| 类别 | 键 | 推荐值 | 理由 |
|---|---|---|---|
| 递归 | recursion | AllowOnlyForPrivateNetworks(默认) | 仅私网可递归,防开放解析器被滥用 |
| 递归 | qnameMinimization | true(默认) | 隐私默认开启 |
| 转发 | forwarders | 留空走递归;或 223.5.5.5,223.6.6.6 + Tls | 国内加密上游可达性优先 |
| 拦截 | blockListUrls | https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts | 2.1 MB 全量源,误杀率低 |
| 拦截 | blockingType | NxDomain(默认) | 语义正确 |
| 日志 | logQueries | true | 巡检与故障定位基础(D2 依赖) |
| 日志 | DNS_SERVER_LOG_MAX_LOG_FILE_DAYS | 90 | 盘占用可控 |
| 缓存 | serveStale / serveStaleTtl | true / 259200(默认) | 上游抖动时兜底 |
| 加密 | dnsTlsCertificatePath + enableDnsOverTls/enableDnsOverHttps | 正式证书 + 按需 true | 对外服务必备 |
| 访问 | 管理台 | 强密码 + TOTP 2FA;仅内网暴露 | Web 台即控制面 |
⚠️ 注意:不要在公网暴露 53 递归与 5380 Web 台(防 DDoS 反射与爆破);必须暴露时用防火墙白名单或前置反代。
七、常见问题(FAQ)
Q1:settings/set 返回 ok 但行为没变?
两类原因:① 该项需重启服务(加密 DNS 开关/证书,见 5.3 实测:返回 ok 后 853 未监听,重启后出现);② 改错了生效对象(如改了 DNS_SERVER_* 环境变量——它们只在首次初始化生效)。
Q2:拦截了不该拦的域名?
用 dig <域名> TXT 查拦截报告(5.2 实测格式,直接给出命中的 blockListUrl);到 Blocking 页把域名加进 Allowed Zone,或把该黑名单源移除后 forceUpdateBlockLists。
Q3:转发器配了但不解析?
按 5.1 实测路径定位:先 dig +comments 看有无应答——无应答多为上游不可达(本文 1.1.1.1:853 实测无输出),换协议(Udp)或换可达上游对照;有 status: SERVFAIL 则看系统日志定位 DNSSEC/网络层。
Q4:证书配好后 DoH 客户端报证书错误?
自签证书对客户端不可信(openssl 实测 Verify return code: 18 (self-signed certificate))。客户端 +tls-ca 指定自签 CA 或换正式证书。
Q5:忘记 admin 密码?
DNS_SERVER_ADMIN_PASSWORD 仅首次初始化生效;重置方式:备份 config 目录后删除 auth.config 重启(恢复初始 admin/password,强制重新设置),再从备份人工找回用户数据;或以其他管理员账号登录后 Users 页重置。
Q6:配置怎么备份/回滚?
管理台 Settings → Backup/Restore(zip,可含 zones/logs/stats/blocklists),或 API POST /api/settings/backup?...;目录级 tar 见部署篇第五节。配置为二进制格式,勿用文本 diff/合并工具处理。
八、参考链接
- 官方 HTTP API 文档(settings/set 全参数):https://github.com/TechnitiumSoftware/DnsServer/blob/master/APIDOCS.md(查询日期 2026-10-19)
- Docker 环境变量文档:https://github.com/TechnitiumSoftware/DnsServer/blob/master/DockerEnvironmentVariables.md(查询日期 2026-10-19)
- 官方在线帮助(Settings 页面各区块说明):https://go.technitium.com/?id=25(查询日期 2026-10-19)
- StevenBlack/hosts 黑名单源:https://github.com/StevenBlack/hosts(查询日期 2026-10-19)
- 系列文档:《Technitium DNS Server Docker Compose 部署指南》《Technitium DNS Server 日常运维与监控告警手册》