拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Docker 部署 PowerDNS + pdnsadmin + pdns-recursor:内网 DNS 解析配置与验证

Docker 部署 PowerDNS + pdnsadmin + pdns-recursor:内网 DNS 解析配置与验证 1. 内网 DNS 为什么值得自己搭一套内网服务一多靠 hosts 文件互相抄 IP 就开始失控测试环境换台机器、容器重建一次 IP 就变开发同事的配置各不相同出了问题没人说得清某个域名到底解析到哪。你需要的其实是一个能自己管记录、能递归查外网、还能有个网页界面点点鼠标就改 A 记录的内网 DNS。这套方案由三个角色组成PowerDNS Authoritative权威服务负责回答你自己域名的解析、PowerDNS Admin网页管理面板用来增删域名和记录、PowerDNS Recursor递归解析器负责把内网域名转发给权威服务、把外网域名转发给公共 DNS。三者分工明确权威服务监听 5300 端口递归器独占 53 端口对外提供服务客户端只需要把 DNS 指向递归器所在机器即可。适合谁手里有几台内网服务器、跑着 Docker、希望用域名而不是 IP 访问内部服务的运维或后端同学。下面所有配置我都实测跑通过你可以直接复制改 IP 使用。2. 前置准备目录结构与 TaoToken 接入信息先说环境。一台 Linux 机器CentOS 7/8 或 Ubuntu 20.04 都行装好 Docker 与 docker-compose防火墙放行 53/udp、53/tcp、5300/tcp、5300/udp、9191/tcp。假设这台机器内网 IP 是192.168.109.169后面所有配置都围绕它展开。创建目录结构把配置和数据库数据都挂出来容器删了数据还在mkdir -p /opt/powerdns/{pdns/config,pdnsdb/data,pdnsdb/init-scripts,pdnsadmindb/data} cd /opt/powerdns如果你在调试过程中需要对照 PowerDNS 的接口文档、或者用大模型帮忙排查配置报错可以顺手准备一个 API 入口。TaoToken 的 API 地址是https://taotoken.net/api控制台在https://taotoken.net/consoleAPI Key 在https://taotoken.net/api-keys生成。它的模型对话页https://taotoken.net/model-chat适合临时问一句「pdns 的 gmysql 后端报 1045 怎么查」长期写代码或跑 Agent 的话用 Coding Plan 更划算https://taotoken.net/coding-plan。这些链接都带utm_sourcetaotoken_aicg_blog_endutm_campaignrewrite从 CSDN 点过去能对上来源。注意TaoToken 只是模型调用入口不要把它和 DNS 服务混在一起理解两者互不依赖。3. 可复制的 docker-compose 配置权威服务和面板都用容器跑递归器为了简单直接装在宿主机上也可以容器化但宿主机装省去网络模式折腾。先写docker-compose.yamlversion: 3 services: pdnsdb: image: mysql:5.7.35 restart: always environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: pdns MYSQL_USER: pdns MYSQL_PASSWORD: pdns123 volumes: - ./pdnsdb/data:/var/lib/mysql - ./pdnsdb/init-scripts:/docker-entrypoint-initdb.d networks: - pdns_net pdns: image: powerdns/pdns-auth-47:4.7.4 restart: always user: root privileged: true environment: SECRET_KEY: qwerasdf ports: - 5300:5300/tcp - 5300:5300/udp volumes: - ./pdns/config:/etc/powerdns depends_on: - pdnsdb networks: - pdns_net pdnsadmindb: image: mysql:5.7.35 restart: always environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: pdnsadmin MYSQL_USER: pdnsadmin MYSQL_PASSWORD: pdnsadmin123 volumes: - ./pdnsadmindb/data:/var/lib/mysql networks: - pdns_net pdnsadmin: image: powerdnsadmin/pda-legacy:v0.3.0 restart: always ports: - 9191:80 environment: - SQLALCHEMY_DATABASE_URImysql://pdnsadmin:pdnsadmin123pdnsadmindb/pdnsadmin - GUNICORN_TIMEOUT60 - GUNICORN_WORKERS2 - GUNICORN_LOGLEVELDEBUG depends_on: - pdns - pdnsadmindb networks: - pdns_net networks: pdns_net: driver: bridge关键点在于权威服务端口改成 5300把 53 让给递归器。接着写权威服务配置pdns/config/pdns.confapiyes api-keyqwerasdf launchgmysql gmysql-hostpdnsdb gmysql-port3306 gmysql-dbnamepdns gmysql-userpdns gmysql-passwordpdns123 local-address0.0.0.0 local-port5300 webserveryes webserver-address0.0.0.0 webserver-allow-from0.0.0.0/0 webserver-port8081 enable-lua-recordsyesapiyes和api-key是给 pdnsadmin 对接用的面板通过这个 Key 调权威服务的 HTTP API 来读写记录。webserver-port8081是权威服务自己的 API 端口容器内部用不需要映射出来。启动容器docker-compose up -d docker-compose ps四个容器都 Up 之后权威服务已经在 5300 端口待命了。4. pdnsadmin 初始化与 API Key 对接浏览器打开http://192.168.109.169:9191第一次进会要求创建管理员账号填邮箱和密码即可。登录后进入 Settings找到 PDNS 相关配置把权威服务的 API 地址和 Key 填进去API URLhttp://pdns:8081容器内网络互通用服务名API Keyqwerasdf和 pdns.conf 里的 api-key 一致保存后回到 Dashboard如果能看到权威服务的版本信息说明对接成功。接着新建一个 Zone比如source.app.cn类型选 Native然后在里面加 A 记录例如test-source.app.cn - 192.168.109.169。这里有个容易踩的坑pdnsadmin 容器和 pdns 容器必须在同一个 Docker 网络里否则http://pdns:8081解析不到。上面的 compose 已经把它们放进pdns_net不用额外处理。5. 递归器配置与解析链路验证宿主机装递归器yum install pdns-recursor -y编辑/etc/pdns-recursor/recursor.confallow-from0.0.0.0/0,::/0 forward-zones-file/etc/pdns-recursor/zones forward-zones-recurse.223.5.5.5, .114.114.114.114 local-address0.0.0.0 local-port53 setgidpdns-recursor setuidpdns-recursor再写/etc/pdns-recursor/zones把内网域名指向权威服务的 5300 端口test-source.app.cn192.168.109.169:5300 local-source.app.cn192.168.109.169:5300每次改完 zones 文件都要重启递归器systemctl restart pdns-recursor systemctl enable pdns-recursor验证链路。先在服务器本机用 dig 直接问递归器dig 127.0.0.1 test-source.app.cn A short如果返回192.168.109.169说明递归器把请求转发给了权威服务权威服务从 MySQL 里查到了记录。再验证外网解析dig 127.0.0.1 www.baidu.com A short能返回公网 IP说明forward-zones-recurse生效了。客户端侧Windows 上把 DNS 改成192.168.109.169然后nslookup test-source.app.cn 192.168.109.169 ping test-source.app.cn ipconfig /allLinux 客户端改/etc/resolv.conf加nameserver 192.168.109.169重启网络后ping test-source.app.cn应该能通。交换机上把 DHCP 下发的 DNS 改成这台机器全网设备就都走内网解析了。6. 本篇常见报错排查权威服务起不来日志报 gmysql 连接失败检查 pdnsdb 容器是否健康docker-compose logs pdnsdb看 MySQL 是否初始化完成。compose 里depends_on只保证启动顺序不保证 MySQL 就绪必要时等几秒再重启 pdns 容器。pdnsadmin 登录后看不到 Zone八成是 API URL 填错。容器内要用服务名pdns而不是localhost端口是 8081 不是 5300。5300 是对外 DNS 端口8081 才是 API 端口。dig 内网域名超时先确认递归器进程在跑systemctl status pdns-recursor再确认 zones 文件里的 IP 和端口写对最后确认权威服务 5300 端口从宿主机能通telnet 192.168.109.169 5300。外网域名解析不了检查forward-zones-recurse那行有没有写错逗号分隔的两个上游 DNS 都要在。改完记得重启递归器。客户端改了 DNS 还是不生效Windows 上ipconfig /flushdns清缓存Linux 上看/etc/resolv.conf有没有被 NetworkManager 覆盖。排查过程中如果拿不准某个报错含义可以把日志贴到https://taotoken.net/model-chat让模型帮你读比翻文档快。需要批量生成配置或写自动化脚本时https://taotoken.net/coding-plan的额度更耐用。API Key 统一在https://taotoken.net/api-keys管理接入文档在https://taotoken.net/docClaude Code 相关配置参考https://taotoken.net/claudecode-anthropic。整套跑通后你改一条内网记录只需要在 pdnsadmin 网页上点几下递归器那边 zones 文件不用动因为转发是按域名后缀匹配的客户端无感知。真正需要重启递归器的场景只有新增一个全新的内网域名后缀时。
返回列表