关于dnsmasq这个小软件, 网络上的介绍都是说可以增加dns缓存, 加快网页浏览速度, 我认为这个是微不足道的, 他可以做的更多, 而且很好用, 能简单地解决我们的一些问题.
最开始用这个软件时候是为了解决没越狱的iphone改hosts的问题, 简单地在服务器上做好hosts,然后安装启动dnsmasq就搭建好了, 防火墙开启53解析端口白名单, 然后在手机上指定dns到这个服务器就可以达到”改hosts”的功能了. 这个功能在手机开发时候肯定是很常见的需求了.
另外一个小功能是改mx记录的”hosts”, 因为如果需要改一个域名的mx记录, 通过改hosts是行不通的, 必须得搭建一个dns服务器, 里面的mx-host选项可以很简单地做到.
但是dnsmasq能做的远不止快速搭建一个dns服务器这么简单, 因为他解决了我们一个需要解析快速高可用的场合.
当我们在/etc/resolv.conf里面写入几个dns服务器的时候, 可以达到一定的故障转移功能, 但是通过抓包可以看到, 当第一个dns服务器没有反应的时候默认需要3秒时间才超时, 有时候也会发生直接用最后一个dns服务器去解析,然后解析失败了就返回失败的情况. 虽然默认超时时间我们可以通过在resolv.conf配置文件里面加入options timeout:1 选项改为1秒超时(man resolv.conf可以查看具体解释), 但还是不够理想. 这里我们用dnsmasq可以做到快速并发解析和dns缓存功能.
关键选项参数解释:
no-resolv, 我们最后需要在/etc/resolv.conf里面写入nameserver 127.0.0.1, 这个选项设置不通过resolv文件来设置dns递归服务器, 我们在下面选项的server字段写入多个server即可.格式server=XX.XX.XX.XX, 这里可以多写几个备用的dns.
strict-order, 默认解析域名时候会同时去递归服务器解析, 这个选项是让dnsmasq按顺序来解析, 这个不要用, 不好, 会导致完全达不到目的.
user和group字段指定一个运行用户和组, 这里可以随意设置个普通账号,比如user=www.
no-hosts,这个建议选上, 因为如果是做高可用dns时候, 不需要让他去解析hosts里面的内容, 比如后台域名之类的. 如果需要手动指定域名和对应的ip关系, 我们可以用addn-hosts选项, 指向另外一个类似hosts的文件即可.
no-negcache,这个选项很重要, 让解析失败的查询不缓存, 每次解析失败都及时去重新解析.
local-ttl,比如用dig解析hosts里面的域名时候会返回这个ttl值.
然后下面的一些dhcp的选项可以忽略掉.
搭建好之后,把系统dns指向本机127.0.0.1就可以测试效果了. 测试方法:抓包.
tcpdump -i any -nn port 53 ,然后在另外一个窗口进行dns解析尝试,
比如dig web.4399.com :
第一次查询域名时候, 同时向多个dns进行查询, 里面有些不可达, 有些不准解析的, 但是最终会很快从正常dns服务器返回正确的dns解析, 这样就避免了之前的超时问题和返回失败的问题了. 而且这里会对dns服务器的状况进行缓存, 比如刚才是从8.8.8.8返回的正确解析, 下一次解析新域名时候就直接从8.8.8.8获取了, 当然, 如果当8.8.8.8这个服务器不可达时候, 又会重新对多个服务器进行查询和缓存, 这些功能不错.
当第二次解析时候:
直接从本机的缓存获取, 至于在本机缓存多久呢? 这个是取决于解析的域名设置的ttl时间,用dig命令解析时候可以看到, 就是那个IN前面一个字段.
下面这个截图是对没有解析到的域名下次重新解析, 不缓存失败状态, 而且是从上面那个”正确dns服务器”直接解析, 如果8.8.8.8不可达, 再自动重新多次解析.
tcpdump抓包时候, 如果那些AAAA的解析看着不顺的话, 把系统的ipv6模块禁用就可以了, 禁用方式(centos 6):
echo ‘install ipv6 /bin/true’ > /etc/modprobe.d/disable-ipv6.conf
echo ‘IPV6INIT=no’ >> /etc/sysconfig/network
然后重启即可.
感慨: dns是个不起眼但很关键的底层服务, 如果dns故障了, “小”到充值失败, 大到互联网”瘫痪”. powered by liu.