配置DNSmasq对不同子网提供不同域名扩展(expand-hosts)

我最初在构建 边缘云计算架构 (完全架构在 边缘计算树莓派 ),没有独立建立DNS,而是共用了 私有云架构私有云DNS服务(dnsmasq)和共享因特网(ICS) 的DNSmasq提供的DNS解析。这个部署 部署DNSmasq 方法非常简便,通过 /etc/hosts 结合 DNSmasq 的 expand-hosts 功能(也就是自动添加 staging.huatai.me 域名后缀),为整个虚拟化集群提供DNS解析。

不过,随着我拆分集群,将 Raspberry Pi Atlas 设备构建成独立的 边缘云计算构建 ,采用2个网段:

这就带来一个问题:

虽然使用短域名,例如 x-k3s-m-1 直接 ping 或者 ssh 都能解析出 192.168.7.11 ,但是主机的 FQDN 名字却被错误扩展成了 x-k3s-m-1.staging.huatai.me 而不是我期望的独立域名 egde.huatai.me

仔细阅读 /etc/dnsmasq.conf 配置文件中的注释,就可以看到:

  • 所谓域名扩展 expand-hosts 是从 /etc/hosts 读取主机名到IP的解析,然后默认添加的域名后缀

  • DNSmasq支持根据不同子网(particular subnet)来提供不同的 expand-hosts 域名

所以,针对我的需求,可以如下配置DNSmasq:

# 本地默认域名
local=/staging.huatai.me/
# 转发上游域名解析服务器,请求DNS解析
server=8.8.8.8
# 监听DNS请求的网卡接口(br0上使用了IP Alias,但是ifconfig只看到一个br0,所以这里配置一个接口)
interface=br0,eno4
# 监听DNS请求的IP地址(注意eno4接口是DHCP动态获取IP,所以使用上面的interface配置)
listen-address=192.168.6.200,192.168.7.200,192.168.8.200,127.0.0.1
# 扩展主机域名,也就是请求 zcloud 默认扩展成 zcloud.staging.huatai.me
expand-hosts
# 服务器提供解析的域名,可以为多个网段提供不同的域名解析
domain=staging.huatai.me,192.168.6.0/24
domain=edge.cloud-atlas.io,192.168.7.0/24
domain=staging.cloud-atlas.io,192.168.8.0/24
# DNS解析缓存
cache-size=1000
# DHCP
dhcp-range=192.168.6.21,192.168.6.50,255.255.255.0,12h
dhcp-option=option:router,192.168.6.200
dhcp-option=option:dns-server,192.168.6.200
dhcp-authoritative

这样,DNSmasq读取 /etc/hosts 配置,例如:

192.168.6.253  z-dev
...
192.168.7.11  x-k3s-m-1
...
192.168.8.116  y-k8s-m-1
...

就会根据IP网段,分别扩展解析成:

192.168.6.253  z-dev.staging.huatai.me
192.168.7.11  x-k3s-m-1.edge.huatai.me
192.168.8.116  y-k8s-m-1.staging.cloud-atlas.io
  • 验证(nslookup查询反向解析和正向解析):

    # nslookup 192.168.6.253
    Server:         192.168.7.200
    Address:        192.168.7.200:53
    
    253.6.168.192.in-addr.arpa      name = z-dev.staging.huatai.me
    
    # nslookup 192.168.7.11
    Server:         192.168.7.200
    Address:        192.168.7.200:53
    
    11.7.168.192.in-addr.arpa       name = x-k3s-m-1.edge.huatai.me
    
    # nslookup 192.168.8.116
    116.8.168.192.in-addr.arpaname = y-k8s-m-1.
    
    # nslookup z-dev.staging.huatai.me
    Server:         192.168.7.200
    Address:        192.168.7.200:53
    
    Name:   z-dev.staging.huatai.me
    Address: 192.168.6.25
    
    # nslookup x-k3s-m-1.edge.huatai.me
    Server:         192.168.7.200
    Address:        192.168.7.200:53
    
    Name:   x-k3s-m-1.edge.huatai.me
    Address: 192.168.7.11
    
    # nslookup y-k8s-m-1.staging.cloud-atlas.io
    Server:              127.0.0.53
    Address:     127.0.0.53#53
    
    Non-authoritative answer:
    Name:        y-k8s-m-1.staging.cloud-atlas.io
    Address: 192.168.8.116
    

参考