Ubuntu14.04上DNS引发的血案

作为技术备忘,为了纪念为此死去的千千万万脑细胞,先说问题:

公司搬家后,一台工作站上的爬虫程序突然莫名其妙的变慢,从一天20多万条数据萎缩到了14W-20W条不稳定,因为新办公室里所有部门共用一条网线,起初还以为是网络拥挤,属于正常情况,后来居然夸张的变成了每天3W条数据,经过跟踪发现这个爬虫全天候不分时间段的慢,这就很不对了。然后开始一系列的排查。

后来把爬虫里面用域名访问的代码改成使用IP地址访问,发现速度连接速度不慢,但是一使用域名就变龟速了,很明显域名解析出问题了,作为临时方案,我居然手写了一段IP地址缓存的代码,:(<

吐槽一下:Ubuntu系统配置DNS一点都不方便!!

发现工作站上的DNS服务器被配置成了8.8.8.8,然而这段时间Google的DNS抽风了,经常连接不上,所以解决办法就很简单了。

研究配置DNS的过程中,被灌输了一堆新名词:dnsmasq, resolv.conf, NetworkManager, resolvconf …

没看全部的文档,根据查阅的部分资料,Ubuntu的DNS机制大概是这样的:

  1. NetworkManager管理DNS配置,图形界面“编辑连接”弹出来的就是这货,这里配置的DNS存储在/run/resolvconf/interface/NetworkManager文件中。
  2. 系统范围DNS的基本配置在/etc/resolvconf/resolv.conf.d/这个目录下面,这里有三个文件:base中是基本配置,系统动态生成resolv.conf文件时要包含的内容;head也是要包含在resolv.conf文件中的,里面主要包含一些说明,比如不要修改我会被覆盖之类的;tail里是要追加到动态生成的resolv.conf文件末尾的内容。
  3. 从Ubuntu 12.04开始,系统默认都会安装一个阉割版的dnsmasq服务(dnsmasq-base包,不是dnsmasq包),主要是为了解决DNS和VPN之间的什么什么暧昧问题的,监听在127.0.1.1:53地址上,系统DNS请求都会发到这个监听地址上。
  4. 系统启动或者执行resolvconf -u命令的时候,会根据配置动态生成DNS配置文件/ete/resolv.conf

这个理解必然是不全面的,甚至有些完全就是错的,留待下次再搞DNS问题的时候研究吧。

相关的解决方法

安装完整功能的Dnsmasq:sudo apt-get install dnsmasq

配置Dnsmasq上游DNS服务器和本地监听地址,修改/etc/dnsmasq.conf文件:

listen-address=127.0.0.1,127.0.1.1
resolv-file=/etc/resolv.dnsmasq
conf-dir=/etc/dnsmasq.d

/etc/resolv.dnsmasq文件里面写上游DNS服务器地址:

nameserver 114.114.114.114
nameserver 223.5.5.5
nameserver 114.114.115.115
nameserver 223.6.6.6

其他dnsmasq配置自由发挥就好啦~

修改系统DNS解析配置/etc/resolvconf/resolv.conf.d/base

nameserver 127.0.0.1
nameserver 114.114.114.114
nameserver 223.5.5.5

然后启动dnsmasq服务:sudo service dnsmasq restart,更新DNS动态配置:sudo resolvconf -u

以上步骤可能就解决问题了,也可能还会有问题,也可能会引入新的问题,比如参考资料4中提到的系统启动时候服务启动顺序的问题~~

Dnsmasq扩展阅读

Dnsmasq提供DNS缓存和DHCP服务功能。作为域名解析服务器(DNS),dnsmasq可以通过缓存DNS请求来提高对访问过的网址的连接速度。作为DHCP服务器,dnsmasq可以用于为局域网电脑分配内网ip地址和提供路由。DNS和DHCP两个功能可以同时或分别单独实现。dnsmasq轻量且易配置,适用于个人用户或少于50台主机的网络。此外它还自带了一个PXE服务器。>>>

不使用Dnsmasq直接设置系统的DNS服务器

修改/etc/resolvconf/resolv.conf.d/base文件中DNS配置:

nameserver 114.114.114.114
nameserver 223.5.5.5
nameserver 114.114.115.115
nameserver 223.6.6.6

参考资料

  1. 使用本地DNS加速网络访问
  2. How do I set my DNS when resolv.conf is being overwritten?
  3. Using dnsmasq with NetworkManager
  4. Using Dnsmasq with Ubuntu for VM web application testing