当前位置:   article > 正文

WiFi AP之dnsmasq详解

dnsmasq

1、dnsmasq的简介

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

2、Dnsmasq的主要作用

(1)将Dnsmasq作为本地DNS服务器使用,直接修改电脑的本地DNS的IP地址即可。

(2)应对ISP的DNS劫持(反DNS劫持),输入一个不存在的域名,正常的情况下浏览器是显示无法连接,DNS劫持会跳转到一个广告页面。先随便nslookup 一个不存在的域名,看看ISP商劫持的IP地址。

(3)智能DNS加快解析速度,打开/etc/dnsmasq.conf文件,server=后面可以添加指定的DNS,例如国内外不同的网站使用不同的DNS。

国内指定DNS

  1. server=/cn/114.114.114.114
  2. server=/taobao.com/114.114.114.114
  3. server=/taobaocdn.com/114.114.114.114

国外指定DNS

server=/google.com/8.8.8.8

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

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

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

address=/freehao123.com/123.123.123.123

(6)管理控制内网DNS,首先将局域网中的所有的设备的本地DNS设置为已经安装Dnsmasq的服务器IP地址。然后修改已经安装Dnsmasq的服务器Hosts文件:/etc/hosts,指定域名到特定的IP中。

例如想让局域网中的所有用户访问www.freehao123.com时跳转到192.168.0.2,添加:

192.168.0.2 www.freehao123.com

在Hosts文件中既可,整个过程也可以说是“DNS劫持”。

3、dnsmasq的解析流程

dnsmasq先去解析hosts文件, 再去解析/etc/dnsmasq.d/下的*.conf文件,并且这些文件的优先级要高于dnsmasq.conf,我们自定义的resolv.dnsmasq.conf中的DNS也被称为上游DNS,这是最后去查询解析的;

如果不想用hosts文件做解析,我们可以在/etc/dnsmasq.conf中加入no-hosts这条语句,这样的话就直接查询上游DNS了,如果我们不想做上游查询,就是不想做正常的解析,我们可以加入no-reslov这条语句。

4、dnsmasq的参数及常用设置说明

编辑 dnsmasq 的配置文件 /etc/dnsmasq.conf 。这个文件包含大量的选项注释。

(1)dnsmasq经常修改的比较重要参数说明

  1. 具体参数
  2. 参数说明
  3. resolv-file
  4. 定义dnsmasq从哪里获取上游DNS服务器的地址, 默认从/etc/resolv.conf获取。
  5. strict-order
  6. 表示严格按照resolv-file文件中的顺序从上到下进行DNS解析,直到第一个解析成功为止。
  7. listen-address
  8. 定义dnsmasq监听的地址,默认是监控本机的所有网卡上。
  9. address
  10. 启用泛域名解析,即自定义解析a记录,例如:address=/long.com/192.168.115.10 访问long.com时的所有域名都会被解析成192.168.115.10
  11. bogus-nxdomain
  12. 对于任何被解析到此 IP 的域名,将响应 NXDOMAIN 使其解析失效,可以多次指定
  13. 通常用于对于访问不存在的域名,禁止其跳转到运营商的广告站点
  14. server
  15. 指定使用哪个DNS服务器进行解析,对于不同的网站可以使用不同的域名对应解析。
  16. 例如:server=/google.com/8.8.8.8 #表示对于google的服务,使用谷歌的DNS解析。

(2)查看配置文件语法是否正确,可执行下列命令

  1. [root@localhost ~]# dnsmasq -test
  2. dnsmasq: syntax check OK.

(3)DNS 缓存设置
要在单台电脑上以守护进程方式启动dnsmasq做DNS缓存服务器,编辑/etc/dnsmasq.conf,添加监听地址:

  1. listen-address=127.0.0.1
  2. 如果用此主机为局域网提供默认 DNS,请用为该主机绑定固定 IP 地址,设置:
  3. listen-address=192.168.x.x
  4. 这种情况建议配置静态IP
  5. 多个ip地址设置:
  6. listen-address=127.0.0.1,192.168.x.x

(4)三个以上域名服务器
Linux 处理 DNS 请求时有个限制,在 resolv.conf 中最多只能配置三个域名服务器(nameserver)。作为一种变通方法,可以在 resolv.conf 文件中只保留 localhost 作为域名服务器,然后为外部域名服务器另外创建 resolv-file 文件。首先,为 dnsmasq 新建一个域名解析文件:

  1. [root@localhost ~]# vim /etc/resolv.dnsmasq.conf
  2. # Google's nameservers, for example
  3. nameserver 8.8.8.8
  4. nameserver 8.8.4.4
  5. 然后编辑 /etc/dnsmasq.conf 让 dnsmasq 使用新创建的域名解析文件:
  6. [root@localhost ~]# vim /etc/dnsmasq.conf
  7. ...
  8. resolv-file=/etc/resolv.dnsmasq.conf

(5)使用dhcpcd
dhcpcd 可以是通过创建(或编辑)/etc/resolv.conf.head文件或 /etc/resolv.conf.tail文件来指定dns服务器,使/etc/resolv.conf不会被每次都被dhcpcd重写

echo "nameserver 127.0.0.1" > /etc/resolv.conf.head //设置dns服务器为127.0.0.1

(6)使用dhclient
要使用 dhclient, 取消 /etc/dhclient.conf 文件中如下行的注释:

prepend domain-name-servers 127.0.0.1;

(7)使用NetworkManager
NetworkManager 可以靠自身配置文件的设置项启动 dnsmasq 。在 NetworkManager.conf 文件的 [main] 节段添加 dns=dnsmasq 配置语句,然后禁用由 systemd 启动的 dnsmasq.service:

  1. [root@localhost ~]# vim /etc/NetworkManager/NetworkManager.conf
  2. [main]
  3. plugins=keyfile
  4. dns=dnsmasq
  5. 可以在 /etc/NetworkManager/dnsmasq.d/ 目录下为 dnsmasq 创建自定义配置文件。例如,调整 DNS 缓存大小(保存在内存中):
  6. [root@localhost ~]# vim /etc/NetworkManager/dnsmasq.d/cache
  7. cache-size=1000
  8. dnsmasq 被 NetworkManager 启动后,此目录下配置文件中的配置将取代默认配置。
  9. IPv6
  10. 启用 dnsmasq 在 NetworkManager 可能会中断仅持IPv6的DNS查询 (例如 dig -6 [hostname]) 否则将工作。 为了解决这个问题,创建以下文件将配置 dnsmasq 总是监听IPv6的loopback:
  11. [root@localhost ~]# vim /etc/NetworkManager/dnsmasq.d/ipv6_listen.conf
  12. listen-address=::1

此外, dnsmasq不优先考虑上游IPv6的DNS。不幸的是NetworkManager已不这样做 (Ubuntu Bug)。 一种解决方法是将禁用IPv4 DNS的NetworkManager的配置,假设存在。

其他方式

另一种选择是在NetworkManagers“设置(通常通过右键单击小程序)和手动输入设置。设置将取决于前端中使用的类型;这个过程通常涉及右击小程序,编辑(或创建)一个配置文件,然后选择DHCP类型为“自动(指定地址)。”DNS地址将需要输入,通常以这种形式:127.0.0.1, DNS-server-one, …

(8)DHCP 服务器设置
dnsmasq默认关闭DHCP功能,如果该主机需要为局域网中的其他设备提供IP和路由,应该对dnsmasq 配置文件(/etc/dnsmasq.conf)必要的配置如下:

  1. [root@localhost ~]# vim /etc/dnsmasq.conf
  2. # Only listen to routers' LAN NIC. Doing so opens up tcp/udp port 53 to
  3. # localhost and udp port 67 to world:
  4. interface=<LAN-NIC>
  5. # dnsmasq will open tcp/udp port 53 and udp port 67 to world to help with
  6. # dynamic interfaces (assigning dynamic ips). Dnsmasq will discard world
  7. # requests to them, but the paranoid might like to close them and let the
  8. # kernel handle them:
  9. bind-interfaces
  10. # Dynamic range of IPs to make available to LAN pc
  11. dhcp-range=192.168.111.50,192.168.111.100,12h
  12. # If you’d like to have dnsmasq assign static IPs, bind the LAN computer's
  13. # NIC MAC address:
  14. dhcp-host=aa:bb:cc:dd:ee:ff,192.168.111.50
  15. 查看租约
  16. [root@localhost ~]# cat /var/lib/misc/dnsmasq.leases

(9)添加自定义域
它可以将一个自定义域添加到主机中的(本地)网络:

local=/home.lan/
domain=home.lan
(10)启动守护进程
设置为开机启动:

[root@localhost ~]# systemctl enable dnsmasq
立即启动 dnsmashq:

[root@localhost ~]# systemctl start dnsnsmasq
需要重启网络服务以使 DHCP 客户端重建一个新的 /etc/resolv.conf

查看dnsmasq是否启动正常,查看系统日志:

[root@localhost ~]# journalctl -u d

5、dnsmasq 的配置文件 /etc/dnsmasq.conf详解

  1. # 不加载本地的 /etc/hosts 文件
  2. #no-hosts
  3. # 添加读取额外的 hosts 文件路径,可以多次指定。如果指定为目录,则读取目录中的所有文件。
  4. #addn-hosts=/etc/dnsmasq.hosts.d
  5. # 读取目录中的所有文件,文件更新将自动读取
  6. #hostsdir=/etc/dnsmasq.hosts.d
  7. # 例如,/etc/hosts中的os01将扩展成os01.example.com
  8. #expand-hosts
  9. ##############################################################################
  10. # 缓存时间设置,一般不需要设置
  11. # 本地 hosts 文件的缓存时间,通常不要求缓存本地,这样更改hosts文件后就即时生效。
  12. #local-ttl=3600
  13. # 同 local-ttl 仅影响 DHCP 租约
  14. #dhcp-ttl=<time>
  15. # 对于上游返回的值没有ttl时,dnsmasq给一个默认的ttl,一般不需要设置,
  16. #neg-ttl=<time>
  17. # 指定返回给客户端的ttl时间,一般不需要设置
  18. #max-ttl=<time>
  19. # 设置在缓存中的条目的最大 TTL。
  20. #max-cache-ttl=<time>
  21. # 不需要设置,除非你知道你在做什么。
  22. #min-cache-ttl=<time>
  23. # 一般不需要设置
  24. #auth-ttl=<time>
  25. ##############################################################################
  26. # 记录dns查询日志,如果指定 log-queries=extra 那么在每行开始处都有额外的日志信息。
  27. #log-queries
  28. # 设置日志记录器,'-' 为 stderr,也可以是文件路径。默认为:DAEMON,调试时使用 LOCAL0
  29. #log-facility=<facility>
  30. #log-facility=/var/log/dnsmasq/dnsmasq.log
  31. # 异步log,缓解阻塞,提高性能。默认为5,最大100
  32. #log-async[=<lines>]
  33. #log-async=50
  34. ##############################################################################
  35. # 指定用户和组
  36. #user=nobody
  37. #group=nobody
  38. ##############################################################################
  39. # 指定DNS的端口,默认53,设置 port=0 将完全禁用 DNS 功能,仅使用 DHCP/TFTP
  40. #port=53
  41. # 指定 EDNS.0 UDP 包的最大尺寸,默认为 RFC5625 推荐的 edns-packet-max=4096
  42. #edns-packet-max=<size>
  43. # 指定向上游查询的 UDP 端口,默认是随机端口,指定后降低安全性、加快速度、减少资源消耗。
  44. # 设置为 '0' 由操作系统分配。
  45. #query-port=53535
  46. # 指定向上游查询的 UDP 端口范围,方便防火墙设置。
  47. #min-port=<port>
  48. #max-port=<port>
  49. # 指定接口,指定后同时附加 lo 接口,可以使用'*'通配符。
  50. # 不能使用接口别名(例如:"eth1:0"),请用 listen-address 选项替代。
  51. #interface=wlp2s0
  52. # 指定排除的接口,排除优先级高,可以使用'*'通配符
  53. #except-interface=
  54. # 仅接受同一子网的 DNS 请求。
  55. # 仅在未指定 interface、except-interface、listen-address 或者 auth-server 时有效。
  56. #local-service
  57. # 指定不提供 DHCP 或 TFTP 服务的接口,仅提供 DNS 服务。
  58. #no-dhcp-interface=enp3s0
  59. # 指定IP地址,可以多次指定。
  60. # interface 选项和 listen-address 选项可以同时使用。
  61. # 下面两行与指定 interface 选项的作用类似。
  62. listen-address=192.168.10.17
  63. #listen-address=127.0.0.1
  64. # 通常情况下即使设置了 interface 选项(例如:interface=wlp2s0
  65. # 将仍然绑定到通配符地址(例如:*:53 )。
  66. # 开启此项将仅监听指定的接口。
  67. # 适用于在同一主机的不同接口或 IP 地址上运行多个 dns 服务器。
  68. bind-interfaces
  69. # 对于新添加的接口不进行绑定。仅 Linux 系统支持,其他系统等同于 bind-interfaces 选项。
  70. #bind-dynamic
  71. ##############################################################################
  72. # 如果 hosts 中的主机有多个 IP 地址,仅返回对应子网的 IP 地址。
  73. localise-queries
  74. # 如果反向查找的是私有地址例如192.168.X.X,仅从 hosts 文件查找,不再转发到上游服务器
  75. #bogus-priv
  76. # 对于任何被解析到此 IP 的域名,将响应 NXDOMAIN 使其解析失效,可以多次指定
  77. # 通常用于对于访问不存在的域名,禁止其跳转到运营商的广告站点。
  78. #bogus-nxdomain=64.94.110.11
  79. # 忽略包含指定地址的 A 记录查询的回复。
  80. # 例如上游有台 dns 服务器伪造 www.baidu.com 的 IP 为 1.1.1.1 并且响应速度非常快。
  81. # 指定 ignore-address=1.1.1.1 可以忽略它的响应信息,
  82. # 从而等待 www.baidu.com 正确的查询结果。
  83. #ignore-address=<ipaddr>
  84. filterwin2k
  85. ##############################################################################
  86. # 指定 resolv-file 文件路径,默认/etc/resolv.conf
  87. #resolv-file=/etc/resolv.conf
  88. # 不读取 resolv-file 来确定上游服务器
  89. #no-resolv
  90. # 在编译时需要启用 DBus 支持。
  91. #enable-dbus[=<service-name>]
  92. # 严格按照resolv.conf中的顺序进行查找
  93. #strict-order
  94. # 向所有上游服务器发送查询,而不是一个。
  95. all-servers
  96. # 启用转发循环检测
  97. #dns-loop-detect
  98. ##############################################################################
  99. # 这项安全设置是拒绝解析包含私有 IP 地址的域名,
  100. # 这些IP地址包括如下私有地址范围:10.0.0.0/8172.16.0.0/12192.168.0.0/16
  101. # 其初衷是要防止类似上游DNS服务器故意将某些域名解析成特定私有内网IP而劫持用户这样的安全***
  102. # 直接在配置文件中注销 stop-dns-rebind 配置项从而禁用该功能。
  103. # 这个方法确实可以一劳永逸的解决解析内网 IP 地址的问题,
  104. # 但是我们也失去了这项安全保护的特性,所以在这里我不推荐这个办法。
  105. # 使用 rebind-domain-ok 进行特定配置,顾名思义该配置项可以有选择的忽略域名的 rebind 行为
  106. stop-dns-rebind
  107. rebind-localhost-ok
  108. #rebind-domain-ok=[<domain>]|[[/<domain>/[<domain>/]
  109. rebind-domain-ok=/.test.com/
  110. ##############################################################################
  111. # 也不要检测 /etc/resolv.conf 的变化
  112. #no-poll
  113. # 重启后清空缓存
  114. clear-on-reload
  115. # 完整的域名才向上游服务器查找,如果仅仅是主机名仅查找hosts文件
  116. domain-needed
  117. ##############################################################################
  118. # IP地址转换
  119. #alias=[<old-ip>]|[<start-ip>-<end-ip>],<new-ip>[,<mask>]
  120. ##############################################################################
  121. #local=[/[<domain>]/[domain/]][<ipaddr>[#<port>][@<source-ip>|<interface>[#<port>]]
  122. #server=[/[<domain>]/[domain/]][<ipaddr>[#<port>][@<source-ip>|<interface>[#<port>]]
  123. server=/test.com/192.168.10.117
  124. server=/10.168.192.in-addr.arpa/192.168.10.117
  125. #rev-server=<ip-address>/<prefix-len>,<ipaddr>[#<port>][@<source-ip>|<interface>[#<port>]]
  126. # 将任何属于 <domain> 域名解析成指定的 <ipaddr> 地址。
  127. # 也就是将 <domain> 及其所有子域名解析成指定的 <ipaddr> IPv4 或者 IPv6 地址,通常用于屏蔽特定的域名。
  128. # 一次只能指定一个 IPv4 或者 IPv6 地址,要同时返回 IPv4 和IPv6 地址,请多次指定 address= 选项。
  129. # 注意: /etc/hosts 以及 DHCP 租约将覆盖此项设置。
  130. #address=/<domain>/[domain/][<ipaddr>]
  131. #ipset=/<domain>/[domain/]<ipset>[,<ipset>]
  132. #mx-host=<mx name>[[,<hostname>],<preference>]
  133. #mx-target=<hostname>
  134. # SRV 记录
  135. #srv-host=<_service>.<_prot>.[<domain>],[<target>[,<port>[,<priority>[,<weight>]]]]
  136. # A, AAAA 和 PTR 记录
  137. #host-record=<name>[,<name>....],[<IPv4-address>],[<IPv6-address>][,<TTL>]
  138. # TXT 记录
  139. #txt-record=<name>[[,<text>],<text>]
  140. # PTR 记录
  141. #ptr-record=<name>[,<target>]
  142. #naptr-record=<name>,<order>,<preference>,<flags>,<service>,<regexp>[,<replacement>]
  143. # CNAME 别名记录
  144. #cname=<cname>,<target>[,<TTL>]
  145. #dns-rr=<name>,<RR-number>,[<hex data>]
  146. #interface-name=<name>,<interface>[/4|/6]
  147. #synth-domain=<domain>,<address range>[,<prefix>]
  148. #add-mac[=base64|text]
  149. #add-cpe-id=<string>
  150. #add-subnet[[=[<IPv4 address>/]<IPv4 prefix length>][,[<IPv6 address>/]<IPv6 prefix length>]]
  151. ##############################################################################
  152. ##############################################################################
  153. # 缓存条数,默认为150条,cache-size=0 禁用缓存。
  154. cache-size=1000
  155. # 不缓存未知域名缓存,默认情况下dnsmasq缓存未知域名并直接返回为客户端。
  156. no-negcache
  157. # 指定DNS同属查询转发数量
  158. dns-forward-max=1000
  159. ##############################################################################
  160. #dnssec
  161. #trust-anchor=[<class>],<domain>,<key-tag>,<algorithm>,<digest-type>,<digest>
  162. #dnssec-check-unsigned
  163. #dnssec-no-timecheck
  164. #dnssec-timestamp=<path>
  165. #proxy-dnssec
  166. #dnssec-debug
  167. ##############################################################################
  168. #auth-server=<domain>,<interface>|<ip-address>
  169. #auth-zone=<domain>[,<subnet>[/<prefix length>][,<subnet>[/<prefix length>].....]]
  170. #auth-zone=<domain>[,<interface name>[/6|/4][,<interface name>[/6|/4].....]]
  171. #auth-soa=<serial>[,<hostmaster>[,<refresh>[,<retry>[,<expiry>]]]]
  172. #auth-sec-servers=<domain>[,<domain>[,<domain>...]]
  173. #auth-peer=<ip-address>[,<ip-address>[,<ip-address>...]]
  174. # 启用连接跟踪,读取 Linux 入栈 DNS 查询请求的连接跟踪标记,
  175. # 并且将上游返回的响应信息设置同样的标记。
  176. # 用于带宽控制和防火墙部署。
  177. # 此选项必须在编译时启用 conntrack 支持,并且内核正确配置并加载 conntrack。
  178. # 此选项不能与 query-port 同时使用。
  179. #conntrack
  180. ##############################################################################
  181. #
  182. # DHCP 选项
  183. #
  184. ##############################################################################
  185. # 设置 DHCP 地址池,同时启用 DHCP 功能。
  186. # IPv4 <mode> 可指定为 static|proxy ,当 <mode> 指定为 static 时,
  187. # 需用 dhcp-host 手动分配地址池中的 IP 地址。
  188. # 当 <mode> 指定为 proxy 时,为指定的地址池提供 DHCP 代理。
  189. #dhcp-range=[tag:<tag>[,tag:<tag>],][set:<tag>,]<start-addr>[,<end-addr>][,<mode>][,<netmask>[,<broadcast>]][,<lease time>]
  190. #dhcp-range=172.16.0.2,172.16.0.250,255.255.255.0,1h
  191. #dhcp-range=192.168.10.150,192.168.10.180,static,255.255.255.0,1h
  192. # 根据 MAC 地址或 id 固定分配客户端的 IP 地址、主机名、租期。
  193. # IPv4 下指定 id:* 将忽略 DHCP 客户端的 ID ,仅根据 MAC 来进行 IP 地址分配。
  194. # 在读取 /etc/hosts 的情况,也可以根据 /etc/hosts 中的主机名分配对应 IP 地址。
  195. # 指定 ignore 将忽略指定客户端得 DHCP 请求。
  196. #dhcp-host=[<hwaddr>][,id:<client_id>|*][,set:<tag>][,<ipaddr>][,<hostname>][,<lease_time>][,ignore]
  197. #dhcp-hostsfile=<path>
  198. #dhcp-hostsdir=<path>
  199. # 读取 /etc/ethers 文件 与使用 dhcp-host 的作用相同。IPv6 无效。
  200. #read-ethers
  201. # 指定给 DHCP 客户端的选项信息,
  202. # 默认情况下 dnsmasq 将发送:子网掩码、广播地址、DNS 服务器地址、网关地址、域等信息。
  203. # 指定此选项也可覆盖这些默认值并且设置其他选项值。
  204. # 重要:可以使用 option:<option-name>或者 option号 来指定。
  205. # <option-name> 和 option号的对应关系可使用命令:
  206. # dnsmasq --help dhcp 以及 dnsmasq --help dhcp6 查看,这点很重要。
  207. # 例如设置网关参数,既可以使用 dhcp-option=3,192.168.4.4 也可以使用 dhcp-option = option:router,192.168.4.4
  208. # 0.0.0.0 意味着当前运行 dnsmasq 的主机地址。
  209. # 如果指定了多个 tag:<tag> 必须同时匹配才行。
  210. # [encap:<opt>,][vi-encap:<enterprise>,][vendor:[<vendor-class>],] 有待继续研究。
  211. #dhcp-option=[tag:<tag>,[tag:<tag>,]][encap:<opt>,][vi-encap:<enterprise>,][vendor:[<vendor-class>],][<opt>|option:<opt-name>|option6:<opt>|option6:<opt-name>],[<value>[,<value>]]
  212. #dhcp-option-force=[tag:<tag>,[tag:<tag>,]][encap:<opt>,][vi-encap:<enterprise>,][vendor:[<vendor-class>],]<opt>,[<value>[,<value>]]
  213. #dhcp-optsfile=<path>
  214. #dhcp-optsdir=<path>
  215. #dhcp-option=3,1.2.3.4
  216. #dhcp-option=option:router,1.2.3.4
  217. #dhcp-option=option:router,192.168.10.254
  218. #dhcp-option=option:dns-server,192.168.10.254,221.12.1.227,221.12.33.227
  219. ##############################################################################
  220. # (IPv4 only) 禁用重用服务器名称和文件字段作为额外的 dhcp-option 选项。
  221. # 一般情况下 dnsmasq 从 dhcp-boot 移出启动服务器和文件信息到 dhcp-option 选项中。
  222. # 这使得在 dhcp-option 选项封包中有额外的选项空间可用,但是会使老的客户端混淆。
  223. # 此选项将强制使用简单并安全的方式来避免此类情况。可以认为是一个兼容性选项。
  224. #dhcp-no-override
  225. ##############################################################################
  226. # 配置 DHCP 中继。
  227. # <local address> 是运行 dnsmasq 的接口的 IP 地址。
  228. # 所有在 <local address> 接口上接收到的 DHCP 请求将中继到 <server address> 指定的远程 DHCP 服务器。
  229. # 可以多次配置此选项,使用同一个 <local address> 转发到多个不同的 <server address> 指定的远程 DHCP 服务器。
  230. # <server address> 仅允许使用 IP 地址,不能使用域名等其他格式。
  231. # 如果是 DHCPv6<server address> 可以是 ALL_SERVERS 的多播地址 ff05::1:3
  232. # 在这种情况下必须指定接口 <interface> ,不能使用通配符,用于直接多播到对应的 DHCP 服务器所在的接口。
  233. # <interface> 指定了仅允许接收从 <interface> 接口的 DHCP 服务器相应信息。
  234. #dhcp-relay=<local address>,<server address>[,<interface>]
  235. ##############################################################################
  236. # 设置标签
  237. #dhcp-vendorclass=set:<tag>,[enterprise:<IANA-enterprise number>,]<vendor-class>
  238. #dhcp-userclass=set:<tag>,<user-class>
  239. #dhcp-mac=set:<tag>,<MAC address>
  240. #dhcp-circuitid=set:<tag>,<circuit-id>
  241. #dhcp-remoteid=set:<tag>,<remote-id>
  242. #dhcp-subscrid=set:<tag>,<subscriber-id>
  243. #dhcp-match=set:<tag>,<option number>|option:<option name>|vi-encap:<enterprise>[,<value>]
  244. #tag-if=set:<tag>[,set:<tag>[,tag:<tag>[,tag:<tag>]]]
  245. #dhcp-proxy[=<ip addr>]......
  246. ##############################################################################
  247. # 不分配匹配这些 tag:<tag> 的 DHCP 请求。
  248. #dhcp-ignore=tag:<tag>[,tag:<tag>]
  249. #dhcp-ignore-names[=tag:<tag>[,tag:<tag>]]
  250. #dhcp-generate-names=tag:<tag>[,tag:<tag>]
  251. # IPv4 only 使用广播与匹配 tag:<tag> 的客户端通信。一般用于兼容老的 BOOT 客户端。
  252. #dhcp-broadcast[=tag:<tag>[,tag:<tag>]]
  253. ##############################################################################
  254. # IPv4 only 设置 DHCP 服务器返回的 BOOTP 选项,
  255. # <servername> <server address> 可选,
  256. # 如果未设置服务器名称将设为空,服务器地址设为 dnsmasq 的 IP 地址。
  257. # 如果指定了多个 tag:<tag> 必须同时匹配才行。
  258. # 如果指定 <tftp_servername> 将按照 /etc/hosts 中对应的 IP 地址进行轮询负载均衡。
  259. #dhcp-boot=[tag:<tag>,]<filename>,[<servername>[,<server address>|<tftp_servername>]]
  260. # 根据不同的类型使用不同的选项。
  261. # 使用示例:
  262. # dhcp-match=set:EFI_x86-64,option:client-arch,9
  263. # dhcp-boot=tag:EFI_x86-64,uefi/grubx64.efi
  264. # #dhcp-match=set:EFI_Xscale,option:client-arch,8
  265. # #dhcp-boot=tag:EFI_Xscale,uefi/grubx64.efi
  266. # #dhcp-match=set:EFI_BC,option:client-arch,7
  267. # #dhcp-boot=tag:EFI_BC,uefi/grubx64.efi
  268. # #dhcp-match=set:EFI_IA32,option:client-arch,6
  269. # #dhcp-boot=tag:EFI_IA32,uefi/grubx64.efi
  270. # #dhcp-match=set:Intel_Lean_Client,option:client-arch,5
  271. # #dhcp-boot=tag:Intel_Lean_Client,uefi/grubx64.efi
  272. # #dhcp-match=set:Arc_x86,option:client-arch,4
  273. # #dhcp-boot=tag:Arc_x86,uefi/grubx64.efi
  274. # #dhcp-match=set:DEC_Alpha,option:client-arch,3
  275. # #dhcp-boot=tag:DEC_Alpha,uefi/grubx64.efi
  276. # #dhcp-match=set:EFI_Itanium,option:client-arch,2
  277. # #dhcp-boot=tag:EFI_Itanium,uefi/grubx64.efi
  278. # #dhcp-match=set:NEC/PC98,option:client-arch,1
  279. # #dhcp-boot=tag:NEC/PC98,uefi/grubx64.efi
  280. # dhcp-match=set:Intel_x86PC,option:client-arch,0
  281. # dhcp-boot=tag:Intel_x86PC,pxelinux.0
  282. ##############################################################################
  283. # DHCP 使用客户端的 MAC 地址的哈希值为客户端分配 IP 地址,
  284. # 通常情况下即使客户端使自己的租约到期,客户端的 IP 地址仍将长期保持稳定。
  285. # 在默认模式下,IP 地址是随机分配的。
  286. # 启用 dhcp-sequential-ip 选项将按顺序分配 IP 地址。
  287. # 在顺序分配模式下,客户端使租约到期更像是仅仅移动一下 IP 地址。
  288. # 在通常情况下不建议使用这种方式。
  289. #dhcp-sequential-ip
  290. ##############################################################################
  291. # 多数情况下我们使用 PXE,只是简单的允许 PXE 客户端获取 IP 地址,
  292. # 然后 PXE 客户端下载 dhcp-boot 选项指定的文件并执行,也就是 BOOTP 的方式。
  293. # 然而在有适当配置的 DHCP 服务器支持的情况下,PXE 系统能够实现更复杂的功能。
  294. # pxe-service 选项可指定 PXE 环境的启动菜单。
  295. # 为不同的类型系统设定不同的启动菜单,并且覆盖 dhcp-boot 选项。
  296. # <CSA> 为客户端系统类型:x86PC, PC98, IA64_EFI, Alpha, Arc_x86, Intel_Lean_Client,
  297. # IA32_EFI, X86-64_EFI, Xscale_EFI, BC_EFI, ARM32_EFI 和 ARM64_EFI,其他类型可能为一个整数。
  298. # <basename> 引导 PXE 客户端使用 tftp 从 <server address> 或者 <server_name> 下载文件。
  299. # 注意:"layer" 后缀 (通常是 ".0") 由 PXE 提供,也就是 PXE 客户端默认在文件名附加 .0 后缀。
  300. # 示例:pxe-service=x86PC, "Install Linux", pxelinux (读取 pxelinux.0 文件并执行)
  301. # pxe-service=x86PC, "Install Linux", pxelinux, 1.2.3.4(不适用于老的PXE)
  302. # <bootservicetype> 整数,PXE 客户端将通过广播或者通过 <server address>
  303. # 或者 <server_name> 搜索对应类型的适合的启动服务。。
  304. # 示例:pxe-service=x86PC, "Install windows from RIS server", 1
  305. # pxe-service=x86PC, "Install windows from RIS server", 1, 1.2.3.4
  306. # 未指定 <basename><bootservicetype> 或者 <bootservicetype> 为 “0”,将从本地启动。
  307. # 示例:pxe-service=x86PC, "Boot from local disk"
  308. # pxe-service=x86PC, "Boot from local disk", 0
  309. # 如果指定 <server_name> 将按照 /etc/hosts 中对应的 IP 地址进行轮询负载均衡。
  310. #pxe-service=[tag:<tag>,]<CSA>,<menu text>[,<basename>|<bootservicetype>][,<server address>|<server_name>]
  311. # 在 PXE 启动后弹出提示,<prompt> 为提示内容,<timeout> 为超时时间,为 0 则立即执行。
  312. # 如果未指定此选项,在有多个启动选项的情况下等待用户选择,不会超时。
  313. #pxe-prompt=[tag:<tag>,]<prompt>[,<timeout>]
  314. # 根据不同的类型使用不同的菜单,使用示例:
  315. # #pxe-prompt="What system shall I netboot?", 120
  316. # # or with timeout before first available action is taken:
  317. # pxe-prompt="Press F8 or Enter key for menu.", 60
  318. # pxe-service=x86PC, "Now in x86PC (BIOS mode), boot from local", 0
  319. # pxe-service=x86PC, "Now in x86PC (BIOS mode)", pxelinux
  320. # pxe-service=PC98, "Now in PC98 mode", PC98
  321. # pxe-service=IA64_EFI, "Now in IA64_EFI mode", IA64_EFI
  322. # pxe-service=Alpha, "Now in Alpha mode", Alpha
  323. # pxe-service=Arc_x86, "Now in Arc_x86 mode", Arc_x86
  324. # pxe-service=Intel_Lean_Client, "Now in Intel_Lean_Client mode", Intel_Lean_Client
  325. # pxe-service=IA32_EFI, "Now in IA32_EFI mode", IA32_EFI
  326. # pxe-service=X86-64_EFI, "Now in X86-64_EFI (UEFI mode), boot from local", 0
  327. # pxe-service=X86-64_EFI, "Now in X86-64_EFI (UEFI mode)", grub/grub-x86_64.efi
  328. # pxe-service=Xscale_EFI, "Now in Xscale_EFI mode", Xscale_EFI
  329. # pxe-service=BC_EFI, "Now in BC_EFI mode", BC_EFI
  330. # # CentOS7 系统不支持下列两个选项
  331. # #pxe-service=ARM32_EFI,"Now in ARM32_EFI mode",ARM32_EFI
  332. # #pxe-service=ARM64_EFI,"Now in ARM64_EFI mode",ARM64_EFI
  333. ##############################################################################
  334. # 默认为150,即最多分配150个ip地址出去,最大1000个ip
  335. #dhcp-lease-max=150
  336. # (IPv4 only) 指定DHCP端口,默认为6768。如果不指定则为10671068,单指定一个,第二个加1
  337. #dhcp-alternate-port[=<server port>[,<client port>]]
  338. # 谨慎使用此选项,避免 IP 地址浪费。(IPv4 only) 允许动态分配 IP 地址给 BOOTP 客户端。
  339. # 注意:BOOTP 客户端获取的 IP 地址是永久的,将无法再次分配给其他客户端。
  340. #bootp-dynamic[=<network-id>[,<network-id>]]
  341. # 谨慎使用此选项。
  342. # 默认情况下 DHCP 服务器使用 ping 的方式进行确保 IP 未被使用的情况下将 IP 地址分配出去。
  343. # 启用此选项将不使用 ping 进行确认。
  344. #no-ping
  345. ##############################################################################
  346. # 记录额外的 dhcp 日志,记录所有发送给 DHCP 客户端的选项(option)以及标签(tag)信息
  347. #log-dhcp
  348. # 禁止记录日常操作日志,错误日志仍然记录。启用 log-dhcp 将覆盖下列选项。
  349. #quiet-dhcp
  350. #quiet-dhcp6
  351. #quiet-ra
  352. # 修改 DHCP 默认租约文件路径,默认情况下无需修改
  353. #dhcp-leasefile=/var/lib/dnsmasq/dnsmasq.leases
  354. # (IPv6 only)
  355. #dhcp-duid=<enterprise-id>,<uid>
  356. ##############################################################################
  357. #dhcp-script=<path>
  358. #dhcp-luascript=<path>
  359. #dhcp-scriptuser=root
  360. #script-arp
  361. #leasefile-ro
  362. #bridge-interface=<interface>,<alias>[,<alias>]
  363. ##############################################################################
  364. # 给 DHCP 服务器指定 domain 域名信息,也可以给对应的 IP 地址池指定域名。
  365. # 直接指定域名
  366. # 示例:domain=thekelleys.org.uk
  367. # 子网对应的域名
  368. # 示例:domain=wireless.thekelleys.org.uk,192.168.2.0/24
  369. # ip范围对应的域名
  370. # 示例:domain=reserved.thekelleys.org.uk,192.68.3.100,192.168.3.200
  371. #domain=<domain>[,<address range>[,local]]
  372. # 在默认情况下 dnsmasq 插入普通的客户端主机名到 DNS 中。
  373. # 在这种情况下主机名必须唯一,即使两个客户端具有不同的域名后缀。
  374. # 如果第二个客户端使用了相同的主机名,DNS 查询将自动更新为第二个客户端的 IP 地址。
  375. # 如果设置了 dhcp-fqdn 选项,普通的主机名将不再插入到 DNS 中去,
  376. # 仅允许合格的具有域名后缀的主机名插入到 DNS 服务器中。
  377. # 指定此选项需同时指定不含 <address range> 地址范围的 domain 选项。
  378. #dhcp-fqdn
  379. # 通常情况下分配 DHCP 租约后,dnsmasq 设置 FQDN 选项告诉客户端不要尝试 DDNS 更新主机名与 IP 地址。
  380. # 这是因为 name-IP 已自动添加到 dnsmasq 的 DNS 视图中的。
  381. # 设置此选项将允许客户端 DDNS 更新,
  382. # 在 windows 下允许客户端更新 windows AD 服务器是非常有用的。
  383. # 参看 RFC 4702
  384. #dhcp-client-update
  385. #enable-ra
  386. #ra-param=<interface>,[high|low],[[<ra-interval>],<router lifetime>]
  387. ##############################################################################
  388. #
  389. # TFTP 选项
  390. #
  391. ##############################################################################
  392. # 对于绝大多数的配置,仅需指定 enable-tftp 和 tftp-root 选项即可。
  393. # 是否启用内置的 tftp 服务器,可以指定多个逗号分隔的网络接口
  394. #enable-tftp[=<interface>[,<interface>]]
  395. #enable-tftp
  396. #enable-tftp=enp3s0,lo
  397. # 指定 tftp 的根目录,也就是寻找传输文件时使用的相对路径,可以附加接口,
  398. #tftp-root=<directory>[,<interface>]
  399. #tftp-root=/var/lib/tftpboot/
  400. # 如果取消注释,那么即使指定的 tftp-root 无法访问,仍然启动 tftp 服务。
  401. #tftp-no-fail
  402. # 附加客户端的 IP 地址作为文件路径。此选项仅在正确设置了 tftp-root 的情况下可用,
  403. # 示例:如果 tftp-root=/tftp,客户端为 192.168.1.15 请求 myfile.txt 文件时,
  404. # 将优先请求 /tftp/192.168.1.15/myfile.txt 文件, 其次是 /tftp/myfile.txt 文件。
  405. # 感觉没什么用。
  406. #tftp-unique-root
  407. # 启用安全模式,启用此选项,仅允许 tftp 进程访问属主为自己的文件。
  408. # 不启用此选项,允许访问所有 tftp 进程属主可读取的文件。
  409. # 如果 dnsmasq 是以 root 用户运行,tftp-secure 选项将允许访问全局可读的文件。
  410. # 一般情况下不推荐以 root 用户运行 dnsmasq。
  411. # 在指定了 tftp-root 的情况下并不是很重要。
  412. #tftp-secure
  413. # 将所有文件请求转换为小写。对于 Windows 客户端来说非常有用,建议开启此项。
  414. # 注意:dnsmasq 的 TFTP 服务器总是将文件路径中的“\”转换为“/”。
  415. #tftp-lowercase
  416. # 允许最大的连接数,默认为 50
  417. # 如果将连接数设置的很大,需注意每个进程的最大文件描述符限制,详见文档手册。
  418. #tftp-max=<connections>
  419. #tftp-max=50
  420. # 设置传输时的 MTU 值,建议不设置或按需设置。
  421. # 如果设定的值大于网络接口的 MTU 值,将按照网络接口的 MTU 值自动分片传输(不推荐)。
  422. #tftp-mtu=<mtu size>
  423. # 停止 tftp 服务器与客户端协商 "blocksize" 选项。启用后,防止一些古怪的客户端出问题。
  424. #tftp-no-blocksize
  425. # 指定 tftp 的连接端口的范围,方便防火墙部署。
  426. # tftp 侦听在 69/udp ,连接端口默认是由系统自动分配的,
  427. # 非 root 用户运行时指定的连接端口号需大于 1025 最大 65535
  428. #tftp-port-range=<start>,<end>
  429. ###############################################################################
  430. #conf-dir=<directory>[,<file-extension>......]
  431. #conf-file=/etc/dnsmasq.more.conf
  432. conf-dir=/etc/dnsmasq.d
  433. #servers-file=<file>

6、利用Dnsmasq搭建自有的无广告DNS服务器

(1)使用Dnsmasq搭建自有DNS的作用
每天我们的工作和娱乐休闲都离不开电脑,经常看到电脑右下角弹出图片广告!大部分这个都是被劫持DNS商家推送过来的,看起来很讨厌。虽然很多门户网站,比如360、百度、阿里都有推出他们DNS服务,我们将本地的DNS IP地址更换成他们的,在一定程度上,可以解决我们访问网速、广告拦截的问题。但是他们会推送自己的广告业务。所以我们自己可以架设本地DNS服务器,这样用自己的DNS就不会有广告的问题。

Dnsmasq也不是仅仅这个用途,我们也可以作为局域网机器批量IP维护使用,以及局域网解决特定网址域名禁止访问。

(2)dnsmasq的安装

[root@localhost ~]# yum install -y dnsmasq

这里使用的是CentOS 7.x环境,如果需要编译安装可以直接到官方网站(http://www.thekelleys.org.uk/dnsmasq/)选择版本编译。

安装完毕后,可以通过dnsmasq -v命令查看版本,有版本号出来就代表安装上了。

(3)修改Dnsmasq配置文件dnsmasq.conf
修改配置文件前一定要先备份

[root@localhost ~]# echo 'resolv-file=/etc/dnsmasq.d/resolv.dnsmasq.conf'>> /etc/dnsmasq.conf

表示dnsmasq 会从这个指定的文件中寻找上游dns服务器。

 [root@localhost ~]# echo 'addn-hosts=/etc/dnsmasq.d/dnsmasq.hosts' >> /etc/dnsmasq.conf

添加读取额外的 hosts 文件路径,可以多次指定

  1. [root@localhost ~]# vim /etc/dnsmasq.conf
  2. strict-order 取消这一行的注释,表示严格按照resolv.conf中的顺序进行查找。
  3. listen-address=127.0.0.1 添加监听地址这个 dnsmasq 本机自己使用有效。
  4. listen-address=192.168.115.120 用此主机为局域网提供默认 DNS,写本机的局域网IP
  5. listen-address=127.0.0.1,192.168.115.120 多个ip地址设置。
  6. 如果想允许所有的用户使用你的DNS解析服务器,把listen-address去掉即可。

(4)修改/etc/resolv.conf文件,并创建resolv.dnsmasq.conf和dnsmasq.hosts文件

  1. [root@localhost ~]# echo 'nameserver 127.0.0.1' > /etc/resolv.conf
  2. [root@localhost ~]# cp /etc/resolv.conf /etc/dnsmasq.d/resolv.dnsmasq.conf
  3. [root@localhost ~]# echo 'nameserver 8.8.8.8' >>/etc/dnsmasq.d/resolv.dnsmasq.conf
  4. [root@localhost ~]# echo 'nameserver 192.168.115.120' >>/etc/dnsmasq.d/resolv.dnsmasq.conf
  5. [root@localhost ~]# cp /etc/hosts /etc/dnsmasq.d/dnsmasq.hosts
  6. resolv.dnsmasq.conf中设置的是真正的Nameserver,可以填写各大商家提供的免费DNS地址。

(5)启动Dnsmasq

  1. [root@localhost ~]# systemctl restart dnsmasq 重启dnsmasq服务
  2. [root@localhost ~]# systemctl enable dnsmasq 设置成开机自启动
  3. [root@localhost ~]# netstat -antp|grep 53 查看端口是否启动成功

(6)测试是否配置成功。

  1. [root@localhost ~]# dig www.taobao.com
  2. .........................................................省略若干
  3. ;; Query time: 77 mse 第一次查询没有缓存,时间77
  4. ;; SERVER: 127.0.0.1#53(127.0.0.1)
  5. ;; WHEN: 二 116 13:09:32 CST 2018
  6. ;; MSG SIZE rcvd: 120
  7. [root@localhost ~]# dig www.taobao.com
  8. .........................................................省略若干
  9. ;; Query time: 0 msec 第二次再次查询,时间为0
  10. ;; SERVER: 127.0.0.1#53(127.0.0.1)
  11. ;; WHEN: 二 116 13:11:39 CST 2018
  12. ;; MSG SIZE rcvd: 123

7、Dnsmasq的使用及实现的功能

(1)作为本地DNS使用
将Dnsmasq作为本地DNS服务器使用,直接修改电脑的本地DNS的IP地址即可

(2)应对ISP的DNS劫持。
输入一个不存在的域名,正常的情况下浏览器是显示无法连接,DNS劫持会跳转到一个广告页面。先随便nslookup 一个不存在的域名,看看ISP商劫持的IP地址。

接着编辑/etc/dnsmasq.conf文件,把bogus-nxdomain=‘劫持IP’ 加入进去,后面的IP是刚刚查询到的DNS劫持IP地址。

重启dnsmasq,再尝试打开不存在的域名,这时浏览器就会显示正常的无法连接页面了。

(3)智能DNS加快解析速度。
打开/etc/dnsmasq.conf文件,server=添加指定的DNS,例如国内外不同的网站使用不同的DNS。

  1. [root@localhost ~]# vim /etc/dnsmasq.conf
  2. 国内指定DNS
  3. server=/cn/114.114.114.114
  4. server=/taobao.com/114.114.114.114
  5. server=/taobaocdn.com/114.114.114.114
  6. 国外指定DNS
  7. server=/google.com/223.5.5.5

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

  1. [root@localhost ~]# vim /etc/dnsmasq.conf
  2. address=/ad.youku.com/127.0.0.1
  3. address=/ad.iqiyi.com/127.0.0.1

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

  1. [root@localhost ~]# vim /etc/dnsmasq.conf
  2. address=/freehao123.com/123.123.123.123

(6)管理控制内网DNS
首先将局域网中的所有的设备的本地DNS设置为已经安装Dnsmasq的服务器IP地址。然后修改已经安装Dnsmasq的服务器Hosts文件:/etc/hosts,指定域名到特定的IP中。

例如:想让局域网中的所有用户访问www.abc.com时跳转到192.168.115.100,添加'192.168.115.100 www.abc.com'到Hosts文件中既可,整个过程也可以说是“DNS劫持”。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/49009
推荐阅读
相关标签
  

闽ICP备14008679号