Linux 配置 DNS 解析
/etc/resolv.conf 是 Linux 系统中 DNS 解析的核心配置文件,用于指定 DNS 服务器、搜索域及解析行为选项。以下结合典型场景提供配置示例及关键说明:
📝 核心配置项说明
-
nameserver- 作用:指定 DNS 服务器的 IP 地址(IPv4/IPv6)。
- 规则:
- 按顺序查询,首个无响应时自动切换下一个[citation:1][citation:5]。
- 最多支持 3 个(超出部分无效)[citation:9][citation:13]。
- 示例:
nameserver 8.8.8.8 # Google DNS nameserver 114.114.114.114 # 国内公共 DNS
-
search- 作用:为不完整域名(如
ping web)自动追加后缀(如web.example.com),最多支持 6 个域,总长度 ≤256 字符[citation:1][citation:3]。 - 示例:
search example.com internal.org
- 作用:为不完整域名(如
-
domain- 作用:声明本地域名(旧版),功能类似
search,但 与search互斥(若共存,后者生效)[citation:3][citation:7]。 - 示例:
domain example.com
- 作用:声明本地域名(旧版),功能类似
-
options- 作用:控制解析行为,常用参数:
timeout:N:单次查询超时(秒,默认 5)[citation:1][citation:9]。attempts:N:重试次数(默认 2)[citation:1]。rotate:轮询多个 DNS 服务器(默认按顺序)[citation:9]。ndots:N:域名中.的数量阈值(默认 1),决定是否优先尝试绝对域名[citation:2][citation:7]。
- 示例:
options timeout:2 attempts:3 rotate
- 作用:控制解析行为,常用参数:
⚙️ 配置示例
1. 基础配置(公共 DNS + 搜索域)
# /etc/resolv.conf
nameserver 8.8.8.8
nameserver 1.1.1.1
search example.com lab.example.com
options timeout:1 attempts:2
- 适用场景:通用网络环境,支持快速解析和域名补全。
2. 多 DNS 服务器(主备架构)
nameserver 192.168.1.1 # 本地 DNS
nameserver 8.8.4.4 # 备用公共 DNS
nameserver 2001:4860:4860::8888 # IPv6 DNS
- 说明:优先使用本地 DNS,失败后切换备用服务器[citation:5][citation:9]。
3. 企业内网解析(搜索域优化)
search corp.internal team.corp.internal internal
nameserver 10.0.0.10 # 内网 DNS
nameserver 10.0.0.20
options ndots:2 # 含 1 个点的域名也先尝试绝对解析
- 作用:
ping db→ 依次尝试db.corp.internal→db.team.corp.internal[citation:3][citation:6]。
4. 高性能解析(低延迟优化)
nameserver 9.9.9.9 # Quad9 DNS
options timeout:1 attempts:1 rotate
- 效果:快速超时 + 轮询,减少等待时间[citation:1][citation:9]。
5. 禁用搜索域(仅解析绝对域名)
nameserver 8.8.8.8
options ndots:5 # 仅当域名含 <= 5 个点才补全
- 适用场景:避免多余搜索域查询,提升效率[citation:7][citation:9]。
⚠️ 注意事项
-
动态覆盖问题
- 若文件由
NetworkManager或systemd-resolved管理,手动修改可能被覆盖。 - 永久生效方法:
- NetworkManager:在网卡配置(如
/etc/sysconfig/network-scripts/ifcfg-ens33)中添加DNS1=8.8.8.8[citation:8][citation:10]。 - systemd-resolved:修改
/etc/systemd/resolved.conf并重启服务[citation:10]。
- NetworkManager:在网卡配置(如
- 若文件由
-
验证配置
# 测试解析 nslookup google.com dig @8.8.8.8 example.com # 指定 DNS 服务器 # 查看生效配置 cat /etc/resolv.conf -
与
/etc/hosts的优先级- 默认先查
/etc/hosts,再查 DNS(由/etc/nsswitch.conf控制顺序)[citation:7][citation:11]。
- 默认先查
💎 总结
- 基础模板:至少配置 1~3 个
nameserver,按需添加search或options。 - 企业场景:优先使用内网 DNS,通过
search简化内部服务访问。 - 性能敏感:用
timeout、attempts、rotate优化响应速度。 - 防覆盖:通过系统网络管理工具配置永久 DNS(非直接编辑
resolv.conf)[citation:8][citation:10]。
完整参数详见
man resolv.conf或 官方文档[citation:9]。
完整参数说明
文件 /etc/resolv.conf 是什么?
它是 Linux/Unix 系统中 DNS 解析器的核心配置文件。当您的程序(如浏览器、ping 命令或任何需要联网的程序)需要将域名(如 www.google.com)转换成 IP 地址时,负责解析的库(通常是 C 库中的 resolver 例程)就会读取这个文件来决定如何查找 DNS 信息。
📍 核心配置选项详解
-
nameserver(名称服务器)- 作用: 指定要查询的 DNS 服务器的 IP 地址。
- 格式:
nameserver <IP地址> - 规则:
- 可以列出多个
nameserver行(最多 3 个)。 - 解析器会按列表中的顺序依次尝试查询。如果第一个无响应(超时),就尝试下一个。
- 如果没有任何
nameserver行,解析器默认只查询本机(通常是127.0.0.1或::1)。 - 示例:
nameserver 8.8.8.8(Google DNS) 或nameserver 192.168.1.1(你的路由器)。
- 可以列出多个
-
search(搜索列表)- 作用: 当您输入一个不完整的域名(如
webserver)时,解析器会自动尝试在这个列表中的每个域名后面添加后缀,形成完整的域名(如webserver.example.com,webserver.internal.org)再进行查询。 - 格式:
search <domain1> <domain2> ... - 规则:
- 默认的搜索域通常是您主机名中第一个
.之后的部分(如果主机名是mycomputer.example.com,默认搜索域就是example.com;如果是localhost,则使用根域.)。 - 可以列出多个搜索域,用空格或制表符分隔。
- 解析器会按顺序尝试,直到找到匹配或列表用完。
- 过多或远程的搜索域可能导致查询变慢或产生额外网络流量。
domain指令: 是search的老式别名,只能接受一个域名。search优先级更高。建议只使用search。
- 默认的搜索域通常是您主机名中第一个
- 示例:
search example.com internal.org。输入ssh server会依次尝试server.example.com->server.internal.org。
- 作用: 当您输入一个不完整的域名(如
-
sortlist
sortlist是 Linux 系统/etc/resolv.conf配置文件中的一个选项,用于控制gethostbyname(3)函数返回的 IP 地址排序规则。其核心作用是根据预设的 IP 地址-网络掩码对(IP-address-netmask pairs)对解析结果进行优先级排序,从而影响应用程序连接目标主机的地址选择策略[citation:1]。
📊 功能与语法详解
-
排序规则
- 当域名解析返回多个 IP 地址时,
sortlist会按配置的 IP/掩码对 顺序匹配这些地址,优先返回匹配成功的地址。 - 未匹配的地址按默认顺序(如随机或轮询)排列。
- 当域名解析返回多个 IP 地址时,
-
语法格式
sortlist [IP1]/[mask1] [IP2]/[mask2] ... [最多10对]- IP 地址:需排序的目标网络地址(如
130.155.160.0)。 - 网络掩码:可选参数,默认为该 IP 地址的自然掩码(如
130.155.160.0的自然掩码为255.255.240.0)。 - 分隔符:IP 与掩码间用
/分隔,不同 IP/掩码对用空格分隔。
- IP 地址:需排序的目标网络地址(如
-
配置示例
sortlist 130.155.160.0/255.255.240.0 130.155.0.0- 第一对:
130.155.160.0/255.255.240.0→ 精确匹配该子网(掩码255.255.240.0对应/20网络)。 - 第二对:
130.155.0.0→ 使用自然掩码255.255.0.0(/16网络),匹配更大范围的130.155.x.x地址[citation:1]。
- 第一对:
⚙️ 应用场景与工作逻辑
-
本地网络优化
若主机属于130.155.160.0/20子网,配置后解析同一子网的 IP 将优先返回,减少跨网段流量。# 示例:域名 example.com 解析返回 [130.155.162.1, 192.168.1.1, 130.155.10.1] # 经 sortlist 排序后:130.155.162.1(匹配第一对) > 130.155.10.1(匹配第二对) > 192.168.1.1(未匹配) -
故障转移与负载均衡
通过定义多个子网优先级,实现流量定向(如优先选择机房内网地址,其次公网地址)。
⚠️ 注意事项
- 掩码默认行为
若省略掩码(如130.155.0.0),系统自动采用该 IP 的自然掩码(Class A/B/C 的标准掩码)。 - 匹配顺序
配置的 IP/掩码对按从前到后的顺序生效,首条匹配的规则决定优先级。 - 兼容性
gethostbyname(3)已逐渐被支持 IPv6 的getaddrinfo(3)替代,新项目中建议使用后者[citation:1]。
💎 总结
sortlist 是 Linux DNS 解析的精细化控制选项,通过 IP/掩码对 定义地址优先级,适用于网络优化、流量调度等场景。其核心价值在于:
- 提升局部性能:优先选择本地子网地址,降低延迟。
- 灵活路由策略:支持多级子网排序,适应复杂架构[citation:1]。
注:实际使用时需结合网络拓扑设计规则,并验证排序效果(可通过
getent hosts <域名>测试)。
options(选项)- 作用: 微调解析器的各种行为。允许多个选项,写在
options后面,用空格分隔。 - 关键选项:
ndots: n:- 作用: 控制什么时候解析器会优先尝试直接查询你输入的域名本身(绝对查询),而不是先加上搜索域后缀。
- 规则:
n是阈值。如果输入的域名中包含的.数量 >=n,解析器会先尝试直接查询这个域名本身,失败后再尝试搜索列表。如果.数量 <n,解析器会先尝试搜索列表。 - 默认值:
1。这意味着www(0个点)会先尝试www.example.com(如果配置了 search)。www.google.com(2个点)会先尝试www.google.com.(绝对查询)。 - 目的: 避免不必要的根 DNS 查询(浪费资源)和中间人攻击风险。
- 最大值: 15(超出会被静默设为15)。
timeout: n:- 作用: 设置解析器在放弃当前 DNS 服务器查询并尝试列表中的下一个服务器之前,等待响应的时间(秒)。
- 默认值:
5(秒)。 - 最大值: 30(超出会被静默设为30)。
attempts: n:- 作用: 设置解析器在放弃并返回错误给应用程序之前,尝试查询所有配置的 nameserver 的总次数。
- 规则: 每次尝试会遍历一次 nameserver 列表。
- 默认值:
2。 - 最大值: 5(超出会被静默设为5)。
rotate:- 作用: 启用对配置的
nameserver列表进行轮询。 - 规则: 默认是顺序查询(总是先试第一个)。启用
rotate后,每次新查询会从上一次成功的服务器之后开始尝试,或者轮换起始点,从而将查询负载分摊到所有列出的 DNS 服务器上。
- 作用: 启用对配置的
no-check-names:- 作用: 禁用对传入主机名和邮件名中无效字符(如下划线
_、非 ASCII 字符、控制字符)的现代 BIND 风格检查。
- 作用: 禁用对传入主机名和邮件名中无效字符(如下划线
edns0:- 作用: 启用对 EDNS0 (Extension mechanisms for DNS) 的支持,允许更大的 DNS 数据包和附加功能(如 DNSSEC)。
single-request/single-request-reopen:- 作用: 解决某些老旧或有问题的 DNS 服务器无法正确处理并行发出的 IPv4 (A) 和 IPv6 (AAAA) 查询的问题。
- 规则:
single-request: 强制按顺序进行 A 和 AAAA 查询(可能变慢)。single-request-reopen: 尝试在同一个端口(socket)上发送 A 和 AAAA 查询,但如果检测到问题(只收到一个响应),则关闭当前 socket,打开一个新的 socket 再发送第二个查询。通常比single-request性能稍好。
trust-ad(glibc >= 2.31):- 作用: 控制是否信任 DNS 响应中的 AD (Authenticated Data) 位。
- 规则: 如果开启 (
trust-ad),解析器会在查询中设置 AD 位(表示请求 DNSSEC 验证信息),并且如果响应中设置了 AD 位(表示响应数据已通过 DNSSEC 验证),则将该位原样传递给应用程序。如果关闭(默认或不设置),查询中不设置 AD 位,并且在将响应传递给应用程序之前总是清除 AD 位。 - 前提: 您必须信任您配置的 DNS 服务器(通常是
nameserver)确实执行了 DNSSEC 验证,并且您到该服务器的网络路径是安全的,才能安全地依赖此选项。
use-vc:- 作用: 强制所有 DNS 查询使用 TCP 而不是 UDP。
no-reload(glibc >= 2.26):- 作用: 禁用解析器库在检测到
/etc/resolv.conf文件被修改后自动重新加载其配置的功能。
- 作用: 禁用解析器库在检测到
- 作用: 微调解析器的各种行为。允许多个选项,写在
📍 其他要点
- 文件位置:
/etc/resolv.conf - 可信来源: 解析器默认认为
/etc/resolv.conf是可信的 DNS 信息源(trust-ad选项的行为也基于此假设)。 - 注释: 以
#或;开头的行是注释。 - 覆盖机制:
LOCALDOMAIN环境变量: 可以覆盖search列表(例如export LOCALDOMAIN="example.net corp.com")。RES_OPTIONS环境变量: 可以添加或覆盖options(例如export RES_OPTIONS="ndots:2 attempts:3 rotate")。
- 动态配置警告: 这个文件经常被网络管理工具(如 NetworkManager、systemd-resolved)动态生成和覆盖。手动修改可能被覆盖。要永久更改 DNS 设置,通常需要配置这些底层网络服务本身。
- 过时选项: 手册中提到了一些已废弃或移除的选项(如
inet6,ip6-bytestring,ip6-dotint/no-ip6-dotint),在较新系统(glibc >= 2.25)中已不再有效。
📍 总结
/etc/resolv.conf 是控制 Linux 系统如何查找域名对应 IP 地址的核心文件。其主要配置包括:
nameserver: 告诉系统去哪里问(DNS服务器地址)。search: 告诉系统当输入简称(如web)时,可以尝试自动补充哪些后缀(如web.example.com)。options: 微调查询行为,最重要的有:ndots: 决定何时直接查询全名还是先尝试加后缀。timeout: 等待一个DNS服务器响应多久就换下一个。attempts: 总共尝试多少次才放弃。rotate: 是否在DNS服务器间轮流问。trust-ad: 是否信任DNS响应的安全验证标志(需谨慎使用)。- 其他选项用于解决兼容性问题(
single-request*)、强制TCP(use-vc)、禁用自动重载(no-reload)等。
理解这些选项对于排查网络连接问题、优化 DNS 解析性能和配置特定 DNS 行为至关重要。但要注意,这个文件通常由系统服务管理,直接修改可能是临时的。

浙公网安备 33010602011771号