使用 dnsmasq 保证本地 DNS 服务的稳定性

文章目录

    问题

    机房内网的递归 DNS 解析服务器超负荷运行,不稳定,时常出现解析失败的问题。

    优化 /etc/resolv.conf 的配置

    options timeout:1
    nameserver 114.114.114.114
    nameserver 8.8.8.8
    

    options timeout:1 这里增加的超时配置,覆盖了默认值 - 5秒,但是仍然达不到生产环境的需求。
    毕竟一秒的延迟会极大的伤害用户体验。

    所以尝试使用 dnsmasq。

    dnsmasq

    dnsmasq 能对多个 nameserver 发起查询请求,然后把最快的返回结果缓存到本地。

    centos 下安装, 可以参考我的 dnsmasq 自动化安装脚本

    默认安装的是 2.48 版本。

    参考 Caching Nameserver using dnsmasq

    如何检验 dnsmasq 的各项配置已生效

    基本解析功能

    dig sunzhongwei.com @127.0.0.1
    

    缓存测试

    time dig sunzhongwei.com @127.0.0.1
    

    在部分递归出现问题的情况下,仍然能够解析未缓存的域名

    思路:

    • /etc/resolv.conf 只保留 127.0.0.1 这一条配置
    • 使用 iptables,tc 之类的工具屏蔽前面部分递归 DNS 服务器的请求
    • 如果仍能够返回说明正常

    如何使用 Docker centos container 测试自动化部署脚本

    Docker 镜像文件到底有多大?

    $ sudo docker pull centos:6
    $ sudo docker images
    REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
    centos              6                   510cf09a7986        3 weeks ago         202.6 MB
    

    可见一个 centos 6 的镜像才 200M。

    一个有趣的现象

    sudo docker run -t -i centos:6 /bin/bash
    

    登录镜像之后,安装的所有程序,在 exit 之后,再进去就会消失,很便于初始化测试环境啊,哈哈哈。

    如何将本地文件复制到 docker container 中

    sudo docker run -t -i -v /path/to/hostdir:/mnt $container /bin/bash
    cp /mnt/sourcefile /path/to/destfile
    

    在 docker 的 centos 6 镜像下,启动 dnsmasq 会报错

    /etc/init.d/dnsmasq start
    

    dnsmasq: setting capabilities failed: Operation not permitted

    而在实体机上就不会有这个问题。可以看到,dnsmasq 默认是使用 nobody 用户起的服务

    # ps axuw | grep dnsmasq
    nobody   19846  0.0  0.0  11180   676 ?        S    16:56   0:00 /usr/sbin/dnsmasq
    zhongwei 19937  0.0  0.0 103196   772 pts/1    S+   16:56   0:00 grep dnsmasq
    

    参考 dnsmasq: setting capabilities failed: Operation not permitted 只要把配置文件 /etc/dnsmasq.conf 中的 user 改成 root 即可正常启动。
    但是在生产环境中,这种做法就很危险。

    参考

    关于作者 🌱

    我是来自山东烟台的一名开发者,有感兴趣的话题,或者软件开发需求,欢迎加微信 zhongwei 聊聊,或者关注我的个人公众号“大象工具”, 查看更多联系方式