在分配租约之前在 dnsmasq 中初始化 DNS

在分配租约之前在 dnsmasq 中初始化 DNS

我正在将 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

相关内容