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

更新日期: 2015-12-12 阅读次数: 25103 分类: 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 聊聊, 查看更多联系方式

谈笑风生

PowerShell

专业!