Linux DNS 解析失败和超时优化方案
问题
当你的服务器遇到 i/o timeout, 5秒超时或者延迟. 这几本就是本地dns解析失败, 其造成的原因就是并发量过大,dns 服务器拒接解析. 常见于k8s, linux 服务器应用中.
方案1, 备用dns服务器
遇到这个问题,这说明说明我们的dns 服务器不给解析了, 那我们可以多配置几个dns服务器.
修改 /etc/resolv.conf
# 国内
nameserver 114.114.114.114
nameserver 114.114.115.115
nameserver 223.6.6.6
# 国外
nameserver 8.8.8.8
nameserver 8.8.4.4
nameserver 4.2.2.2
这样可以在很大程度上缓解解析失败的问题.
方案2 备用dns服务器轮询
当然如果上面的还不够解决你的并发问题, 还有优化方案:
修改 /etc/resolv.conf
options timeout:1 attempts:1 rotate single-request-reopen
nameserver 114.114.114.114
nameserver 114.114.115.115
nameserver 223.6.6.6
如果服务器在1秒内不给解析 , 我们就换下一个.
选项说明:
- dns 服务器(nameserver)最多能设三个。
- search 最多设6个。
- timeout: 查询一个dns的超时时间,单位是秒。系统缺省是5,最大可以设为30。改成最小值:1
- attempts: 全部dns都查询一遍的次数。缺省是2,有3台dns的前提下,都查询一遍完全够了
- rotate: 随机选取一个作为首选查询的dns。没有这个选项的话,系统缺省是从上到下的
- single-request-reopen: 发送A类型请求和AAAA类型请求使用不同的源端口。这样两个请求在conntrack表中不占用同一个表项,从而避免冲突。不理解的话,记住加上更好就行了。
- ndots:5 所有查询中,如果.的个数少于5个,则会根据search中配置的列表依次在对应域中先进行搜索,如果没有返回,则最后再直接查询域名本身
方案3 搭建本地服务器dnsmasq
dns 轮询依然解决不了问题, 可以尝试 搭建本地dns服务器,使用缓存 减少重复查询 , 来解决并发问题,
# 安装
sudo yum install dnsmasq
编辑配置文件 /etc/dnsmasq.conf
:
# 设置最小 TTL 为 300 秒(5 分钟)
min-cache-ttl=300
# 设置最大 TTL 为 86400 秒(1 天)
max-cache-ttl=86400
# 设置缓存大小(单位:条目数)
cache-size=1000
# 指定上游 DNS 服务器
server=8.8.8.8 # Google DNS
server=1.1.1.1 # Cloudflare DNS
# 启用日志
log-queries
log-facility=/var/log/dnsmasq.log
重启 dnsmasq 服务:
sudo systemctl restart dnsmasq
修改 /etc/resolv.conf
文件,指向本地 DNS 缓存:
nameserver 127.0.0.1
确保 dnsmasq 正在运行并监听 127.0.0.1:53:
sudo netstat -lnp | grep :53
使用 dig 测试:
dig example.com
首次查询会从上游获取,后续查询会直接从本地缓存返回。
dnsmasq 的特点
优点:
- 轻量级:
- 占用资源少,适合嵌入式设备、小型服务器或家庭网络。
- 易于配置:
- 配置文件简单,功能直观,易于快速部署。
- 多功能集成:
- 同时支持 DHCP 和 TFTP,适合一体化的网络管理需求。
- 广泛支持:
- 几乎所有 Linux 发行版都有预装或易于安装。
缺点:
- 功能较少:
- 缺乏高级功能(如 DNSSEC、细粒度的缓存控制等)。
- 适用场景有限:
- 更适合小型网络环境,不适合大规模、高性能需求。
适用场景:
- 家庭网络、办公局域网、小型服务器环境。
- 需要简单的 DNS 缓存和 DHCP 功能。
方案4 搭建本地服务器Unbound
如果dnsmasq 依然解决不了问题, 可以使用 Unbound 作为本地缓存服务器, 高并发高性能
安装 Unbound
sudo apt update
sudo apt install unbound
配置 Unbound
编辑配置文件 /etc/unbound/conf.d/dns_cache.conf
,添加以下内容:
server:
# 缓存大小(单位:MB)
cache-max-ttl: 86400
cache-min-ttl: 300
msg-cache-size: 50m
rrset-cache-size: 100m
# 启用日志
verbosity: 1
# 上游 DNS 服务器
forward-zone:
name: "."
forward-addr: 8.8.8.8 # Google DNS
forward-addr: 1.1.1.1 # Cloudflare DNS
重启 Unbound 服务:
sudo systemctl restart unbound
配置系统使用 Unbound
修改 /etc/resolv.conf
文件:
nameserver 127.0.0.1
定期清理缓存
重启服务清空缓存:
sudo systemctl restart unbound
Unbound 的特点
优点:
- 高性能:
- 设计用于大规模、高并发的 DNS 查询场景。
- 支持 DNSSEC:
- 提供强大的安全性,支持域名系统安全扩展(DNSSEC)。
- 高级功能:
- 提供细粒度的缓存控制(如自定义 TTL、缓存策略)。
- 支持本地区域(Local Zone)解析和负载均衡。
- 高灵活性:
- 配置选项丰富,适合复杂的 DNS 场景。
缺点:
- 较复杂的配置:
- 配置文件比 dnsmasq 更复杂,学习曲线较高。
- 资源占用稍高:
- 在低端设备上可能表现不如 dnsmasq。
适用场景:
- 大型网络、数据中心、高并发场景。
- 需要高级安全功能(如 DNSSEC)或复杂的缓存策略。
- 需要支持高精度和灵活性的 DNS 配置。
特性 | dnsmasq | Unbound |
---|---|---|
资源占用 | 低,适合低性能设备 | 稍高,适合高性能场景 |
配置复杂度 | 简单,快速上手 | 较复杂,功能更强大 |
功能 | 基本 DNS 缓存 + DHCP | 高级 DNS 缓存 + DNSSEC |
性能 | 中等,适合小型网络 | 高性能,适合大规模部署 |
适用场景 | 家庭网络、小型服务器 | 企业网络、大型服务器 |
安全性 | 基本 DNS 查询 | 支持 DNSSEC 和高安全性场景 |
推荐选择
- 选择 dnsmasq:
- 如果你需要轻量级、易用的 DNS 缓存工具。
- 网络规模较小,或者同时需要简单的 DHCP 功能。
-
系统资源有限,且不需要复杂的安全功能。
-
选择 Unbound:
- 如果你需要高性能和高级功能。
- 需要支持 DNSSEC 或复杂的缓存策略。
- 网络规模较大,或者对安全性要求较高。