網路與 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