在滴滴云 DC2 云服务器上搭建本地 DNS 服务

搭建本地 DNS 服务器具有很多用处,例如作为本地 DNS 使用、应对 ISP 的 DNS 劫持、智能 DNS 加快解析速度、屏蔽网页广告、指定域名解析到特定的 IP 上等。

一、DNS 查询过程简介

DNS 是网络分层里的应用层协议,事实上它是为其他应用层协议工作的,简单说就是把域名转化为 IP 地址(同时也提供反向域名查询的功能),因为机器识别的是拥有固定格式和含义的 IP 地址,而域名则没有固定格式,不利于机器识别,因此当访问某个域名,如 http://www.google.com ,实际访问的是它的 IP 地址。

DNS 实际查询过程分为多步,例如当用户在地址栏输入一个 URL 之后,浏览器首先查询浏览器缓存,找不到就去查询 Hosts 文件和本地 DNS 缓存,如果 Hosts 和本地 DNS 缓存都没有找到域名对应的 IP,则进入路由器的缓存中检查,若未找到则进入 ISP DNS 缓存中查询,最终才向根 DNS 服务器发出 DNS 查询报文,再找不到就报错。DNS 主要使用 UDP 收发报文,也支持 TCP 收发,TCP、UDP 访问均使用熟知端口 53。

二、使用 DNSmasq 搭建 DNS 服务

DNSmasq 是一个轻量级的 DNS、TFTP 和 DHCP 服务器。它的目的是给局域网提供配对的 DNS 和 DHCP 服务。 DNSmasq 接受 DNS 查询,并从一个小的本地高速缓存应答它们或将其转发到一个真正的递归 DNS 服务器。该软件也被安装在路由器上来缓存 DNS 查询。DNSmasq 可以解决小范围的 DNS 查询问题,如果业务是跨机房、跨地区的话不建议使用 DNSmasq做为 DNS 解析服务器。

2.1 DNSmasq 安装

DNSmasq 可通过 yum 安装或源码安装,使用 yum 安装时,执行:

yum install dnsmasq –y

如果想使用最新版本,可从官网下载源码包进行安装,DNSmasq 官网为:http://www.thekelleys.org.uk/dnsmasq/doc.html , DNSmasq下载地址为:http://www.thekelleys.org.uk/dnsmasq/

tar –zxvf dnsmasq-2.76.tar.gz
cd dnsmasq-2.76
make install

2.2 DNSmasq 配置与使用

2.2.1 DNSmasq 的配置

DNSmasq 的配置在 /etc/dnsmasq.conf 中。DNSmasq 的查询顺序是先解析 Hosts 文件,再解析 /etc/dnsmasq.d/ 下的 *.conf 文件,最后通过 /etc/resolv.conf 或自定义的 resolv-file 指定配置的上游 DNS 进行查询。

本文仅对 DNSmasq 中 DNS 配置部分进行简要介绍,更多详细配置参考 /etc/dnsmasq.conf 注释。

配置项 配置项说明
resolv-file 定义从哪获取上游DNS服务器的地址, 默认从/etc/resolv.conf获取
strict-order 严格按照/etc/resolv.conf中的配置顺序进行查询,直到取得结果
listen-address 定义dnsmasq监听的地址
no-hosts 不通过/etc/hosts进行本地DNS查询
no-resolv 不通过/etc/resolv.conf或resolv-file配置进行上游DNS查询
server 对不同域名指定使用不同的上游DNS,可用于智能DNS加速
port 指定DNS端口,默认为53,port=0将完全禁用DNS功能
cache-size 缓存条数,默认为150条
bogus-nxdomain 对于任何被解析到此IP的域名,响应NXDOMAIN使其解析失败。通常用于访问不存在的域名时,禁止其跳转到运营商的广告站点

首先配置 dnsmasq.conf,设置监听地址及上游 DNS 服务器地址,根据需要设置 DNS 查询顺序,域名解析策略等,例如:

resolv-file=/etc/resolv.dnsmasq.conf
strict-order      
listen-address=127.0.0.1

然后在 /etc/resolv.dnsmasq.conf 中添加需要的上游 DNS 地址,如:

echo 'nameserver 8.8.8.8' > /etc/resolv.dnsmasq.conf

修改 /etc/resolv.conf,添加本地 DNS 服务地址,如:

echo 'nameserver 127.0.0.1' > /etc/resolv.conf

配置完成后,先查询配置是否正确(其他选项见 DNSmasq --help):

dnsmasq --test

确认配置无误后,启动 DNSmasq 服务:

service dnsmasq start

2.2.2 使用 DNSmasq 进行 DNS 查询

通过 dig 或 host 命令可以进行 DNS 查询,由于之前在 /etc/resolv.conf 中配置了本地 DNS,因此会首先通过 DNSmasq 进行本地查询,查询结果如下:

dig blog.didiyun.com

; <<>> DiG 9.9.4-RedHat-9.9.4-51.el7_4.2 <<>> blog.didiyun.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31164
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 1

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 512
;; QUESTION SECTION:
;blog.didiyun.com.		IN	A

;; ANSWER SECTION:
blog.didiyun.com.	59	IN	CNAME	f2oviq.waf.didiyun.com.
f2oviq.waf.didiyun.com.	599	IN	A	116.85.0.249
f2oviq.waf.didiyun.com.	599	IN	A	116.85.0.248

;; Query time: 725 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Mon Dec 17 19:19:21 CST 2018
;; MSG SIZE  rcvd: 102

域名地址映射变化频率较低,为提高查询效率,主机在启动时从本地服务器下载名和地址的全部数据,并维护存放自己最近使用的域名的缓存,并且只在从缓存中找不到名字时才使用根域名服务器发起查询。

在 DNS 查询过程中,当一个 DNS 服务器接收到一个 DNS 回答后,会将其信息缓存一段时间,当再有一个对相同域名的查询时,便可直接回复。通过 DNS 缓存,大部分查询都只需要本地 DNS 服务器便可完成解析。

在使用 DNSmasq时会发现,当一段时间内再次查询相同域名时,会发现 Query time 减少为 0 msec。

2.2.3 清除 DNSmasq 的 DNS 缓存

有时 DNS 缓存可能存在被污染的风险(e.g. 路由器被攻击导致域名 DNS 缓存被修改,或某个域名地址映射发生变更),此时可以通过清除缓存来让本地 DNS 服务器重新回到上级 DNS 进行查询。DNSmasq 服务只需重新启动即可清除 DNS 缓存:service dnsmasq restart

你可能感兴趣的:(云计算,开源)