CoreDNS实战(八)-递归服务器

2023-12-06 01:01

本文主要是介绍CoreDNS实战(八)-递归服务器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本文主要用于介绍CoreDNS实现递归服务器的几种方式以及在生产环境中遇到的一些问题和解决方案。

在开始之前我们需要知道一些关于CoreDNS的基本知识:CoreDNS本身是没有能力作为一个递归查询的DNS服务器(Recursive DNS),但是它有着众多的插件,可以通过插件来实现对域名的递归查询和缓存等功能从而加速客户端的DNS查询性能。这里主要实现的插件有内部插件(Plugins)forward外部插件(External Plugins)unbound

CoreDNS官方对External Plugins的描述为:
Out of tree plugins for CoreDNS. A plugin listed here is  not automatically endorsed by the CoreDNS team. Issues should be reported to owner(s) of the plugin.
我们可以将CoreDNS的External Plugins简单理解为第三方插件,但是其中少部分会有官方的维护支持或者是直接默认内置在官方编译好的版本中。

1 unbound

我们先来了解一下不依靠外部程序实现递归查询功能的unbound插件,unbound是一个非常优秀的DNS软件,专注于递归查询和缓存,但对于权威DNS服务器这方面的功能稍显不足,因此理论上将unbound和CoreDNS结合就可以很好的弥补两者的不足。

1.1 编译安装

unbound插件的编译安装稍显麻烦,unbound 中有详细介绍操作步骤和注意事项,需要特别注意的是编译安装了unbound插件的CoreDNS会从原来的静态二进制文件,变成了需要动态加载依赖库。因此如果需要提前编译然后大范围使用,最好保证编译环境的系统和最终的使用环境系统一致或全兼容。

1.2 一些问题

unbound插件已经很长一段时间没有更新维护了,尽管它有Maintained by CoreDNS的标注,因此如果使用较新版本的go编译之后,在启动的时候会有报警。

Jan 18 02:29:16 coredns1 coredns: [WARNING] An external plugin (/home/gopath/pkg/mod/github.com/coredns/unbound@v0.0.7/setup.go line 63) is using the deprecated function Normalize. This will be removed in a future versions of CoreDNS. The plugin should be updated to use OriginsFromArgsOrServerBlock or NormalizeExact instead.

另外就是在运行的过程中会出现panic异常,一开始怀疑是和负载有关,后面测试发现当请求量极低(个位数qps)的时候也会出现此类异常。

[tinychen /home/coredns]# ./coredns -dns.port=53 -conf /home/coredns/corefile
.:53 on 0.0.0.0
CoreDNS-1.8.3
linux/amd64, go1.16.4, 7b43d042-dirty
[INFO] 127.0.0.1:46007 - 37929 "A IN baidu.com. udp 50 false 4096" NOERROR qr,rd,ra 484 0.614542s
[INFO] 127.0.0.1:32946 - 43201 "A IN baidu.com. udp 50 false 4096" NOERROR qr,aa,rd,ra 484 0.0000971s
[INFO] 127.0.0.1:38201 - 44652 "A IN baidu.com. udp 50 false 4096" NOERROR qr,aa,rd,ra 484 0.0001522s
[INFO] 127.0.0.1:50863 - 63692 "A IN tinychen.com. udp 53 false 4096" NOERROR qr,rd,ra 58 0.3613896s
[ERROR] Recovered from panic in server: "dns://0.0.0.0:53"
[ERROR] Recovered from panic in server: "dns://0.0.0.0:53"
[ERROR] Recovered from panic in server: "dns://0.0.0.0:53"

经过多次测试之后,我们发现针对unbound插件出现panic的情况和请求的频率无关,而是和请求的内容有关。简单来说就是:当请求的域名本身就不存在解析的时候,就会触发panic异常;当然还可以再进一步:当CoreDNS服务端本身无法和根域名服务器建立连接转发查询的时候,也会出现panic异常。

2 forward

2.1 配置使用

forward插件主要的作用就是把DNS请求转发给上游的upstream服务器。forward插件本身并不支持任何的DNS解析功能,但是可以将相应的请求转发到递归服务器上,再结合cache插件做缓存,从而实现递归查询解析缓存的功能。

.:53 {forward . 114.114.114.114 114.114.115.115 {health_check 5s}logerrorsready prometheus cache {success 10240 600 60denial 5120 60 5}
}

forward对应的upstream机器可以根据自己的需求选择现有的公共DNS,如国内常见的114、谷歌的8888等免费DNS,或者选择自己使用unbound、bind9之类的DNS服务器单独搭建一个专门用来做递归查询的DNS服务。

2.2 一些问题

Jan 18 05:29:16 coredns1 coredns: [ERROR] plugin/errors: 2 nonexist.test.tinychen.com. A: read udp 127.0.0.1:7522->114.114.114.114:53: i/o timeout

当查询的域名解析记录不存在的时候,可能会触发upstream的超时时间限制,导致报错i/o timeout,可以考虑使用error插件的consolidate指令对这类报警进行统一处理并修改报警等级

    errors {consolidate 5m ".* i/o timeout$" warning}

这篇关于CoreDNS实战(八)-递归服务器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/459815

相关文章

Python并行处理实战之如何使用ProcessPoolExecutor加速计算

《Python并行处理实战之如何使用ProcessPoolExecutor加速计算》Python提供了多种并行处理的方式,其中concurrent.futures模块的ProcessPoolExecu... 目录简介完整代码示例代码解释1. 导入必要的模块2. 定义处理函数3. 主函数4. 生成数字列表5.

Java Spring 中的监听器Listener详解与实战教程

《JavaSpring中的监听器Listener详解与实战教程》Spring提供了多种监听器机制,可以用于监听应用生命周期、会话生命周期和请求处理过程中的事件,:本文主要介绍JavaSprin... 目录一、监听器的作用1.1 应用生命周期管理1.2 会话管理1.3 请求处理监控二、创建监听器2.1 Ser

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

MQTT SpringBoot整合实战教程

《MQTTSpringBoot整合实战教程》:本文主要介绍MQTTSpringBoot整合实战教程,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录MQTT-SpringBoot创建简单 SpringBoot 项目导入必须依赖增加MQTT相关配置编写

Windows Server 2025 搭建NPS-Radius服务器的步骤

《WindowsServer2025搭建NPS-Radius服务器的步骤》本文主要介绍了通过微软的NPS角色实现一个Radius服务器,身份验证和证书使用微软ADCS、ADDS,具有一定的参考价... 目录简介示意图什么是 802.1X?核心作用802.1X的组成角色工作流程简述802.1X常见应用802.

JavaScript实战:智能密码生成器开发指南

本文通过JavaScript实战开发智能密码生成器,详解如何运用crypto.getRandomValues实现加密级随机密码生成,包含多字符组合、安全强度可视化、易混淆字符排除等企业级功能。学习密码强度检测算法与信息熵计算原理,获取可直接嵌入项目的完整代码,提升Web应用的安全开发能力 目录

Redis迷你版微信抢红包实战

《Redis迷你版微信抢红包实战》本文主要介绍了Redis迷你版微信抢红包实战... 目录1 思路分析1.1hCckRX 流程1.2 注意点①拆红包:二倍均值算法②发红包:list③抢红包&记录:hset2 代码实现2.1 拆红包splitRedPacket2.2 发红包sendRedPacket2.3 抢

springboot项目redis缓存异常实战案例详解(提供解决方案)

《springboot项目redis缓存异常实战案例详解(提供解决方案)》redis基本上是高并发场景上会用到的一个高性能的key-value数据库,属于nosql类型,一般用作于缓存,一般是结合数据... 目录缓存异常实践案例缓存穿透问题缓存击穿问题(其中也解决了穿透问题)完整代码缓存异常实践案例Red

使用Nginx配置文件服务器方式

《使用Nginx配置文件服务器方式》:本文主要介绍使用Nginx配置文件服务器方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 为什么选择 Nginx 作为文件服务器?2. 环境准备3. 配置 Nginx 文件服务器4. 将文件放入服务器目录5. 启动 N

Spring Boot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)

《SpringBoot拦截器Interceptor与过滤器Filter深度解析(区别、实现与实战指南)》:本文主要介绍SpringBoot拦截器Interceptor与过滤器Filter深度解析... 目录Spring Boot拦截器(Interceptor)与过滤器(Filter)深度解析:区别、实现与实