美文网首页
CoreDNS篇4-编译安装unbound

CoreDNS篇4-编译安装unbound

作者: tinychen | 来源:发表于2022-02-27 00:41 被阅读0次

    本文主要介绍coredns的unbound插件进行编译安装的过程及常用的配置方法。

    coredns官方的unbound文档unbound (coredns.io),以及unbound插件的github地址coredns/unbound: CoreDNS plugin that performs recursive queries using libunbound (github.com),此前已经介绍过coredns编译其他插件的方法,有需要的同学可以先回顾一下。

    此外,unbound插件虽然是coredns中的External Plugins,但是从详情页面中我们可以看到Maintained by CoreDNS: CoreDNS maintainers take care of this plugin.,说明这个插件是官方维护的,在稳定性可靠性以及后续更新维护上都有不错的保证,应该是可以放心使用的。

    1、配置环境

    要使用CGO特性,需要安装C/C++构建工具链,在macOS和Linux下是要安装GCC,在windows下是需要安装MinGW工具。同时需要保证环境变量CGO_ENABLED被设置为1,这表示CGO是被启用的状态。在本地构建时CGO_ENABLED默认是启用的,当交叉构建时CGO默认是禁止的。比如要交叉构建ARM环境运行的Go程序,需要手工设置好C/C++交叉构建的工具链,同时开启CGO_ENABLED环境变量。

    以CentOS8为例,最好提前安装好gccunbound-develunbound-libs

    [/home/coredns]# cat /etc/redhat-release
    CentOS Linux release 8.2.2004 (Core)
    
    [/home/coredns]# go env | grep "CGO_ENABLED"
    CGO_ENABLED="1"
    
    [/home/coredns]# rpm -qa | grep gcc
    libgcc-8.4.1-1.el8.x86_64
    gcc-8.4.1-1.el8.x86_64
    gcc-c++-8.4.1-1.el8.x86_64
    gcc-gdb-plugin-8.4.1-1.el8.x86_64
    
    [/home/coredns]# rpm -qa | grep unbound
    unbound-devel-1.7.3-15.el8.x86_64
    unbound-libs-1.7.3-15.el8.x86_64
    

    如果在使用go get命令获取unbound插件的时候遇到下面的这个问题,可以参考这个issue的解决方案:How to fix the issue: unbound.h: No such file or directory · Issue #3 · miekg/unbound (github.com)

    [/home/coredns]# go get github.com/coredns/unbound
    # github.com/miekg/unbound
    ../gopath/pkg/mod/github.com/miekg/unbound@v0.0.0-20210309082708-dbeefb4cdb29/unbound.go:36:10: fatal error: unbound.h: No such file or directory
       36 | #include <unbound.h>
          |          ^~~~~~~~~~~
    compilation terminated.
    

    对于红帽系的Linux可以直接安装unbound-devel,debian系的解决方案类似,只是软件包名可能略有不同(libunbound-dev)。

    yum install -y unbound-devel
    

    随后测试发现正常

    [/home/coredns]# go get github.com/coredns/unbound
    go get: added github.com/coredns/unbound v0.0.7
    go get: added github.com/miekg/unbound v0.0.0-20210309082708-dbeefb4cdb29
    

    2、编译安装

    虽然我们go的环境变量设置启用了CGO,但是coredns的Makefile文件默认是禁用的,因此需要将里面的CGO_ENABLED参数从默认的0改为1,从而才能启用CGO。

    [/home/coredns]# grep "CGO_ENABLED" Makefile
    CGO_ENABLED:=1
    

    随后进行编译安装,安装完成后查看当前目录下的coredns二进制文件是否包含unbound插件来确定是否顺利编译安装完成。

    [/home/coredns]# echo "unbound:github.com/coredns/unbound" >> plugin.cfg
    [/home/coredns]# go generate
    [/home/coredns]# go build
    [/home/coredns]# make
    CGO_ENABLED=1  go build -v -ldflags="-s -w -X github.com/coredns/coredns/coremain.GitCommit=7b43d042-dirty" -o coredns
    [/home/coredns]# ./coredns -plugins | grep unbound
      dns.unbound
    

    对比是否编译安装了unbound插件的coredns,可以发现从原来的静态二进制文件,变成了需要动态加载依赖库。因此如果需要提前编译然后大范围使用,最好保证编译环境的系统和最终的使用环境系统一致或全兼容(本文的编译环境为CentOS8.2,使用环境为RockyLinux8.4)。

    [root@tiny-rockylinux coredns]# file coredns.static
    coredns.static: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped
    [root@tiny-rockylinux coredns]# file coredns
    coredns: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, stripped
    
    [root@tiny-rockylinux coredns]# file /lib64/ld-linux-x86-64.so.2
    /lib64/ld-linux-x86-64.so.2: symbolic link to ld-2.28.so
    [root@tiny-rockylinux coredns]# file /lib64/ld-2.28.so
    /lib64/ld-2.28.so: ELF 64-bit LSB shared object, x86-64, version 1 (GNU/Linux), dynamically linked, BuildID[sha1]=04c0b62c6350fa6ec9158369de8b5b489e3d084b, not stripped
    

    如果在运行的机器上面遇到下面的报错,则需要安装上面提到的unbound-devel

    [root@coredns sbin]# ./coredns
    ./coredns: error while loading shared libraries: libunbound.so.2: cannot open shared object file: No such file or directory
    

    3、配置使用

    语法配置

    unbound [FROM] {
        except IGNORED_NAMES...
        option NAME VALUE
    }
    
    • FROM 指的是客户端请求需要解析的域名,例如blog.tinychen.comtinychen.com这两个的FROM都是tinychen.com
    • IGNORED_NAMESexcept搭配使用,指定不使用unbound的zone
    • option 可以添加unbound本身支持的一些参数,具体可以查看unbound.confman文档或者直接查看官网的文档

    prometheus监控

    unbound插件提供了两个监控指标,只要对应的zone中启用了Prometheus插件,那么就可以同时启用这两个指标(其他插件的监控指标也一样),它们分别是:

    • coredns_unbound_request_duration_seconds{server} - duration per query.
    • coredns_unbound_response_rcode_count_total{server, rcode} - count of RCODEs.

    这两个监控指标的数据格式和内容与coredns原生的coredns_dns_request_duration_secondscoredns_dns_response_rcode_count_total一致,因此相关的监控图表只需要套用原有的进行简单修改后就能直接使用。

    image

    范例

    除了tinychen.com这个域名其他的都使用unbound,并开启DNS最小化查询功能(DNS Query Name Minimisation

    . {
        unbound {
            except tinychen.com
            option qname-minimisation yes
        }
        log
        errors
        prometheus 0.0.0.0:9253
        bind 0.0.0.0
        cache {
            success 10240 600 60
            denial 5120 60 5
        }
    }
    

    相关文章

      网友评论

          本文标题:CoreDNS篇4-编译安装unbound

          本文链接:https://www.haomeiwen.com/subject/vsvxrrtx.html