Linux DNS 解析失败和超时优化方案

邱秋 • 2025年01月11日 • 阅读:102 • linux

问题

当你的服务器遇到 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 或复杂的缓存策略。
  • 网络规模较大,或者对安全性要求较高。

我,秦始皇,打钱!