网络与 IP

DNS 怎么设置?Linux、Windows 服务器与网络设备的 DNS 配置

服务器的 DNS 怎么设置,关键是找对地方:Linux 先看 /etc/resolv.conf 归谁管理,再用 nmcli、netplan 或 resolved.conf 修改;Windows Server 用 netsh 或 PowerShell;交换机用 dns server、ip name-server 等命令。首选填机房提供的 DNS,备用填另一家,改完逐个验证并清缓存。

作者 顶联产品团队发布于 6 分钟阅读

DNS 怎么设置,先要分清设置的是什么。服务器上的 DNS 地址,是一台递归解析服务器的 IP,告诉系统“域名查询发给谁”;它和网站域名的解析记录是两回事,后者在域名服务商的后台添加。本文讲前者:Linux 服务器先判断 /etc/resolv.conf 由哪个组件管理,再用对应的方法写入;Windows Server 用图形界面、netsh 或 PowerShell;交换机和路由器上的 DNS 有两种用途,一种给设备自己解析域名,另一种通过 DHCP 下发给客户端。下面先说填什么,再分系统给出步骤,最后是验证和清缓存。

DNS 地址在哪里找到,首选和备用怎么填

DNS 地址按优先顺序有三个来源:

  1. 机房或服务商提供的递归 DNS。服务器交付信息、客户面板的网络信息里通常会写;托管的服务器向机房索取。路径短,也不受公共 DNS 查询频率限制的影响。
  2. 机房内网自建的 DNS。需要解析内部名称(如管理网里的设备)时,必须用它。
  3. 公共 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 与清缓存

按顺序做四步:

  1. 确认配置已生效。Linux 用 resolvectl dns 或 cat /etc/resolv.conf,Windows 用 Get-DnsClientServerAddress。
  2. 首选和备用分别测一次。只测默认那个的话,备用坏了要等到首选出故障那天才会发现:
nslookup www.example.com 223.5.5.5
nslookup www.example.com 119.29.29.29

两条都返回地址才算通过;输出开头的 Server: 一行,是这次回答的服务器。

  1. 再用系统解析器测一次。nslookup 和 dig 直接向 DNS 服务器发包,不读 hosts 文件,也不走系统的解析流程;程序实际怎么解析,要这样测:
getent hosts www.example.com          # Linux,与应用程序走同一套流程
time getent hosts www.example.com     # 耗时超过 1 秒,多半是首选不通、在等超时
Resolve-DnsName www.example.com       # Windows,会读取 hosts 文件和本机缓存
  1. 清掉缓存,让之前缓存的旧结果失效:
平台 清缓存命令
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 的网段也一样,地址池里应配置两个。

想看看在你的机房里怎么用?

从一次产品演示开始,梳理你的业务链路。

查看价格
服务热线 400-112-2951

让我们聊聊你的 IDC 业务

扫码添加企业微信,预约产品演示或申请试用。

Toplink 企业微信二维码

长按保存或使用企业微信 / 微信扫描

也可致电
400-112-2951
Telegram
@TopLink88