DNSmasq安装与配置

时间:2021-7-4 作者:qvyue

一、起因

现在很多路由都支持自定义hosts,可以将局域网中的域名解析到自定义的IP中,但是公司用了华为ASG当路由, 这个就不能自定义hosts了,所以可以局域网中搭建一个内网DNS服务器,然后将华为ASC的DNS配置成内网DNS服务器IP就可以了。

二、DNSmasq的简介

这里用轻量的Dnsmasq服务器来实现内网DNS服务器搭建。Dnsmasq 是提供 DNS 缓存和 DHCP 服务功能。作为域名解析服务器(DNS),dnsmasq可以通过缓存 DNS 请求来提高对访问过的网址的连接速度。作为DHCP 服务器,dnsmasq 可以用于为局域网电脑分配内网ip地址和提供路由。DNS和DHCP两个功能可以同时或分别单独实现。dnsmasq轻量且易配置,适用于个人用户或少于50台主机的网络。此外它还自带了一个 PXE 服务器。

三、安装DNSmasq

yum install -y dnsmasq

四、开启防火墙

firewall-cmd --zone=public --add-port=53/tcp --permanent
firewall-cmd --zone=public --add-port=53/udp --permanent
firewall-cmd --reload

五、简单配置启用hosts功能

先做一个简单快捷的配置,配置一个类似于本地hosts功能的DNS。

5.1 vim /etc/dnsmasq.conf

no-hosts                              # 此配置可以直接查询上游DNS了
resolv-file=/etc/resolv.dnsmasq.conf  # 配置上游服务文件,严格按照文件中的顺序进行查找
strict-order                          # 取消这一行的注释,表示严格按照resolv.conf中的顺序进行查找。
listen-address=192.168.0.2,127.0.0.1  # 如果想允许所有的用户使用你的DNS解析服务器,把listen-address去掉即可。
addn-hosts=/etc/dnsmasq.hosts         # 配置DNS服务器hosts文件

5.2 vim /etc/resolv.dnsmasq.conf

配置上游的DNS

nameserver 8.8.8.8
nameserver 114.114.114.114

5.3 vim /etc/dnsmasq.hosts

配置DNS服务器的hosts文件

# 这里就是配置ip 域名的解析
# 如:将 guoke.com 解析到 192.168.0.55
192.168.0.55 guoke.com

六、启动

systemctl start dnsmasq   # 启动
systemctl stop dnsmasq    # 关闭
systemctl restart dnsmasq # 重启
systemctl enable dnsmasq  # 设置开机启动 

七、/etc/dnsmasq.conf详细解析

7.1 提升DNS加快解析速度,server=后面可以添加指定的DNS,例如国内外不同的网站使用不同的DNS。

国内指定DNS

server=/cn/114.114.114.114
server=/taobao.com/114.114.114.114
server=/taobaocdn.com/114.114.114.114

国外指定DNS

server=/google.com/8.8.8.8

7.2 屏蔽网页广告,将指广告的URL指定127这个IP,就可以将网页上讨厌的广告给去掉了。

address=/ad.youku.com/127.0.0.1
address=/ad.iqiyi.com/127.0.0.1

7.3 指定域名解析到特定的IP上。这个功能可以让你控制一些网站的访问,非法的DNS就经常把一些正规的网站解析到不正确IP上。

address=/zengwu.com.cn/39.98.60.8

八、附/etc/dnsmasq.conf文件解析

# 不加载本地的 /etc/hosts 文件

#no-hosts

# 添加读取额外的 hosts 文件路径,可以多次指定。如果指定为目录,则读取目录中的所有文件。

#addn-hosts=/etc/dnsmasq.hosts.d

# 读取目录中的所有文件,文件更新将自动读取

#hostsdir=/etc/dnsmasq.hosts.d

# 例如,/etc/hosts中的os01将扩展成os01.example.com

#expand-hosts



##############################################################################

# 缓存时间设置,一般不需要设置

# 本地 hosts 文件的缓存时间,通常不要求缓存本地,这样更改hosts文件后就即时生效。

#local-ttl=3600

# 同 local-ttl 仅影响 DHCP 租约

#dhcp-ttl=

# 对于上游返回的值没有ttl时,dnsmasq给一个默认的ttl,一般不需要设置,

#neg-ttl=

# 指定返回给客户端的ttl时间,一般不需要设置

#max-ttl=

# 设置在缓存中的条目的最大 TTL。

#max-cache-ttl=

# 不需要设置,除非你知道你在做什么。

#min-cache-ttl=

# 一般不需要设置

#auth-ttl=



##############################################################################

# 记录dns查询日志,如果指定 log-queries=extra 那么在每行开始处都有额外的日志信息。

#log-queries

# 设置日志记录器,'-' 为 stderr,也可以是文件路径。默认为:DAEMON,调试时使用 LOCAL0。

#log-facility=

#log-facility=/var/log/dnsmasq/dnsmasq.log

# 异步log,缓解阻塞,提高性能。默认为5,最大100。

#log-async[=]

#log-async=50



##############################################################################

# 指定用户和组

#user=nobody

#group=nobody



##############################################################################

# 指定DNS的端口,默认53,设置 port=0 将完全禁用 DNS 功能,仅使用 DHCP/TFTP

#port=53

# 指定 EDNS.0 UDP 包的最大尺寸,默认为 RFC5625 推荐的 edns-packet-max=4096

#edns-packet-max=

# 指定向上游查询的 UDP 端口,默认是随机端口,指定后降低安全性、加快速度、减少资源消耗。

# 设置为 '0' 由操作系统分配。

#query-port=53535

# 指定向上游查询的 UDP 端口范围,方便防火墙设置。

#min-port=

#max-port=

# 指定接口,指定后同时附加 lo 接口,可以使用'*'通配符。

# 不能使用接口别名(例如:"eth1:0"),请用 listen-address 选项替代。

#interface=wlp2s0

# 指定排除的接口,排除优先级高,可以使用'*'通配符

#except-interface=

# 仅接受同一子网的 DNS 请求。

# 仅在未指定 interface、except-interface、listen-address 或者 auth-server 时有效。

#local-service

# 指定不提供 DHCP 或 TFTP 服务的接口,仅提供 DNS 服务。

#no-dhcp-interface=enp3s0

# 指定IP地址,可以多次指定。

# interface 选项和 listen-address 选项可以同时使用。

# 下面两行与指定 interface 选项的作用类似。

listen-address=192.168.10.17

#listen-address=127.0.0.1

# 通常情况下即使设置了 interface 选项(例如:interface=wlp2s0 )

# 将仍然绑定到通配符地址(例如:*:53 )。

# 开启此项将仅监听指定的接口。

# 适用于在同一主机的不同接口或 IP 地址上运行多个 dns 服务器。

bind-interfaces

# 对于新添加的接口不进行绑定。仅 Linux 系统支持,其他系统等同于 bind-interfaces 选项。

#bind-dynamic



##############################################################################

# 如果 hosts 中的主机有多个 IP 地址,仅返回对应子网的 IP 地址。

localise-queries

# 如果反向查找的是私有地址例如192.168.X.X,仅从 hosts 文件查找,不再转发到上游服务器

#bogus-priv

# 对于任何被解析到此 IP 的域名,将响应 NXDOMAIN 使其解析失效,可以多次指定

# 通常用于对于访问不存在的域名,禁止其跳转到运营商的广告站点。

#bogus-nxdomain=64.94.110.11

# 忽略包含指定地址的 A 记录查询的回复。

# 例如上游有台 dns 服务器伪造 www.baidu.com 的 IP 为 1.1.1.1 并且响应速度非常快。

# 指定 ignore-address=1.1.1.1 可以忽略它的响应信息,

# 从而等待 www.baidu.com 正确的查询结果。

#ignore-address=

filterwin2k



##############################################################################

# 指定 resolv-file 文件路径,默认/etc/resolv.conf

#resolv-file=/etc/resolv.conf

# 不读取 resolv-file 来确定上游服务器

#no-resolv

# 在编译时需要启用 DBus 支持。

#enable-dbus[=]

# 严格按照resolv.conf中的顺序进行查找

#strict-order

# 向所有上游服务器发送查询,而不是一个。

all-servers

# 启用转发循环检测

#dns-loop-detect



##############################################################################

# 这项安全设置是拒绝解析包含私有 IP 地址的域名,

# 这些IP地址包括如下私有地址范围:10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。

# 其初衷是要防止类似上游DNS服务器故意将某些域名解析成特定私有内网IP而劫持用户这样的安全***。

# 直接在配置文件中注销 stop-dns-rebind 配置项从而禁用该功能。

# 这个方法确实可以一劳永逸的解决解析内网 IP 地址的问题,

# 但是我们也失去了这项安全保护的特性,所以在这里我不推荐这个办法。

# 使用 rebind-domain-ok 进行特定配置,顾名思义该配置项可以有选择的忽略域名的 rebind 行为

stop-dns-rebind

rebind-localhost-ok

#rebind-domain-ok=[]|[[//[/]

rebind-domain-ok=/.test.com/



##############################################################################

# 也不要检测 /etc/resolv.conf 的变化

#no-poll

# 重启后清空缓存

clear-on-reload

# 完整的域名才向上游服务器查找,如果仅仅是主机名仅查找hosts文件

domain-needed



##############################################################################

# IP地址转换

#alias=[]|[-],[,]

##############################################################################

#local=[/[]/[domain/]][[#][@|[#]]

#server=[/[]/[domain/]][[#][@|[#]]

server=/test.com/192.168.10.117

server=/10.168.192.in-addr.arpa/192.168.10.117

#rev-server=/,[#][@|[#]]



# 将任何属于  域名解析成指定的  地址。

# 也就是将  及其所有子域名解析成指定的  IPv4 或者 IPv6 地址,通常用于屏蔽特定的域名。

# 一次只能指定一个 IPv4 或者 IPv6 地址,要同时返回 IPv4 和IPv6 地址,请多次指定 address= 选项。

# 注意: /etc/hosts 以及 DHCP 租约将覆盖此项设置。

#address=//[domain/][]



#ipset=//[domain/][,]

#mx-host=[[,],]

#mx-target=



# SRV 记录

#srv-host=..[],[[,[,[,]]]]



# A, AAAA 和 PTR 记录 

#host-record=[,....],[],[][,]



# TXT 记录

#txt-record=[[,],]



# PTR 记录 

#ptr-record=[,]



#naptr-record=,,,,,[,]



# CNAME 别名记录

#cname=,[,]





#dns-rr=,,[]

#interface-name=,[/4|/6]

#synth-domain=,[,]

#add-mac[=base64|text]

#add-cpe-id=

#add-subnet[[=[/]][,[/]]]

##############################################################################



##############################################################################

# 缓存条数,默认为150条,cache-size=0 禁用缓存。

cache-size=1000

# 不缓存未知域名缓存,默认情况下dnsmasq缓存未知域名并直接返回为客户端。

no-negcache

# 指定DNS同属查询转发数量

dns-forward-max=1000



##############################################################################

#dnssec

#trust-anchor=[],,,,,

#dnssec-check-unsigned

#dnssec-no-timecheck

#dnssec-timestamp=

#proxy-dnssec

#dnssec-debug



##############################################################################

#auth-server=,|

#auth-zone=[,[/][,[/].....]]

#auth-zone=[,[/6|/4][,[/6|/4].....]]

#auth-soa=[,[,[,[,]]]]

#auth-sec-servers=[,[,...]]

#auth-peer=[,[,...]]



# 启用连接跟踪,读取 Linux 入栈 DNS 查询请求的连接跟踪标记,

# 并且将上游返回的响应信息设置同样的标记。

# 用于带宽控制和防火墙部署。

# 此选项必须在编译时启用 conntrack 支持,并且内核正确配置并加载 conntrack。

# 此选项不能与 query-port 同时使用。

#conntrack





##############################################################################

#

#        DHCP 选项

#

##############################################################################

# 设置 DHCP 地址池,同时启用 DHCP 功能。

# IPv4  可指定为 static|proxy ,当  指定为 static 时,

# 需用 dhcp-host 手动分配地址池中的 IP 地址。

# 当  指定为 proxy 时,为指定的地址池提供 DHCP 代理。

#dhcp-range=[tag:[,tag:],][set:,][,][,][,[,]][,]

#dhcp-range=172.16.0.2,172.16.0.250,255.255.255.0,1h

#dhcp-range=192.168.10.150,192.168.10.180,static,255.255.255.0,1h



# 根据 MAC 地址或 id 固定分配客户端的 IP 地址、主机名、租期。

# IPv4 下指定 id:* 将忽略 DHCP 客户端的 ID ,仅根据 MAC 来进行 IP 地址分配。

# 在读取 /etc/hosts 的情况,也可以根据 /etc/hosts 中的主机名分配对应 IP 地址。

# 指定 ignore 将忽略指定客户端得 DHCP 请求。

#dhcp-host=[][,id:|*][,set:][,][,][,][,ignore]

#dhcp-hostsfile=

#dhcp-hostsdir=

# 读取 /etc/ethers 文件 与使用 dhcp-host 的作用相同。IPv6 无效。

#read-ethers



# 指定给 DHCP 客户端的选项信息,

# 默认情况下 dnsmasq 将发送:子网掩码、广播地址、DNS 服务器地址、网关地址、域等信息。

# 指定此选项也可覆盖这些默认值并且设置其他选项值。

# 重要:可以使用 option:或者 option号 来指定。

#  和 option号的对应关系可使用命令:

# dnsmasq --help dhcp 以及 dnsmasq --help dhcp6 查看,这点很重要。

# 例如设置网关参数,既可以使用 dhcp-option=3,192.168.4.4 也可以使用 dhcp-option = option:router,192.168.4.4。

# 0.0.0.0 意味着当前运行 dnsmasq 的主机地址。

# 如果指定了多个 tag: 必须同时匹配才行。

# [encap:,][vi-encap:,][vendor:[],] 有待继续研究。

#dhcp-option=[tag:,[tag:,]][encap:,][vi-encap:,][vendor:[],][|option:|option6:|option6:],[[,]]

#dhcp-option-force=[tag:,[tag:,]][encap:,][vi-encap:,][vendor:[],],[[,]]

#dhcp-optsfile=

#dhcp-optsdir=

#dhcp-option=3,1.2.3.4

#dhcp-option=option:router,1.2.3.4

#dhcp-option=option:router,192.168.10.254

#dhcp-option=option:dns-server,192.168.10.254,221.12.1.227,221.12.33.227



##############################################################################

# (IPv4 only) 禁用重用服务器名称和文件字段作为额外的 dhcp-option 选项。

# 一般情况下 dnsmasq 从 dhcp-boot 移出启动服务器和文件信息到 dhcp-option 选项中。

# 这使得在 dhcp-option 选项封包中有额外的选项空间可用,但是会使老的客户端混淆。

# 此选项将强制使用简单并安全的方式来避免此类情况。可以认为是一个兼容性选项。

#dhcp-no-override



##############################################################################

# 配置 DHCP 中继。

#  是运行 dnsmasq 的接口的 IP 地址。

# 所有在  接口上接收到的 DHCP 请求将中继到  指定的远程 DHCP 服务器。

# 可以多次配置此选项,使用同一个  转发到多个不同的  指定的远程 DHCP 服务器。

#  仅允许使用 IP 地址,不能使用域名等其他格式。

# 如果是 DHCPv6, 可以是 ALL_SERVERS 的多播地址 ff05::1:3 。

# 在这种情况下必须指定接口  ,不能使用通配符,用于直接多播到对应的 DHCP 服务器所在的接口。

#  指定了仅允许接收从  接口的 DHCP 服务器相应信息。

#dhcp-relay=,[,]



##############################################################################

# 设置标签

#dhcp-vendorclass=set:,[enterprise:,]

#dhcp-userclass=set:,

#dhcp-mac=set:,

#dhcp-circuitid=set:,

#dhcp-remoteid=set:,

#dhcp-subscrid=set:,

#dhcp-match=set:,|option:
|vi-encap:[,]

#tag-if=set:[,set:[,tag:[,tag:]]]



#dhcp-proxy[=]......



##############################################################################

# 不分配匹配这些 tag: 的 DHCP 请求。

#dhcp-ignore=tag:[,tag:]

#dhcp-ignore-names[=tag:[,tag:]]

#dhcp-generate-names=tag:[,tag:]

# IPv4 only 使用广播与匹配 tag: 的客户端通信。一般用于兼容老的 BOOT 客户端。

#dhcp-broadcast[=tag:[,tag:]] 



##############################################################################

# IPv4 only 设置 DHCP 服务器返回的 BOOTP 选项,

#  可选,

# 如果未设置服务器名称将设为空,服务器地址设为 dnsmasq 的 IP 地址。

# 如果指定了多个 tag: 必须同时匹配才行。

# 如果指定  将按照 /etc/hosts 中对应的 IP 地址进行轮询负载均衡。  

#dhcp-boot=[tag:,],[[,|]]

# 根据不同的类型使用不同的选项。

# 使用示例:

#        dhcp-match=set:EFI_x86-64,option:client-arch,9

#        dhcp-boot=tag:EFI_x86-64,uefi/grubx64.efi

#        #dhcp-match=set:EFI_Xscale,option:client-arch,8

#        #dhcp-boot=tag:EFI_Xscale,uefi/grubx64.efi

#        #dhcp-match=set:EFI_BC,option:client-arch,7

#        #dhcp-boot=tag:EFI_BC,uefi/grubx64.efi

#        #dhcp-match=set:EFI_IA32,option:client-arch,6

#        #dhcp-boot=tag:EFI_IA32,uefi/grubx64.efi

#        #dhcp-match=set:Intel_Lean_Client,option:client-arch,5

#        #dhcp-boot=tag:Intel_Lean_Client,uefi/grubx64.efi

#        #dhcp-match=set:Arc_x86,option:client-arch,4

#        #dhcp-boot=tag:Arc_x86,uefi/grubx64.efi

#        #dhcp-match=set:DEC_Alpha,option:client-arch,3

#        #dhcp-boot=tag:DEC_Alpha,uefi/grubx64.efi

#        #dhcp-match=set:EFI_Itanium,option:client-arch,2

#        #dhcp-boot=tag:EFI_Itanium,uefi/grubx64.efi

#        #dhcp-match=set:NEC/PC98,option:client-arch,1

#        #dhcp-boot=tag:NEC/PC98,uefi/grubx64.efi

#        dhcp-match=set:Intel_x86PC,option:client-arch,0

#        dhcp-boot=tag:Intel_x86PC,pxelinux.0



##############################################################################

# DHCP 使用客户端的 MAC 地址的哈希值为客户端分配 IP 地址,

# 通常情况下即使客户端使自己的租约到期,客户端的 IP 地址仍将长期保持稳定。

# 在默认模式下,IP 地址是随机分配的。

# 启用 dhcp-sequential-ip 选项将按顺序分配 IP 地址。

# 在顺序分配模式下,客户端使租约到期更像是仅仅移动一下 IP 地址。

# 在通常情况下不建议使用这种方式。

#dhcp-sequential-ip



##############################################################################

# 多数情况下我们使用 PXE,只是简单的允许 PXE 客户端获取 IP 地址,

# 然后 PXE 客户端下载 dhcp-boot 选项指定的文件并执行,也就是 BOOTP 的方式。

# 然而在有适当配置的 DHCP 服务器支持的情况下,PXE 系统能够实现更复杂的功能。

# pxe-service 选项可指定 PXE 环境的启动菜单。

# 为不同的类型系统设定不同的启动菜单,并且覆盖 dhcp-boot 选项。

#  为客户端系统类型:x86PC, PC98, IA64_EFI, Alpha, Arc_x86, Intel_Lean_Client, 

# IA32_EFI, X86-64_EFI, Xscale_EFI, BC_EFI, ARM32_EFI 和 ARM64_EFI,其他类型可能为一个整数。

#  引导 PXE 客户端使用 tftp 从  或者  下载文件。

#     注意:"layer" 后缀 (通常是 ".0") 由 PXE 提供,也就是 PXE 客户端默认在文件名附加 .0 后缀。

#     示例:pxe-service=x86PC, "Install Linux", pxelinux         (读取 pxelinux.0 文件并执行)

#           pxe-service=x86PC, "Install Linux", pxelinux, 1.2.3.4(不适用于老的PXE)

#      整数,PXE 客户端将通过广播或者通过  

#           或者  搜索对应类型的适合的启动服务。。

#     示例:pxe-service=x86PC, "Install windows from RIS server", 1

#           pxe-service=x86PC, "Install windows from RIS server", 1, 1.2.3.4

#     未指定 、 或者  为 “0”,将从本地启动。

#     示例:pxe-service=x86PC, "Boot from local disk"

#           pxe-service=x86PC, "Boot from local disk", 0

# 如果指定  将按照 /etc/hosts 中对应的 IP 地址进行轮询负载均衡。  

#pxe-service=[tag:,],[,|][,|]

# 在 PXE 启动后弹出提示, 为提示内容, 为超时时间,为 0 则立即执行。

# 如果未指定此选项,在有多个启动选项的情况下等待用户选择,不会超时。

#pxe-prompt=[tag:,][,]

# 根据不同的类型使用不同的菜单,使用示例:

#        #pxe-prompt="What system shall I netboot?", 120

#        # or with timeout before first available action is taken:

#        pxe-prompt="Press F8 or Enter key for menu.", 60

#        pxe-service=x86PC, "Now in x86PC (BIOS mode), boot from local", 0

#        pxe-service=x86PC, "Now in x86PC (BIOS mode)", pxelinux

#        pxe-service=PC98, "Now in PC98 mode", PC98

#        pxe-service=IA64_EFI, "Now in IA64_EFI mode", IA64_EFI

#        pxe-service=Alpha, "Now in Alpha mode", Alpha

#        pxe-service=Arc_x86, "Now in Arc_x86 mode", Arc_x86

#        pxe-service=Intel_Lean_Client, "Now in Intel_Lean_Client mode", Intel_Lean_Client

#        pxe-service=IA32_EFI, "Now in IA32_EFI mode", IA32_EFI

#        pxe-service=X86-64_EFI, "Now in X86-64_EFI (UEFI mode), boot from local", 0

#        pxe-service=X86-64_EFI, "Now in X86-64_EFI (UEFI mode)", grub/grub-x86_64.efi

#        pxe-service=Xscale_EFI, "Now in Xscale_EFI mode", Xscale_EFI

#        pxe-service=BC_EFI, "Now in BC_EFI mode", BC_EFI

#        # CentOS7 系统不支持下列两个选项

#        #pxe-service=ARM32_EFI,"Now in ARM32_EFI mode",ARM32_EFI

#        #pxe-service=ARM64_EFI,"Now in ARM64_EFI mode",ARM64_EFI



##############################################################################

# 默认为150,即最多分配150个ip地址出去,最大1000个ip

#dhcp-lease-max=150

# (IPv4 only) 指定DHCP端口,默认为67和68。如果不指定则为1067和1068,单指定一个,第二个加1

#dhcp-alternate-port[=[,


声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:qvyue@qq.com 进行举报,并提供相关证据,工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。