Dnsmasq 简介
Dnsmasq 是一个轻量级的 DNS 缓存、DHCP、TFTP、PXE 服务器。
作为域名解析服务器,dnsmasq 可以通过缓存 DNS 请求来提高对访问过域名的解析速度。 作为 DHCP 服务器,Dnsmasq 可以用于为局域网电脑分配内网 IP 地址和提供路由。DNS 和 DHCP 两个功能可以同时或分别单独实现。
Dnsmasq 的应用场景
1. 比如 Kubernetes 的 kube-dns 组件中就用 dnsmasq 容器作为 DNS 服务器,用 kube-dns 容器作为 dnsmasq 的上游服务器。dnsmasq 本身具有缓存功能,所以可以大大提高集群中服务名的解析速度,而不需要每次解析请求都访问 kube-dns 容器。
2. 实现 DNS 劫持功能。在自己的服务器上使用taobao.com就访问自己指定的IP,虽然使用本地hosts文件也可以实现,但是在当下的集群服务环境下管理那么多IP地扯池是非常繁琐的。
3. 在一些dev环境或者办公环境中,无论是使用或是配置上都更加快捷和简单
Dnsmasq 的工作原理
Dnsmasq 在接受到用户的一个 DNS 请求时,首先会查找 /etc/hosts 这个文件,如果 /etc/hosts 文件没有请求的记录,然后查找 /etc/resolv.conf 中定义的外部 DNS(也叫上游 DNS 服务器,nameserver 配置),外部 DNS 通过递归查询查找到请求后响应给客户端,然后 dnsmasq 将请求结果缓存下来(缓存到内存)供后续的解析请求。
配置 Dnsmasq 为 DNS 缓存服务器,同时在 /etc/hosts 文件中加入本地内网解析,这样一来每当内网机器查询时就会优先查询 hosts 文件,这就等于将 /etc/hosts 共享给全内网机器使用,从而解决内网机器互相识别的问题。相比逐台机器编辑 hosts 文件或者添加 Bind DNS 记录,仅编辑一个 hosts 文件,这简直太容易了。
DNS反劫持: bogus-nxdomain=x.x.x.x x.x.x.x是劫持域名的服务器地址,可以通过ping一个不存在的域名得到。如ping bucunzai.com。 DNS反污染: 将会被污染的域名发送到不会污染的域名服务器 server=/www.google.com/8.8.8.8 去广告: 把广告域名解析为空: address=/www.guanggao.com/0.0.0.0
Dnsmasq 安装和配置
Dnsmasq 的安装特别简单,以 Centos7 下安装为例:
sudo yum install -y dnsmasq
vim /etc/dnsmasq.conf
#监听本机ip地址
listen-address=127.0.0.1
#如果你想让本机所在的局域网的电脑也能够使用上Dnsmasq,应该把本机的局域网IP加上:
listen-address=127.0.0.1,192.168.161.239
resolv-file配置上游DNS服务器,如果不开启就使用linux主机默认的/etc/resolv.conf里的nameserver
resolv-file=/etc/resolv.conf
#实际解析按照resolv-file中从上到下dns server的顺序进行指派解析
strict-order
#address 可以将指定的域解析为一个IP地址,即泛域名解析。
# 强制解析域名 将*.phpmianshi.com 解析到10.10.10.10
address=/phpmianshi.com/10.10.10.10
#指定上游DNS服务器 把所有.com的域名全部通过 114.114.114.114 这台国内DNS服务器来解析
server=/com/114.114.114.114
#本地主机解析记录 如果你想读取其他类似/etc/hosts文件,则进行配置
addn-hosts=/etc/hosts
vim /etc/hosts
#解析记录
192.168.161.239 dev.sqlark.com
192.168.161.239 askdev.sqlark.com
注意:/etc/hosts 文件修改后需要重启 dnsmasq,否则修改不会生效。一定要确定是真的重启了,可以先关闭,netstat -lnp |grep 53 看是否还在监听。
#重启
systemctl restart dnsmasq
# 设置为开机自启动
systemctl enable dnsmasq
# 启动 dnsmasq 服务
systemctl restart dnsmasq
如果你想让本机所在的局域网的电脑也能够使用上Dnsmasq,应该把本机的局域网IP加上:listen-address=192.168.161.239,127.0.0.1
我们搭建的 DNS 服务器地址为:192.168.161.239
使用 dig 命令指定 DNS 服务器地址来查看解析是否生效:
dig @192.168.161.239 dev.sqlark.com
[root@161-239 ~]# dig @192.168.161.239 dev.sqlark.com
; <<>> DiG 9.11.4-P2-RedHat-9.11.4-26.P2.el7_9.13 <<>> @192.168.161.239 dev.sqlark.com
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40866
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;dev.sqlark.com. IN A
;; ANSWER SECTION:
dev.sqlark.com. 0 IN A 192.168.161.239
;; Query time: 0 msec
;; SERVER: 192.168.161.239#53(192.168.161.239)
;; WHEN: Fri May 05 09:55:34 CST 2023
;; MSG SIZE rcvd: 59