dnsmasq高阶配置详解 - 国内外域名分流解析
一、前言
dnsmasq支持dns及dns缓存、dhcp、tftp等服务,本文将使用dnsmasq配合国内白名单,实现国内外分流解析,拿到最优的解析节点,提升访问效率。
大致架构如下:
因此,如果想让dnsmasq配置三个以上的上游DNS服务器,则可以在dnsmasq.conf
文件中通过参数resolv-file=xxx.conf
自定义读取文件即可。
(2)拓展配置
同时,如果设置resolv.conf
,也会影响运行dnsmasq的本机器的请求,对于dns query要去resolv.conf
定义的上游DNS查找,那么如果想让服务器本身也走dnsmasq,则可以在resolv.conf
文件中将DNS设置为本地地址:
nameserver ::1
nameserver 127.0.0.1
之后在dnsmasq.conf定义上游DNS即可,如:
all-servers
server=8.8.8.8
server=8.8.4.4
server=1.1.1.1
all-servers
表示从以下dns列表中查找,选择回应最快的一条作为查询结果返回,如果非53端口,则可以通过增加#port
来自定义端口,如server=8.8.8.8#25533
。
前面说过,如果不想影响本机器的配置,则可以通过resolv-file
参数来自定义指定文件。
4.检查语法
配置后可使用dnsmasq --test
检查语法。
四、国内外分流配置
使用dnsmasq-china-list作为大陆域名白名单,定义国内域名使用的上游DNS,不匹配的则走dnsmasq定义的上游DNS,完美利用解析优先级机制。
1.conf文件说明
conf |
说明 |
---|---|
accelerated-domains.china.conf |
国内域加速 |
google.china.conf |
Google域加速 |
apple.china.conf |
Apple域加速 |
bogus-nxdomain.china.conf |
反劫持 |
2.克隆项目
将项目克隆到本地:
cd /opt
git clone https://github.com/felixonmars/dnsmasq-china-list
3.超链到dnsmasq.d目录
你可以选择直接将上面几个文件从dnsmasq-china-list目录中拷贝到dnsmasq.d目录下,但考虑到这个项目的文件是定时更新维护的,因此超链接的方式更方便,后续只需定时执行git pull
更新项目文件即可,无需重新拷贝。
ln -sf /opt/dnsmasq-china-list/accelerated-domains.china.conf /etc/dnsmasq.d/accelerated-domains.china.conf
ln -sf /opt/dnsmasq-china-list/google.china.conf /etc/dnsmasq.d/google.china.conf
ln -sf /opt/dnsmasq-china-list/apple.china.conf /etc/dnsmasq.d/apple.china.conf
ln -sf /opt/dnsmasq-china-list/bogus-nxdomain.china.conf /etc/dnsmasq.d/bogus-nxdomain.china.conf
4.替换LDNS
可选项。上一步可见国内域名默认都是指定114的DNS作为上游,你可以选择替换为运营商分配给你的LDNS,即本地出口DNS,LDNS可以通过此网站查询。
假定LDNS为113.87.49.47,那么替换命令可以这么写:
sed -i 's|114.114.114.114|113.87.49.47|g' accelerated-domains.china.conf
5.定时更新dnsmasq-china-list
可选项。定时更新只为保障列表更全面更稳定,可配合crond定时任务实现。
脚本逻辑很简单:
#!/bin/bash
cd /opt/dnsmasq-china-list
git pull
systemctl restart dnsmasq.service
之后通过crond配置定时任务,每6小时更新一次:
0 */6 * * * /bin/bash /server/scripts/update-china-list.sh
五、验证
1.日志验证
通过以上配置后,最终来验证一下:
根据查询日志可见,按照预定的轨道进行解析,国内外使用不同的上游DNS查询,并且缓存一份到本地。
2.抓包验证
通过报文情况可以看到,国外域名第一次查询往往会比较久,因为物理链路距离较长,涉及跨境传输,后面的查询将结果缓存到本地后,则无需再去请求上游DNS,直接命中缓存返回A记录,通过dig命令前后两次对比也可以直观看出。
附带PDF版本: