
1. 从一个真实需求说起为什么自建 DNS 解析服务很多做后端或运维的朋友都遇到过这样的场景内网有一批服务需要互相调用用 IP 直连吧改一次地址就要翻遍所有配置文件用公网域名吧解析延迟高不说流量还绕了一圈公网。这时候自建一套 DNS 解析服务就成了刚需。我最早接触 DNS 服务搭建是因为一个内部测试环境的需求。当时团队有十几台机器跑着各种微服务和中间件每次环境迁移或者扩容光是改 hosts 文件就让人崩溃。后来想着干脆搭一个内部 DNS把所有服务名统一管理起来谁需要解析就指向这台 DNS 服务器。试过几种方案之后最终选定了 Windows Server 自带的 DNS 服务角色原因很简单图形化界面友好、和现有域环境集成度高、维护成本低。这篇文章要聊的就是围绕 Windows Server 上 DNS 服务的完整实战过程。从角色安装、区域规划、记录管理到转发器配置、条件转发、排错思路我会把整个链路拆开揉碎讲清楚。不管你是刚接触 DNS 的新手还是想系统梳理一遍的老手应该都能从中找到有用的东西。文章里涉及的操作步骤和参数配置都来自实际项目中的反复验证不是照搬文档。2. 安装 DNS 服务角色前的规划工作2.1 先想清楚这台 DNS 服务器扮演什么角色在动手安装之前有一个问题必须先回答这台 DNS 服务器是只服务于内网解析还是同时要承担公网域名解析这个定位直接决定了后续的配置策略。如果只做内网解析那它就是一台纯粹的内部 DNS 服务器只需要创建正向查找区域把内部服务名和 IP 的对应关系维护好就行。客户端把 DNS 指向它所有内部域名都能解析外部域名通过转发器交给上游 DNS 处理。如果还要承担公网解析那就涉及到权威 DNS 的概念了。你需要为某个公网域名创建区域配置 SOA、NS、A 记录等还要考虑和域名注册商的对接。这种场景一般企业用得少除非是自己管理域名解析。我建议大部分内部场景就按第一种来规划简单、可控、不容易出问题。下面要讲的也是以内部 DNS 为主公网解析的部分会简单提一下思路。2.2 网络拓扑和 IP 规划DNS 服务器的 IP 地址必须是静态的这一点没有商量余地。如果 DNS 服务器自己都用动态 IP那客户端配置的 DNS 地址过一段时间就失效了整个解析链路直接崩掉。假设我们有一台 Windows ServerIP 规划如下项目值说明服务器 IP192.168.10.10静态地址子网掩码255.255.255.0标准 C 类网关192.168.10.1出口设备DNS 服务器自身 DNS127.0.0.1指向自己备用 DNS8.8.8.8上游公共 DNS这里有个细节值得说一下DNS 服务器自己的 DNS 地址应该指向自己127.0.0.1 或本机 IP而不是直接填上游 DNS。原因在于如果指向外部那么本机在解析内部域名时就会去问外部服务器结果当然是解析失败。指向自己之后内部域名由本地区域负责解析外部域名通过转发器转发出去逻辑才闭环。2.3 区域命名的选择内部域名用什么后缀内部域名的后缀选择是个容易被忽视但影响深远的问题。常见的有几种做法用internal.xxx.com这种子域名形式好处是不会和公网域名冲突坏处是名字比较长。用xxx.local这种本地后缀简单好记但要注意某些场景下.local会和 mDNS 冲突。直接用单标签名字比如server1、db不带后缀解析的时候直接写主机名就行。我个人比较推荐用internal.xxx.com这种形式结构清晰不容易和外部域名混淆。如果团队规模小、服务不多用单标签名字也完全可以配置起来更省事。3. 安装与基础配置的完整操作链路3.1 通过服务器管理器添加 DNS 角色安装过程本身不复杂但有几个地方容易踩坑我一步步说。打开服务器管理器点击添加角色和功能一路下一步到服务器角色页面勾选DNS 服务器。这时候会弹出一个提示框告诉你需要一些额外的功能支持直接点添加功能就行。继续下一步到确认页面点击安装。安装完成后服务器管理器里会出现 DNS 的管理入口。如果你习惯用命令行也可以用 PowerShell 一条命令搞定Install-WindowsFeature -Name DNS -IncludeManagementTools安装完成后建议重启一下服务器虽然不重启也能用但重启能确保所有服务状态正常。注意如果这台服务器同时装了 Active Directory 域服务DNS 角色可能会在域控提升过程中自动安装。这种情况下不需要手动再装一遍直接配置就行。3.2 创建正向查找区域安装完角色之后打开DNS 管理器展开服务器节点右键正向查找区域选择新建区域。向导会问你几个问题区域类型选主要区域。如果这台 DNS 是域控的一部分并且区域要复制到其他 DNS 服务器可以勾选在 Active Directory 中存储区域。纯内部解析场景下选主要区域就够了。区域名称填你规划好的域名比如internal.example.com。区域文件默认会创建一个同名.dns文件保持默认即可。动态更新如果不需要客户端自动注册记录选不允许动态更新。需要的话可以选仅安全更新。创建完成后在正向查找区域里就能看到这个新区域了。区域里面会自动生成两条记录SOA 和 NS这是 DNS 区域的基础记录不用动它们。3.3 添加 A 记录和 CNAME 记录区域建好了接下来就是往里加记录。右键区域名称选择新建主机A 或 AAAA。举个例子我们要把db.internal.example.com解析到192.168.10.20名称填dbIP 地址填192.168.10.20勾选创建相关的指针PTR记录如果反向区域已经建好这样一条 A 记录就加好了。客户端把 DNS 指向这台服务器之后db.internal.example.com就能解析到对应的 IP。CNAME 记录用来做别名。比如mysql.internal.example.com是db.internal.example.com的别名那就新建一条 CNAME名称填mysql目标填db.internal.example.com。这样两个名字都能解析到同一个 IP以后换 IP 只需要改 A 记录CNAME 不用动。批量添加记录的时候用 PowerShell 效率更高Add-DnsServerResourceRecordA -Name db -ZoneName internal.example.com -IPv4Address 192.168.10.20 Add-DnsServerResourceRecordCName -Name mysql -ZoneName internal.example.com -HostNameAlias db.internal.example.com3.4 反向查找区域的建立反向查找区域的作用是通过 IP 反查域名。很多场景下这个功能不是必须的但有些应用会依赖反向解析来做日志记录或者访问控制所以建议还是建上。右键反向查找区域新建区域选择主要区域网络 ID 填192.168.10向导会自动创建10.168.192.in-addr.arpa这个反向区域。建好之后添加 PTR 记录把 IP 和域名对应起来。如果正向区域添加 A 记录时勾选了创建相关的指针记录PTR 会自动生成不用手动加。4. 转发器与条件转发的配置策略4.1 转发器让内部 DNS 能解析外部域名内部 DNS 服务器只负责自己区域内的域名解析那客户端想访问外部网站怎么办这就需要配置转发器。在 DNS 管理器里右键服务器节点选择属性切换到转发器选项卡。点击编辑添加上游 DNS 服务器的 IP比如8.8.8.8和114.114.114.114。配置好之后当客户端请求解析www.example.com这种外部域名时内部 DNS 发现自己没有这个区域就会把请求转发给上游 DNS拿到结果后再返回给客户端。这里有个经验转发器最好配两个以上避免单个上游 DNS 故障导致解析中断。另外如果内网有防火墙要确保 DNS 服务器能正常访问上游 DNS 的 53 端口。4.2 条件转发把特定域名交给指定服务器解析条件转发是转发器的一个精细化版本。它的作用是只把特定域名的解析请求转发给指定的 DNS 服务器其他域名还是走默认转发器。什么场景下会用到举个例子公司有两个内网环境一个是internal.example.com另一个是test.example.com分别由不同的 DNS 服务器管理。你希望本地的 DNS 服务器在解析test.example.com时直接问那台专门的 DNS 服务器而不是走默认转发器。配置方法右键条件转发器新建条件转发器DNS 域名填test.example.comIP 地址填对应的 DNS 服务器 IP。这样配置之后所有以test.example.com结尾的解析请求都会转发到指定的服务器。条件转发的优先级高于默认转发器所以不用担心冲突问题。4.3 转发器和条件转发的选择逻辑很多人搞不清楚什么时候用转发器、什么时候用条件转发。我总结了一个简单的判断标准场景选择原因所有外部域名都交给同一组上游 DNS转发器配置简单统一出口特定域名需要单独指定 DNS 服务器条件转发精细化控制互不干扰内网多个域之间需要互访条件转发每个域指向各自的 DNS只想让部分域名走特定线路条件转发按域名分流实际项目中两者经常是配合使用的默认转发器负责大部分外部解析条件转发处理特殊域名的定向解析。5. 客户端配置与解析验证5.1 客户端 DNS 指向的配置方式DNS 服务器搭好了客户端得知道去哪里解析。配置方式有几种手动配置在网络适配器属性里把 DNS 服务器地址改成内部 DNS 的 IP。适合服务器和固定设备。DHCP 下发如果网络里有 DHCP 服务器可以在 DHCP 作用域选项里配置 DNS 服务器地址客户端自动获取。适合大量终端。组策略下发域环境下通过组策略统一配置 DNS 设置。适合集中管理的场景。不管用哪种方式核心就是让客户端的 DNS 指向这台内部 DNS 服务器。5.2 用 nslookup 验证解析结果配置完成后第一件事就是验证解析是否正常。nslookup是最常用的工具。nslookup db.internal.example.com如果返回了正确的 IP 地址说明正向解析没问题。再试试反向解析nslookup 192.168.10.20返回对应的域名说明 PTR 记录也正常。再验证一下外部域名解析nslookup www.example.com如果能正常返回结果说明转发器配置生效了。5.3 解析失败的常见原因排查解析失败的原因有很多我按排查顺序列一下客户端 DNS 指向是否正确先用ipconfig /all确认 DNS 服务器地址。DNS 服务是否运行在服务器上检查 DNS 服务状态。区域和记录是否存在在 DNS 管理器里确认记录有没有建错。转发器是否可达在 DNS 服务器上 ping 一下上游 DNS确认网络通。防火墙是否放行DNS 用的是 UDP 53 和 TCP 53确认防火墙规则。按照这个顺序排查大部分问题都能定位到。6. 日常维护与高频问题处理6.1 记录的批量管理与清理DNS 记录用久了会积累很多废弃条目定期清理很有必要。PowerShell 可以批量导出和删除记录# 导出所有 A 记录 Get-DnsServerResourceRecord -ZoneName internal.example.com -RRType A | Export-Csv dns_records.csv -NoTypeInformation # 删除指定记录 Remove-DnsServerResourceRecord -ZoneName internal.example.com -Name old-server -RRType A -Force建议每个月做一次记录审查把不再使用的记录清理掉避免解析混乱。6.2 日志与监控的配置DNS 服务默认不记录详细日志出问题的时候不好排查。可以在 DNS 管理器里右键服务器属性切换到调试日志选项卡勾选启用调试日志记录并配置日志文件路径和大小。不过调试日志会占用磁盘空间也会影响性能所以只建议在排查问题时临时开启问题解决后关掉。日常监控的话可以关注几个指标查询量、失败率、响应时间。Windows 性能监视器里有对应的计数器可以配置数据收集器集定期记录。6.3 区域传输与冗余配置如果对可用性要求高可以配置多台 DNS 服务器做冗余。主 DNS 服务器配置区域传输把区域数据同步到辅助 DNS 服务器。配置方法在主 DNS 的区域属性里切换到区域传送选项卡允许传送到指定的辅助服务器 IP。然后在辅助服务器上新建辅助区域指定主服务器的 IP区域数据会自动同步过来。客户端配置两个 DNS 地址一个主一个备主挂了自动切到备解析不中断。6.4 几个容易踩的坑最后分享几个我在实际项目中踩过的坑DNS 服务器自己指向了外部 DNS导致内部域名解析失败一定要指向自己。转发器只配了一个上游 DNS 挂了之后整个解析链路瘫痪至少配两个。区域名称和公网域名冲突比如内部用了example.com结果外部解析被劫持到内网访问不了真正的公网服务。内部域名一定要加后缀区分。忘记建反向区域某些应用依赖反向解析没有 PTR 记录会导致功能异常。动态更新没关客户端自动注册了一堆乱七八糟的记录区域文件越来越乱。不需要动态更新就关掉。这些问题看起来简单但真到出故障的时候往往就是这些细节在作怪。希望这篇内容能帮你在搭建和维护 DNS 服务的时候少走一些弯路。