当前位置:首页 > 运维 > 正文内容

dnsmasq搭建DNS服务器详解

phpmianshi8年前 (2013-04-18)运维723


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=172.21.0.15,127.0.0.1
listen-address=172.21.0.15,127.0.0.1

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
#解析记录
10.10.33.22 test.phpmianshi.com
10.10.33.21 test2.phpmianshi.com
10.4.29.106      www.taobao.com
10.4.24.116      www.baidu.com


注意:/etc/hosts 文件修改后需要重启 dnsmasq,否则修改不会生效。一定要确定是真的重启了,可以先关闭,netstat -lnp |grep 53 看是否还在监听。

#重启
systemctl restart dnsmasq
# 设置为开机自启动
systemctl enable dnsmasq
# 启动 dnsmasq 服务
systemctl start dnsmasq



我们搭建的 DNS 服务器地址为:172.21.0.15


使用 dig 命令指定 DNS 服务器地址来查看解析是否生效:

dig @172.21.0.15 phpmianshi.com

;; QUESTION SECTION:
;phpmianshi.com.                    IN      A

;; ANSWER SECTION:
phpmianshi.com.             0       IN      A       10.10.10.10


验证 Dnsmasq 缓存功能是否生效

首先使用 dig 查询一个之前未查询过的域名,然后看响应时间是多少:178 msec

第一次 dig:

dig @172.21.0.15 meichaxun.com

;; QUESTION SECTION:
;meichaxun.com.                 IN      A

;; ANSWER SECTION:
meichaxun.com.          3600    IN      A       47.74.46.59

;; Query time: 178 msec
;; SERVER: 172.21.0.15#53(172.21.0.15)
;; WHEN: Tue May 26 18:35:34 CST 2020
;; MSG SIZE  rcvd: 58

  

第二次 dig:Query time: 0 msec 说明第二次直接是从缓存中取的数据,没有向上游服务器发起请求。


Dnsmasq 的缓存在哪里?如何查看?

dnsmasq 的缓存并不是保存在本地磁盘的某个文件,而是存储在内存中,因此是无法直接查看的。


当然作为一个 Geek,想要查看缓存的内容也是有办法的:
1.dnsmasq 启动参数添加 --log-queries

vi /usr/lib/systemd/system/dnsmasq.service
ExecStart=/usr/sbin/dnsmasq -k 改为:ExecStart=/usr/sbin/dnsmasq -k --log-queries


2.重新加载 Systemd Unit 配置文件

systemctl daemon-reload


3.重启 dnsmasq

systemctl restart dnsmasq


4.执行如下命令 dump 出来缓存内容到 journal 日志

kill -SIGUSR1 <PID>


5.查看 dump 出来的 dns 记录(dnsmasq 当前缓存的内容)


dig @172.21.0.15 meichaxun.com
journalctl -u dnsmasq
#最下面找到如下信息,看到了缓存的内容
May 26 18:41:42 VM_0_15_centos dnsmasq[15339]: query[A] meichaxun.com from 172.2
1.0.15
May 26 18:41:42 VM_0_15_centos dnsmasq[15339]: cached meichaxun.com is 47.74.46.
59


版权声明:本文由PHP面试资料网发布,如需转载请注明出处。
分享给朋友:

相关文章

进程间通信的方式

进程间通信的方式

1.管道    管道,通常指无名管道,是 UNIX 系统IPC最古老的形式。    1.匿名管道:  ...


1、应用程序中调用read() 方法,这里会涉及到一次上下文切换(用户态->内核态),底层采用DMA(direct memory access)读取磁盘的文件,并把内容存储到内核地址空间的读取缓存区。

操作系统检测到进程向I/O设备发起请求后就暂停进程的运行,怎么暂停运行呢?

很简单:只需要记录下当前进程的运行状态并把CPU的PC寄存器指向其它进程的指令就可以了。
进程有暂停就会有继续执行,因此操作系统必须保存被暂停的进程以备后续继续执行,显然我们可以用队列来保存被暂停执行的进程。

注意:现代磁盘向内存copy数据时无需借助CPU的帮助,这就是所谓的DMA(Direct Memory Access)。

实际上:操作系统中除了有阻塞队列之外也有就绪队列,所谓就绪队列是指队列里的进程准备就绪可以被CPU执行了。
你可能会问为什么不直接执行非要有个就绪队列呢?

答案很简单:那就是僧多粥少,在即使只有1个核的机器上也可以创建出成千上万个进程,CPU不可能同时执行这么多的进程,因此必然存在这样的进程,即使其一切准备就绪也不能被分配到计算资源,这样的进程就被放到了就绪队列。

当进程A被暂停执行后CPU是不可以闲下来的,因为就绪队列中还有嗷嗷待哺的进程B,这时操作系统开始在就绪队列中找下一个可以执行的进程,也就是这里的进程B。
此时操作系统将进程B从就绪队列中取出,找出进程B被暂停时执行到的机器指令的位置,然后将CPU的PC寄存器指向该位置,这样进程B就开始运行啦。

此后磁盘终于将全部数据都copy到了进程A的内存中,这时磁盘通知操作系统任务完成啦,你可能会问怎么通知呢?这就是中断
操作系统接收到磁盘中断后发现数据copy完毕,进程A重新获得继续运行的资格,这时操作系统小心翼翼的把进程A从阻塞队列放到了就绪队列当中。

注意:从前面关于就绪状态的讨论中我们知道,操作系统是不会直接运行进程A的,进程A必须被放到就绪队列中等待,这样对大家都公平。

此后进程B继续执行,进程A继续等待,进程B执行了一会儿后操作系统认为进程B执行的时间够长了,因此把进程B放到就绪队列,把进程A取出并继续执行。

注意:操作系统把进程B放到的是就绪队列,因此进程B被暂停运行仅仅是因为时间片到了而不是因为发起I/O请求被阻塞。

进程A继续执行,此时buff中已经装满了想要的数据,进程A就这样愉快的运行下去了,就好像从来没有被暂停过一样


2、由于应用程序无法读取内核地址空间的数据,如果应用程序要操作这些数据,必须把这些内容从读取缓冲区拷贝到用户缓冲区。这个时候,read() 调用返回,且引发一次上下文切换(内核态->用户态),现在数据已经被拷贝到了用户地址空间缓冲区,这时,如果有需要,应用程序可以操作修改这些内容。

3、我们最终目的是把这个文件内容通过Socket传到另一个服务中,调用Socket的send()方法,这里又涉及到一次上下文切换(用户态->内核态),同时,文件内容被进行第三次拷贝,被再次拷贝到内核地址空间缓冲区,但是这次的缓冲区与目标套接字相关联,与读取缓冲区没有半点关系。

4、send()调用返回,引发第四次的上下文切换,同时进行第四次的数据拷贝,通过DMA把数据从目标套接字相关的缓存区传到协议引擎进行发送。

"在整个过程中,过程1和4是由DMA负责,并不会消耗CPU,只有过程2和3的拷贝需要CPU参与


如果在应用程序中,不需要操作内容,过程2和3就是多余的,如果可以直接把内核态读取缓存冲区数据直接拷贝到套接字相关的缓存区,是不是可以达到优化的目的?

Linux中nio的实现原理

我们上一篇文章 《linux中netstat和ss命令详解》中提到了nio 原文:https://phpmianshi.com/?id=105有一些小伙伴私信想了解什么是nio,我们这篇详细介绍下什么...

linux中利用nethogs查看哪些进程占用网络带宽

centos6版本安装1、安装依赖包yum install ncurses* -y yum install libpcap* -y2、下载...

linux中多文件按行拼接整合命令paste

概念Linux下的paste命令主要用于从多个文件(包括标准输入)中读取内容,将每个文件的对应行用指定分隔符(默认tab制表符)拼接起来并打印到标准输出,我们可以使用重定向命令“>”将输出结果保...

Certbot-免费的https证书

什么是HTTPS?HTTP:是互联网上应用最为广泛的一种网络协议,是一个客户端和服务器端请求和应答的标准(TCP),用于从WWW服务器传输超文本到本地浏览器的传输协议,它可以使浏览器更加高效,使网络传...

linux中如何查看系统io使用情况

linux中查看IO的方法主要有下面几种方法:1. top   %wa    的含义是等待输入输出的CPU时间百分比,这个数字越高说明越多的CPU资源...

发表评论

访客

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。