通常上网使用的 DNS 服务器都是由电信、联通等运营商提供的,或者是公用的 DNS 解析服务器,例如 Google 提供的解析器,这通常会带来些问题,如有时解析不正常、经常弹出广告等。
有时我们需要管理 DNS 解析,如加速 DNS 的解析过程、纠正错误的 DNS 解析记录、配置局域网的 DNS 解析等等。
DNSmasq 就是其中的一个主机上最常用的解决方案,相比 BIND 来说,其更加小巧,配置更加方便,其源码仅有 2 万多行,但足以满足常见的需求。
简介
DNSmasq 是一个小巧且方便地用于配置 DNS 和 DHCP 的工具,它提供了 DNS 功能和可选择的 DHCP 功能,它服务那些只在本机和局域网可用的域名,这些域名是不会在全球的 DNS 服务器中出现的,既不能通过外网访问。
一般情况下,可以用 bind
解决 dns 的问题;dhcpd
解决 dhcp 的问题;用 ypbind
解决自定义 hostname 解析的 ip,而 DNSmasq 已经解决了所有的这些功能,而且配置简单,更适用于虚拟化和大数据环境的部署。
可以使用 dnsmasq 通过缓存来加速 dns 解析,提高上网速度;比 hosts 更强大的域名重定向功能,为在本机测试二级域名提供了很大的方便。
详细的内容可以参考官方网站 www.thekelleys.org.uk 。
安装
在 CentOS 中,可以通过如下方式安装 dnsmasq 。
# yum install dnsmasq // CentOS
# netstat -atunp | grep dnsmasq // 查看系统是否启动
# systemctl [start|restart] dnsmasq // 重启等操作
dnsmasq 的配置文件为 /etc/dnsmasq.conf
。
DHCP 服务器配置
DHCP 的工作过程主要分为以下六个阶段:
- 发现阶段,DHCP 客户端通过广播 DHCP DISCOVER 消息,寻找 DHCP 服务器。
- 提供阶段,所有收到 Discover 消息的 DHCP 服务器都会作出响应,包括了出租的 IP 地址在内的 DHCP OFFER 消息。
- 选择阶段,客户端会选择第一个收到的 Offer 消息,并以广播方式应答一个 DHCP REQUEST 消息,那么没有被选中的服务器将回收之前发出的 IP 地址。
- 确认阶段,服务器收到客户端应答的 Request 消息后,便向客户端再次发送一个包含 IP 地址的 DHCP ACK 确认消息。此时,客户端可以使用服务器提供的 IP 地址与网卡绑定。
- 重新登录阶段,以后客户端重新设置网络时,直接发送包括之前分配 IP 地址的 DHCP REQUEST 信息;服务器收到后,如果可以继续使用该 IP 则返回 ACK 确认消息。否则,返回 NACK 消息,客户端将重新发起一次 Discover 流程。
- 更新租约阶段,在客户端启动以及 IP 租约期限过一半时,客户端都会自动向服务器发送更新其 IP 租约的消息。
接下来,我们看下 DNSmasq 是如何配置 DHCP 服务器的,首先查看本机的 DHCP 服务是否已经启动。
----- DHCP服务器默认使用53号端口
# grep -E '^domain\>' /etc/services
domain 53/tcp # name-domain server
domain 53/udp
----- 查看服务器是否启动
# netstat -tnlp | grep dnsmasq
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 192.168.122.1:53 0.0.0.0:* LISTEN 2623/dnsmasq
如下是其配置文件。
# 服务监听的网络接口地址
listen-address=192.168.1.132,127.0.0.1
# DNS监听端口,如果设置为0则取消DNS功能
port=5353
# 设置默认租期
dhcp-lease-max=150
# dhcp动态分配的地址范围,包括了地址范围,以及租约时间
dhcp-range=192.168.1.50,192.168.1.150,48h
# dhcp服务的静态绑定,包括 MAC 地址、IPv4、主机名
dhcp-host=00:0C:29:5E:F2:6F,192.168.1.201,os02
dhcp-host=00:0C:29:15:63:CF,192.168.1.202,os03
# 租期保存在下面文件
# The DHCP server needs somewhere on disk to keep its lease database.
# This defaults to a sane location, but if you want to change it, use
# the line below.
#dhcp-leasefile=/var/lib/dnsmasq/dnsmasq.leases
# 忽略下面MAC地址的DHCP请求
#dhcp-host=11:22:33:44:55:66,ignore
配置DNS服务
dnsmasq 能够缓存外部 DNS 记录,同时也可以提供本地 DNS 解析或者作为外部 DNS 的代理,也就是说实际上 dnsmasq 支持首先查找 /etc/hosts
等本地解析文件,然后再查找 /etc/resolv.conf
等外部 nameserver 配置文件中定义的外部 DNS。
所以说 dnsmasq 是一个很不错的 DNS 中继,DNS 配置同样写入 dnsmasq.conf
配置文件里。
# 服务监听的网络接口地址,可以指定设备端口、排除一些设备端口或者指定IP地址
listen-address=192.168.1.132,127.0.0.1
# 本地解析文件,默认为 /etc/hosts,可以通过 no-hosts 不使用本地,也可以通过如下指定文件
#addn-hosts=/etc/banner_add_hosts
# 添加额外的上级DNS主机配置文件,默认使用 /etc/resolv.conf
#resolv-file=
# 设置DNS缓存大小,单位是DNS解析的条数,为0时将会禁用缓存,默认为150
cache-size=500
可以对不同的域名指定不同的 DNS 解析服务器,配置如下。
----- 指定淘宝使用114服务器做DNS解析
server=/taobao.com/114.114.114.114
----- 指定Google使用8服务器做DNS解析
server=/google.com/8.8.8.8
或者对指定的域名进行解析,相当于本地 /etc/hosts
的配置,而且支持域名的泛解析,例如 *.foobar.com
类似的格式,示例如下。
----- 可以屏蔽部分广告
address=/ad.youku.com/127.0.0.1
address=/ad.iqiyi.com/127.0.0.1
----- 或者使用泛解析
address=/*.minio.com/127.0.0.1
----- 将xxx.minio.com解析为本地地址
address=/minio.com/127.0.0.1
注意,类似 dig 默认是按照 /etc/hosts
/etc/resolv.conf
的顺序进行访问,所以需要使用如下命令指定使用本地域名解析。
dig @127.0.0.1 test.minio.com
dig @127.0.0.1 *.minio.com
参考
- DNSmasq 官方网站,关于 DHCP 和 DNS 的配置可以参考 DNSmasq – 配置DNS和DHCP 。