注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

itoedr的it学苑

记录从IT文盲学到专家的历程

 
 
 

日志

 
 

dnsmasq应用一例(转载学习)  

2013-12-11 20:37:38|  分类: dns技术 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

       关于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 :

dnsmasq应用一例(转载学习) - itoedr - itoedr的it学苑
     第一次查询域名时候, 同时向多个dns进行查询, 里面有些不可达, 有些不准解析的, 但是最终会很快从正常dns服务器返回正确的dns解析, 这样就避免了之前的超时问题和返回失败的问题了. 而且这里会对dns服务器的状况进行缓存, 比如刚才是从8.8.8.8返回的正确解析, 下一次解析新域名时候就直接从8.8.8.8获取了, 当然, 如果当8.8.8.8这个服务器不可达时候, 又会重新对多个服务器进行查询和缓存, 这些功能不错.

当第二次解析时候:

dnsmasq应用一例(转载学习) - itoedr - itoedr的it学苑
     直接从本机的缓存获取, 至于在本机缓存多久呢? 这个是取决于解析的域名设置的ttl时间,用dig命令解析时候可以看到, 就是那个IN前面一个字段.

     下面这个截图是对没有解析到的域名下次重新解析, 不缓存失败状态, 而且是从上面那个”正确dns服务器”直接解析, 如果8.8.8.8不可达, 再自动重新多次解析.

dnsmasq应用一例(转载学习) - itoedr - itoedr的it学苑

 tcpdump抓包时候, 如果那些AAAA的解析看着不顺的话, 把系统的ipv6模块禁用就可以了, 禁用方式(centos 6):
echo ‘install ipv6 /bin/true’ > /etc/modprobe.d/disable-ipv6.conf
echo ‘IPV6INIT=no’ >>  /etc/sysconfig/network

然后重启即可.


另例:安装配置 dnsmasq
sudo apt-get install dnsmasq

配置 dnsmasq

dnsmasq帮助

man dnsmasq

其中有这么一段描述: In order to configure dnsmasq to act as cache for the host on which it is running, put "nameserver 127.0.0.1" in /etc/resolv.conf to force local processes to send queries to dnsmasq. Then either specify the upstream servers directly to dnsmasq using --server options or put their addresses real in another file, say /etc/resolv.dnsmasq and run dnsmasq with the -r /etc/resolv.dnsmasq option.

大意是如果想让dnsmasq作为dns缓存,需要将“nameserver 127.0.0.1”放到/etc/resolv.conf文件中,通常是第一条非注释语句,然后将真正的dns服务器信息放到另外一个文件中,如“ /etc/resolv.dnsmasq”,最后执行命令:

dnsmasq -r /etc/resolv.dnsmasq
  • 第一步

按照帮助文档的提示,需要修改/etc/resolv.conf文件。 可以手动修改,如使用vi,可以将原有的内容全部注释,然后在第一行写上

nameserver 127.0.0.1

也可以使用ubuntu的网络管理小程序“Network Manager”在桌面右上角有一个它的图标,右键点击该图标,选择“编辑连接”,选择你所使用的连接,点击编辑,在“IPv4设置”标签的“DNS服务器”输入框中,把原有的DNS服务器删除,输入

127.0.0.1
  • 第二步

/etc目录下新建resolv.dnsmasq文件。文件的内容为DNS服务器的地址,是真正的DNS服务器,如我的文件内容是:

nameserver 210.47.0.1
nameserver 202.98.5.68
  • 第三步

可以不按帮助文档所说的执行“dnsmasq -r /etc/resolv.dnsmasq”命令,如果这样,岂不是每次都得在命令行里输入,非常麻烦,当然,可以考虑把这个命令写入“/etc/rc.local”文件中,让系统每次启动时帮你运行。 我所使用的方法是编辑“/etc/dnsmasq.conf”文件。找到下面这一项

#resolv-file=

用下面的一条语句替换

resolv-file=/etc/resolv.dnsmasq

其实也就是执行dnsmasq命令中-r参数后面的内容。

  • 编辑 /etc/dhcp3/dhclient.conf

找到下面这一项

#prepend domain-name-servers 127.0.0.1;

将前面的“#”删除。这么做的目的是为了在使用自动连接时,能在/etc/resolv.conf文件的第一行添加上“nameserver 127.0.0.1”,这样,dns缓存依然有效

  • 编辑 /etc/ppp/peers/dsl-provider

可能有的系统没有“/etc/ppp/peers/dsl-provider”文件,而是“/etc/ppp/peers/provider”文件,找到下面这一项

usepeerdns

在前面增加“#”,也就是把这条语句注释掉。以防resolv.conf的设置被pppoe复盖。

对于12.04版本 由于该版本已经安装dnsmasq-base,则必须先修改/etc/NetworkManager/NetworkManager.conf文件,注释dns=dnsmasq 修改/etc/default/dnsmasq文件,取消IGNORE_RESOLVCONF=yes注释

测试

重启服务:

sudo /etc/init.d/dnsmasq restart
或者 sudo service dnsmasq restart


测试,执行两次就能看出查询时间的差异了:

dig g.cn
  评论这张
 
阅读(345)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017