萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 作業系統 >  >> Linux 教學

Linux DNS 配置全解析:從 /etc/resolv.conf 到實戰除錯

DNS 基礎概念

DNS(Domain Name System)是互聯網的「電話簿」,將人類易記的域名(如 www.example.com)解析為機器可路由的 IP 地址(如 93.184.216.34)。Linux 系統通過 /etc/resolv.conf 指定使用的 DNS 服務器。

核心配置文件:/etc/resolv.conf

標準格式

# 域名搜尋後綴(可選)
search example.com corp.example.com

# 主域名後綴(可選)
domain example.com

# DNS 服務器地址(按優先序)
nameserver 192.168.1.1
nameserver 8.8.8.8
nameserver 1.1.1.1

# 選項(可選)
options timeout:2 attempts:3 rotate single-request-reopen

關鍵指令說明

指令作用範例
nameserver指定 DNS 服務器 IPnameserver 8.8.8.8
search主機名補全搜尋列表search corp.local → 輸入 "server" 實際查 "server.corp.local"
domain本機所屬域名domain example.com
options調整解析行為options timeout:1 attempts:2

現代 Linux 的動態管理機制

傳統靜態編輯 /etc/resolv.conf 在現代發行版(systemd-resolved、NetworkManager、Netplan)中已被取代:

systemd-resolved (Ubuntu 18.04+, RHEL 8+, Debian 10+)

# 查看當前 DNS 狀態
resolvectl status

# 臨時設置 DNS(重啟失效)
resolvectl dns eth0 8.8.8.8 1.1.1.1

# 永久配置:編輯 /etc/systemd/resolved.conf
[Resolve]
DNS=8.8.8.8 1.1.1.1
FallbackDNS=9.9.9.9
Domains=~.
DNSSEC=yes
DNSOverTLS=opportunistic

# 重啟生效
systemctl restart systemd-resolved

NetworkManager (桌面版常用)

# 圖形界面:nm-connection-editor
# 命令行:
nmcli con mod "Wired connection 1" ipv4.dns "8.8.8.8,1.1.1.1"
nmcli con mod "Wired connection 1" ipv4.ignore-auto-dns yes
nmcli con up "Wired connection 1"

Netplan (Ubuntu 20.04+ 服務器版)

# /etc/netplan/01-netcfg.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: true
      nameservers:
        addresses: [8.8.8.8, 1.1.1.1]
        search: [corp.local]

# 生效
netplan apply

驗證與除錯工具

dig - 功能最強大的 DNS 查詢工具

# 基本查詢
dig example.com

# 指定 DNS 服務器
dig @8.8.8.8 example.com

# 查詢特定記錄類型
dig example.com MX
dig example.com TXT
dig example.com AAAA

# 追蹤完整解析鏈路
dig +trace example.com

# 簡潔輸出(腳本友好)
dig +short example.com

nslookup - 互動式查詢

nslookup example.com
nslookup -type=MX example.com
nslookup example.com 8.8.8.8

host - 簡潔查詢

host example.com
host -t MX example.com
host -v example.com

resolvectl - systemd-resolved 專用

resolvectl query example.com
resolvectl statistics

實戰場景與解決方案

場景 1:Docker 容器無法解析域名

# 檢查宿主機 DNS
cat /etc/resolv.conf

# 啟動容器時指定 DNS
docker run --dns=8.8.8.8 --dns=1.1.1.1 ...

# 或配置 daemon.json
{ "dns": ["8.8.8.8", "1.1.1.1"] }

場景 2:VPN 連接後內網域名解析失敗

# 方案:配置分流解析
# systemd-resolved 支援按域名路由
# /etc/systemd/resolved.conf
[Resolve]
Domains=~corp.internal
DNS=10.0.0.1

場景 3:域名劫持/污染排查

# 對比多個 DNS 服務器結果
for dns in 8.8.8.8 1.1.1.1 9.9.9.9 114.114.114.114; do
  echo "=== $dns ==="
  dig @$dns example.com +short
done

最佳實踐清單

  1. 至少配置兩個上游 DNS(主 + 備)
  2. 生產環境優先使用支援 DNSSEC/DoT/DoH 的公共 DNS(Google、Cloudflare、Quad9)
  3. 內網環境部署本地遞歸服務器(Unbound、PowerDNS Recursor)
  4. 監控 DNS 解析延遲與失敗率,納入觀測體系
  5. 定期審核 /etc/resolv.conf 實際生效內容(resolvectl status 或 cat /run/systemd/resolve/resolv.conf)
copyright © 萬盛學電腦網 all rights reserved