DNS 怎么设置?Linux、Windows 服务器与网络设备的 DNS 配置
服务器的 DNS 怎么设置,关键是找对地方:Linux 先看 /etc/resolv.conf 归谁管理,再用 nmcli、netplan 或 resolved.conf 修改;Windows Server 用 netsh 或 PowerShell;交换机用 dns server、ip name-server 等命令。首选填机房提供的 DNS,备用填另一家,改完逐个验证并清缓存。
DNS 怎么设置,先要分清设置的是什么。服务器上的 DNS 地址,是一台递归解析服务器的 IP,告诉系统“域名查询发给谁”;它和网站域名的解析记录是两回事,后者在域名服务商的后台添加。本文讲前者:Linux 服务器先判断 /etc/resolv.conf 由哪个组件管理,再用对应的方法写入;Windows Server 用图形界面、netsh 或 PowerShell;交换机和路由器上的 DNS 有两种用途,一种给设备自己解析域名,另一种通过 DHCP 下发给客户端。下面先说填什么,再分系统给出步骤,最后是验证和清缓存。
DNS 地址在哪里找到,首选和备用怎么填
DNS 地址按优先顺序有三个来源:
- 机房或服务商提供的递归 DNS。服务器交付信息、客户面板的网络信息里通常会写;托管的服务器向机房索取。路径短,也不受公共 DNS 查询频率限制的影响。
- 机房内网自建的 DNS。需要解析内部名称(如管理网里的设备)时,必须用它。
- 公共 DNS。前两者都没有时使用:
| 服务 | IPv4 地址 |
|---|---|
| 阿里公共 DNS | 223.5.5.5、223.6.6.6 |
| 腾讯 DNSPod 公共 DNS | 119.29.29.29 |
| 114 DNS | 114.114.114.114、114.114.115.115 |
| 百度公共 DNS | 180.76.76.76 |
| Google Public DNS | 8.8.8.8、8.8.4.4 |
| Cloudflare | 1.1.1.1、1.0.0.1 |
地址以各服务官方公布的为准;表里只列一个地址的服务,备用 DNS 填另一家的地址。想知道服务器当前在用哪个 DNS:Linux 执行 resolvectl status(使用 systemd-resolved 时)或 cat /etc/resolv.conf,NetworkManager 管理的系统还可以用 nmcli device show eth0 | grep DNS;Windows 执行 ipconfig /all,看“DNS 服务器”那一行。
首选和备用怎么填,先记住一条规则:备用只在首选没有应答时才会被使用;首选明确回答“域名不存在”,系统不会再去问备用。由此有三点做法:
- 首选填可靠且离得近的,通常是机房 DNS;备用最好换一家服务,例如一个公共 DNS,机房 DNS 整体故障时还有退路。
- 内网 DNS 和公共 DNS 不要混填成首选和备用。内网 DNS 能解析
pdu-a01.dc.example.com,公共 DNS 不能;首选一旦短暂超时,系统改问公共 DNS,拿到“不存在”的答复还会缓存下来,内部名称就会时好时坏。要么两个都填内网 DNS(部署两台),要么在内网 DNS 上配置转发。 - 加入 Active Directory 域的 Windows 服务器只填域控的 DNS。填了公共 DNS,会出现找不到域控、加域失败、登录缓慢;访问外网的解析交给域控 DNS 上配置的转发器。
Linux 服务器:先看 resolv.conf 归谁管
Linux 上大多数程序按 /etc/resolv.conf 找 DNS,但这个文件很可能是别的组件自动生成的,直接改会被覆盖。先看清它的来历:
ls -l /etc/resolv.conf
head -3 /etc/resolv.conf
| 看到的情况 | 谁在管理 | 该改哪里 |
|---|---|---|
链接到 ../run/systemd/resolve/stub-resolv.conf,内容是 nameserver 127.0.0.53 |
systemd-resolved,Ubuntu 18.04 起默认如此 | netplan,或 resolved.conf |
普通文件,开头注释 # Generated by NetworkManager |
NetworkManager,RHEL、Rocky、AlmaLinux 默认如此 | nmcli |
链接到 /run/resolvconf/resolv.conf |
resolvconf 软件包 | Debian 的 /etc/network/interfaces 里的 dns-nameservers |
| 普通文件,没有任何生成提示 | 没有组件接管 | 直接编辑 |
直接编辑 resolv.conf
没有组件接管时,直接写入:
nameserver 223.5.5.5
nameserver 119.29.29.29
options timeout:2 attempts:2
glibc 最多读取前 3 个 nameserver,按顺序询问;默认每个服务器等 5 秒、整轮尝试 2 次,首选宕机时每次解析都要先卡 5 秒。options timeout:2 把单次等待缩短到 2 秒;再加上 rotate,查询会在几台服务器之间轮流发送,分摊压力,但每次先问哪台就不固定了。search dc.example.com 能让短名 pdu-a01 自动补全成完整域名。
Debian 用 ifupdown 管理网络时,/etc/network/interfaces 里的 dns-nameservers 223.5.5.5 119.29.29.29 只有装了 resolvconf 软件包才生效;没装时这一行被忽略,仍以 resolv.conf 为准。
NetworkManager:用 nmcli 修改连接
nmcli connection show # 找到连接名,它不一定等于网卡名
nmcli connection modify "System eth0" ipv4.dns "223.5.5.5 119.29.29.29" ipv4.ignore-auto-dns yes
nmcli device reapply eth0 # 把修改应用到网卡;不支持时用 nmcli connection up "System eth0"
nmcli -g ipv4.dns connection show "System eth0"
ipv4.ignore-auto-dns yes 让 DHCP 下发的 DNS 不再混进来。只想在现有列表后追加一个地址时用加号,例如 nmcli connection modify "System eth0" +ipv4.dns 223.6.6.6,删除某个地址则用减号。远程操作时注意:nmcli connection up 会让连接重新激活,网络可能短暂中断,动手前确认有控制台可用。
Ubuntu:在 netplan 里写 nameservers
# /etc/netplan/ 下的配置文件,文件名以实际为准
network:
version: 2
ethernets:
eth0:
addresses: [203.0.113.20/24]
routes:
- to: default
via: 203.0.113.1
nameservers:
addresses: [223.5.5.5, 119.29.29.29]
search: [dc.example.com]
sudo netplan try # 应用新配置,120 秒内不按回车确认就自动回滚
sudo netplan apply
resolvectl dns eth0 # 确认这块网卡上的 DNS
远程修改网络配置时优先用 netplan try:写错导致连不上,两分钟后自动恢复。配置文件由 cloud-init 生成时(文件名多为 50-cloud-init.yaml),要先关闭 cloud-init 的网络配置,否则重启后会被改回去。
systemd-resolved:设置全局 DNS
不想按网卡配置,或者系统没有 netplan,可以在 /etc/systemd/resolved.conf 里设置全局 DNS:
[Resolve]
DNS=223.5.5.5 119.29.29.29
FallbackDNS=
sudo systemctl restart systemd-resolved
resolvectl status
全局的 DNS= 会与各网卡上的 DNS 一起使用,并不会覆盖它们;FallbackDNS= 写成空值,表示不使用编译进系统的备用公共 DNS(各发行版的默认值不同)。在 resolvectl status 输出里看 Current DNS Server,就知道实际在用哪一台。不要为了绕开 systemd-resolved 把 /etc/resolv.conf 从链接改成普通文件,除非你打算停用它。
Windows Server:图形界面、netsh 与 PowerShell
图形界面:按 Win + R 输入 ncpa.cpl,右键网卡选“属性”,双击“Internet 协议版本 4 (TCP/IPv4)”,选择“使用下面的 DNS 服务器地址”,填入首选和备用;点“高级 → DNS”可以添加第三个及以后的地址并调整顺序。
命令行有两套写法,先查出网卡名称和索引号:
Get-NetAdapter | Select-Object Name, InterfaceIndex, Status
PowerShell(Windows Server 2012 及以后):
Set-DnsClientServerAddress -InterfaceIndex 6 -ServerAddresses ("223.5.5.5","119.29.29.29")
Get-DnsClientServerAddress -InterfaceIndex 6 -AddressFamily IPv4
Set-DnsClientServerAddress -InterfaceIndex 6 -ResetServerAddresses # 改回自动获取
netsh(老系统和现有脚本里常见,网卡名按实际填写,中文系统多为“以太网”):
netsh interface ipv4 set dnsservers name="以太网" source=static address=223.5.5.5 register=primary validate=no
netsh interface ipv4 add dnsservers name="以太网" address=119.29.29.29 index=2 validate=no
netsh interface ipv4 show dnsservers
validate=no 跳过写入前的连通性检查,DNS 暂时不可达时也能先写进去。
Windows 上还有两点要注意:
- 多块网卡时,只在业务网卡上填 DNS。内网卡、管理网卡的 DNS 留空。首选 DNS 没有及时应答时,Windows 会把查询发给所有网卡上配置的 DNS,几块网卡填了不同的 DNS,解析结果就取决于谁先应答。
- Server Core 没有图形界面,用上面的 PowerShell 命令,或者运行
sconfig,在网络设置菜单里修改。
交换机和路由器上的 DNS 设置
网络设备上的 DNS 有两种用途,命令完全不同。
第一种:给设备自己用,让交换机能 ping 域名、用域名指定 NTP 或日志服务器。以下按常见版本写出,具体语法以设备型号对应的手册为准。
# 华为 VRP,系统视图
dns resolve
dns server 223.5.5.5
dns server 119.29.29.29
display dns server
# 新华三 Comware,系统视图
dns server 223.5.5.5
display dns server
# 思科 IOS,全局配置模式
ip domain lookup
ip name-server 223.5.5.5 119.29.29.29
show hosts
思科 IOS 默认开启域名查找,很多工程师习惯用 no ip domain-lookup 关掉它,免得敲错的命令被当成主机名去解析、卡住半天;但关掉之后设备就解析不了任何域名,配置 DNS 前要先把它打开。设备经管理 VRF 访问 DNS 时(如 NX-OS 的 mgmt0 口),写成 ip name-server 223.5.5.5 use-vrf management。
第二种:通过 DHCP 下发给客户端。交换机或路由器做 DHCP 服务器时,在地址池里指定 DNS,客户端获取 IP 时一并拿到:
# 思科 IOS
ip dhcp pool VLAN10
network 10.0.10.0 255.255.255.0
default-router 10.0.10.1
dns-server 223.5.5.5 119.29.29.29
# 华为 VRP,全局地址池(还需 dhcp enable,并在 VLANIF 接口下执行 dhcp select global)
ip pool vlan10
gateway-list 10.0.10.1
network 10.0.10.0 mask 255.255.255.0
dns-list 223.5.5.5 119.29.29.29
新华三在 dhcp server ip-pool 视图下同样用 dns-list。各厂商的语法随系统版本略有差异,以设备手册为准。改了 DHCP 下发的 DNS 后,客户端要等到续租或手动重新获取地址(Windows 执行 ipconfig /renew,Linux 重新激活连接)才会拿到新值。
改完怎么验证:nslookup 与清缓存
按顺序做四步:
- 确认配置已生效。Linux 用
resolvectl dns或cat /etc/resolv.conf,Windows 用Get-DnsClientServerAddress。 - 首选和备用分别测一次。只测默认那个的话,备用坏了要等到首选出故障那天才会发现:
nslookup www.example.com 223.5.5.5
nslookup www.example.com 119.29.29.29
两条都返回地址才算通过;输出开头的 Server: 一行,是这次回答的服务器。
- 再用系统解析器测一次。nslookup 和 dig 直接向 DNS 服务器发包,不读 hosts 文件,也不走系统的解析流程;程序实际怎么解析,要这样测:
getent hosts www.example.com # Linux,与应用程序走同一套流程
time getent hosts www.example.com # 耗时超过 1 秒,多半是首选不通、在等超时
Resolve-DnsName www.example.com # Windows,会读取 hosts 文件和本机缓存
- 清掉缓存,让之前缓存的旧结果失效:
| 平台 | 清缓存命令 |
|---|---|
| Linux(systemd-resolved) | resolvectl flush-caches |
| Linux(nscd) | nscd -i hosts |
| Linux(dnsmasq 做本地缓存) | systemctl restart dnsmasq |
| Windows | ipconfig /flushdns 或 Clear-DnsClientCache |
| 华为交换机 | reset dns dynamic-host |
| 思科 IOS | clear host * |
没有装任何缓存服务的 Linux,本机不缓存解析结果,不用清。
改完之后常见的几种问题:
| 现象 | 原因 | 处理 |
|---|---|---|
| 改完重启又变回去 | 被 NetworkManager、netplan、cloud-init 或 DHCP 重新写入 | 回到“归谁管”那张表,改源头的配置 |
| nslookup 正常,程序报无法解析 | hosts 文件里有错误条目;或 resolv.conf 指向 127.0.0.53,而 systemd-resolved 没在运行 | 用 getent 复现,检查 systemctl status systemd-resolved |
| 每次解析都慢几秒 | 首选 DNS 不可达,每次先等超时 | 换掉首选,或调小 timeout |
| 内网名称时好时坏 | 内网 DNS 与公共 DNS 混填 | 首选、备用都用内网 DNS |
| 交换机 ping 域名提示无法解析 | 没开启域名解析功能,或通往 DNS 的路由不在管理 VRF 里 | 检查开关和 VRF |
在管理系统里怎么落地
“DNS 地址怎么填”在机房里不该每次都靠人回答。Toplink DCIM 的 IP 地址管理 在每个地址段上记录两个 DNS,与网关、VLAN 放在同一条记录里:给服务器分配地址时,该填的首选和备用 DNS 一并查得到,同一段的服务器配置保持一致。需要给一批交换机补 DNS 配置时,可以在 交换机管理 里打开浏览器中的 SSH 终端逐台操作,会话全程录像并记录命令日志,事后能查清谁在哪台设备上改了什么。
常见问题
改了 DNS 需要重启服务器吗?
不需要,配置生效后清掉本机缓存即可。但正在运行的程序可能自己缓存了解析结果:Java 应用受 networkaddress.cache.ttl 控制,Nginx 在 proxy_pass 里直接写的域名只在启动和重载配置时解析,这类程序要重启或重载。
国内服务器的 DNS 填 8.8.8.8 可以吗?
能用,但查询要出境,延迟高、偶尔超时;而且不少网站按解析器所在位置调度 CDN 节点,可能把你调度到较远的节点。国内机房优先用机房提供的 DNS 或国内公共 DNS,海外服务器再用当地的。
DNS 能只填一个吗?
能用,但这个地址一旦不可达,服务器上所有域名都会解析失败,yum、apt、发邮件、调用外部接口全部受影响。用 DHCP 下发 DNS 的网段也一样,地址池里应配置两个。