Linux /etc/resolv.conf 配置文件详解

发布时间: 更新时间: 总字数:1419 阅读时间:3m 作者: IP上海 分享 网址

在 Linux 系统中,/etc/resolv.conf 是 DNS 解析的核心配置文件,用于定义系统如何通过域名解析服务器(DNS)将域名转换为 IP 地址。

文件结构

/etc/resolv.conf 是一个纯文本文件,包含以下主要配置项(每行一个指令):

nameserver 8.8.8.8
nameserver 223.5.5.5
nameserver 2001:4860:4860::8888
search example.com mydomain.org
options timeout:2 attempts:3 rotate

下面介绍核心配置项

nameserver

  • 作用:指定 DNS 服务器的 IP 地址(IPv4 或 IPv6)
  • 规则:
    • 最多可配置 3 个 nameserver,系统按顺序尝试查询
    • 若第一个无响应,自动切换到下一个
  • 示例
nameserver 8.8.8.8     # Google 公共 DNS
nameserver 1.1.1.1     # Cloudflare DNS
  • 作用:定义域名搜索列表。当输入不完整的域名(如 ping server)时,系统会自动尝试附加搜索域
  • 规则:
    • 最多支持 6 个搜索域,总长度不超过 256 字符
    • 按顺序尝试,直到解析成功
  • 示例:
search example.com internal.org
  • 输入 ping web 会依次尝试解析:web.example.com -> web.internal.org

domain

  • 作用:指定本地主机的默认域名(旧版配置,通常被 search 替代)
  • 注意:若同时配置 domainsearchsearch 会覆盖 domain

options

  • 作用:设置 DNS 解析的全局选项,控制超时、重试、轮询等行为
  • 常用选项:
选项 说明
timeout:N 每次 DNS 查询的超时时间(秒,默认 5
attempts:N 失败后的重试次数(默认 2
rotate 启用 DNS 服务器轮询(默认按顺序使用)
ndots:N 域名中点的数量阈值,决定是否优先尝试绝对域名(默认 1
use-vc 强制使用 TCP 而非 UDP 进行解析查询
edns0 启用 EDNS0 扩展协议(支持更大的 DNS 数据包)
  • 示例:
options timeout:3 attempts:2 rotate

RES_OPTIONS 环境变量

  • options 参数可以通过 RES_OPTIONS 环境变量配置(如在程序中指定,参考
    • 示例 RES_OPTIONS="rotate timeout:1 retries:1"
    • 作用范围:仅对当前 Shell 或子进程生效,若需全局生效,可写入 ~/.bashrc/etc/profile
    • 兼容性:不同 Linux 发行版或 glibc 版本可能支持的选项略有差异,建议通过 man resolv.conf 确认本地支持的参数
  • RES_OPTIONS 是通过 GNU C 库(glibc) 实现的,影响所有使用 glibc 解析 DNS 的应用程序(如 curlwgetping 等)
  • RES_OPTIONS 的默认行为通常由 /etc/resolv.conf 控制,但通过该环境变量可以临时覆盖全局配置。例如:
    • /etc/resolv.conf 中设置了 DNS 服务器列表和默认选项
    • RES_OPTIONS 可在此基础上追加或覆盖参数
# 增加重试次数或超时时间
export RES_OPTIONS="attempts:5 timeout:30"

# 强制使用 TCP 协议,适用于某些防火墙限制 UDP 流量的环境
export RES_OPTIONS="use-vc"

# 轮询 DNS 服务器
export RES_OPTIONS="rotate"

# 优化复杂域名解析,调整 `ndots` 减少不必要的搜索域查询
export RES_OPTIONS="ndots:3"

# 设置 DNS 查询超时 2 秒,重试 4 次,启用轮询和 TCP
export RES_OPTIONS="timeout:2 attempts:4 rotate use-vc"

# 测试配置是否生效
curl https://example.com

# 若 DNS 解析缓慢或失败,可通过以下命令测试
# 查看当前 DNS 配置
cat /etc/resolv.conf

# 设置 RES_OPTIONS 后测试解析
export RES_OPTIONS="attempts:3 timeout:1"
getent hosts example.com

动态生成机制

在某些系统中,/etc/resolv.conf 可能由网络管理工具动态生成(如 NetworkManager、systemd-resolved 或 DHCP 客户端)。常见情况:

  1. NetworkManager
  • 默认会覆盖此文件,需通过以下方式禁用:
# 在 /etc/NetworkManager/conf.d/ 中创建配置文件:
[main]
dns=none
  1. systemd-resolved
  • 使用 systemd-resolved 服务时,实际配置由 /etc/systemd/resolved.conf 控制,/etc/resolv.conf 可能是指向 /run/systemd/resolve/stub-resolv.conf 的符号链接
  • 若需手动管理,可删除符号链接并创建静态文件:
rm /etc/resolv.conf
vim /etc/resolv.conf  # 手动写入配置

静态配置示例

# /etc/resolv.conf
nameserver 8.8.8.8
nameserver 1.1.1.1
search example.com
options timeout:2 attempts:3 rotate

验证配置

  1. 检查 DNS 解析
nslookup google.com     # 使用默认 DNS
dig @8.8.8.8 google.com # 指定 DNS 服务器
  1. 查看实际生效的配置
cat /etc/resolv.conf

常见问题

  • 权限:文件所有者应为 root,权限为 644
  • 临时修改:直接编辑文件会立即生效,但重启网络服务后可能被覆盖
  • 容器环境:在 Docker/Kubernetes 中,容器的 /etc/resolv.conf 通常由宿主机或编排工具管理

通过合理配置 /etc/resolv.conf,可以显著优化 DNS 解析性能并解决网络连接问题

配置不生效

  • 原因:文件被网络管理工具覆盖
  • 解决:禁用自动生成或配置网络管理工具(如 NetworkManager)

DNS 解析缓慢

  • 优化:
    • 减少 nameserver 数量(仅保留响应最快的)
    • 调整 options timeoutattempts
    • 启用 rotate 轮询多个 DNS 服务器

IPv6 解析问题

  • 禁用 IPv6 DNS:移除 IPv6 的 nameserver
  • 完全禁用 IPv6:在 /etc/sysctl.conf 中添加:
net.ipv6.conf.all.disable_ipv6 = 1

参考

  1. https://man7.org/linux/man-pages/man5/resolv.conf.5.html
Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数