![在分配租约之前在 dnsmasq 中初始化 DNS](https://linux22.com/image/1575040/%E5%9C%A8%E5%88%86%E9%85%8D%E7%A7%9F%E7%BA%A6%E4%B9%8B%E5%89%8D%E5%9C%A8%20dnsmasq%20%E4%B8%AD%E5%88%9D%E5%A7%8B%E5%8C%96%20DNS.png)
我正在将 LAN 的 DHCP/DNS 服务从运行 wheezy 的系统转移到运行 stretch 的系统。DHCP 和 DNS 均由 dnsmasq 提供。
我看到的情况是,至少在我在新机器上配置 dnsmasq 的方式下,它提供的 DNS 服务只知道从它那里获得 DHCP 租约的设备。我曾假设它能够解析我在 dnsmasq.conf 中为其分配了固定 IP 地址的设备,甚至在它们请求新的 DHCP 租约之前。但显然事实并非如此……或者我配置错误了。
例如,尽管 dnsmasq.conf 中有此条目:
dhcp-host=1C:6F:65:39:09:8D,colossus,10.0.0.8
对 colossus 或 colossus.localnet(这是我为我的 LAN 指定的名称)执行 nslookup 失败。
有没有办法配置 dnsmasq,以便它在分配租约之前解析具有固定 IP 地址的设备?
或者,由于 stretch 使用 resolvconf 和 dhcpcd 并覆盖 /etc/resolv.conf 和 /run/dnsmasq/resolv.conf,我应该把固定 IP 地址放在哪里,以便在分配租约之前就能解析它们?我考虑过把它们放在 resolv.conf.tail 中,但这似乎不太好。
答案1
我在 debian wheezy 和 jessie 上测试了这一点,原帖作者确认它在 stretch 上也能正常工作。Stretch 和 jessie 确实使用 resolvconf,而 wheezy 则不使用。
只需将所有固定 IP 地址放入/etc/hosts
运行 dnsmasq 的主机本地的文件中即可。您可在此处添加本地网络上具有固定地址的主机(本例中为域local.net
、IP 192.168.0.xxx
)或因某种原因想要在本地覆盖的主机:
# /etc/hosts
# the local host
127.0.0.1 localhost
# provide fixed addresses used by dnsmasq for the local network
192.168.0.100 host0.local.net host0
192.168.0.101 host1.local.net host1
192.168.0.102 host2.local.net host2
# map a fancy service to the same address as above (e.g. on host2)
192.168.0.102 imap.local.net imap
192.168.0.102 mediaserver.local.net mediaserver
# overwrite an external host with address 1.2.3.4
1.2.3.4 some.external-host.com
# map unwanted external hosts to localhost
127.0.0.1 some.malicious-advertising-server.com
Dnsmasq 优先读取主机文件而不是调用外部解析器。因此,该文件中的所有 IP 都应该在这些主机请求租约(甚至运行)之前可用。确保在您的 中注释掉以下内容/etc/dnsmasq.conf
:
# /etc/dnsmasq.conf
...
# If you don't want dnsmasq to read /etc/hosts, uncomment the
# following line.
#no-hosts
...
如果您的域名local.net
不是公开可用的域名,请将其放入以下子句中,以防止 dnsmaq 查询不存在域名的上游解析器:
# /etc/dnsmasq.conf
...
# Add local-only domains here, queries in these domains are answered
# from /etc/hosts or DHCP only.
local=/local.net/
...
您可能想要查看/etc/hosts
有关 中的文件的更多选项/etc/dnsmasq.conf
。周围的评论非常有用。
现在您要将物理主机映射到这些 IP 地址。如果不存在,请创建文件/etc/ethers
。在此文件中,您将放置应获得固定 IP 地址的所有主机的 MAC 地址,后跟其相应的 dns 名称:
# /etc/ethers
1C:6F:65:39:09:8D host0.local.net
1C:6F:65:39:19:8D host1.local.net
1C:6F:65:39:29:8D host2.local.net
您只需要您的物理主机,而不是您在上面的文件中定义的其他服务名称/etc/hosts
。返回并检查是否已启用/etc/dnsmasq.conf
读取:/etc/ethers
# /etc/dnsmasq.conf
...
# If this line is uncommented, dnsmasq will read /etc/ethers and act
# on the ethernet-address/IP pairs found there just as if they had
# been given as --dhcp-host options. Useful if you keep
# MAC-address/host mappings there for other purposes.
read-ethers
同样,还有更多选项/etc/ethers
。如果您需要更多功能,您可能需要浏览它们。
第三步,您必须说服 resolveconf 使用本地 dnsmasq 作为第一个解析器。否则,在运行 dnsmasq 的主机上,动态租约(而不是上面配置的固定租约)的解析将无法正常工作。我的如下所示/etc/resolvconf.conf
:
# /etc/resolvconf.conf
# Configuration for resolvconf(8)
# See resolvconf.conf(5) for details
resolv_conf=/etc/resolv.conf
# If you run a local name server, you should uncomment the below line and
# configure your subscribers configuration files below.
name_servers=127.0.0.1
# Mirror the Debian package defaults for the below resolvers
# so that resolvconf integrates seemlessly.
dnsmasq_resolv=/var/run/dnsmasq/resolv.conf
pdnsd_conf=/etc/pdnsd.conf
unbound_conf=/var/cache/unbound/resolvconf_resolvers.conf
这里的关键是:
# /etc/resolvconf.conf
...
name_servers=127.0.0.1
...
它告诉解析器使用本地主机作为第一个解析器。这里的问题是 dnsmasq 也使用 resolvconf 来解析未知地址。但不用担心,dnsmasq 足够聪明,可以避免在递归循环中调用自身。
最后(可能很明显)一件事:如果您也定义了动态 IP 范围,例如为客人,移动设备等,请确保它不会与给出的地址冲突/etc/hosts
:
# /etc/dnsmasq.conf
...
# Uncomment this to enable the integrated DHCP server, you need
# to supply the range of addresses available for lease and optionally
# a lease time. If you have more than one network, you will need to
# repeat this for each network on which you want to supply DHCP
# service.
dhcp-range=192.168.0.50,192.168.0.99,12h
# this range must not include above addresses given in /etc/hosts
...
现在 dnsmaq 从文件中获取 IP 地址/etc/hosts
,而不管现有租约如何。DHCP 请求使用 将 MAC 地址解析/etc/ethers
为域名,然后使用 将 MAC 地址解析为 IP /etc/hosts
。
因此,您可以在单独的文件中整齐地配置主机和以太,而不需要将每个主机放入...'选项/etc/dnsmaq.conf
中。dhcp-host