dnsmasq 无法解析本地主机名

dnsmasq 无法解析本地主机名

我有一个本地 Linux 服务器,为我的 LAN 运行 dnsmasq。在过去的几年里,它一直正常运行,没有出现任何问题。我定期更新操作系统和软件包。经过昨天的例行更新后,当 LAN 上的计算机尝试解析大多数本地主机名时,我现在会收到错误消息。我怀疑我的工作配置可能在某种程度上存在缺陷,而更新暴露了我的缺陷;更新后我没有找到有关此问题的报告,因此我认为我在某个地方出现了错误。

这是我在大多数客户端上遇到的错误:

# ping myfileserver
ping: myfileserver: Name or service not known

但是,如果我 ping myfileserver 的地址,则会成功:

# ping 192.168.1.2
PING 192.168.1.2 (192.168.1.2) 56(84) bytes of data.
64 bytes from 192.168.1.2: icmp_seq=1 ttl=64 time=0.325 ms
64 bytes from 192.168.1.2: icmp_seq=2 ttl=64 time=0.239 ms

这是客户端上的 resolv.conf:

# cat /etc/resolv.conf
# Generated by NetworkManager
search mylan
nameserver 192.168.1.1

192.168.1.1是我的dnsmasq服务器的地址。

我可能忽略了一些明显的事情,但钻取显示客户端正在从 dnsmasq 服务器获取包含正确主机名和本地 IP 地址的响应。

# drill myfileserver
;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 40614
;; flags: qr aa rd ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 
;; QUESTION SECTION:
;; myfileserver.     IN      A

;; ANSWER SECTION:
myfileserver.        0       IN      A       192.168.1.2

;; AUTHORITY SECTION:

;; ADDITIONAL SECTION:

;; Query time: 0 msec
;; SERVER: 192.168.1.1
;; WHEN: Wed Oct 24 00:12:18 2018
;; MSG SIZE  rcvd: 41

在服务器上,systemd 显示 dnsmasq 进程正在正常启动并运行:

systemctl status dnsmasq.service 
dnsmasq.service - A lightweight DHCP and caching DNS server
Loaded: loaded (/usr/lib/systemd/system/dnsmasq.service; enabled; vendor preset: disabled)
Active: active (running) since Wed 2018-10-24 00:08:13 EDT
    Docs: man:dnsmasq(8)
Process: 28230 ExecStartPre=/usr/bin/dnsmasq --test (code=exited, status=0/SUCCESS)
Main PID: 28231 (dnsmasq)
    Tasks: 1 (limit: 4915)
Memory: 1.4M
CGroup: /system.slice/dnsmasq.service
        └─28231 /usr/bin/dnsmasq -k --enable-dbus --user=dnsmasq --pid-file

这是服务器上启动的 dnsmasq 的日志输出。没有错误。

Oct 23 01:50:48 mydnsmasqd systemd[1]: Starting A lightweight DHCP and caching DNS server...
Oct 23 01:50:48 mydnsmasqd dnsmasq[768]: dnsmasq: syntax check OK.
Oct 23 01:50:48 mydnsmasqd systemd[1]: Started A lightweight DHCP and caching DNS server.
Oct 23 01:50:48 mydnsmasqd dnsmasq[772]: started, version 2.80 cachesize 5000
Oct 23 01:50:48 mydnsmasqd dnsmasq[772]: compile time options: IPv6 GNU-getopt DBus i18n IDN2 DHCP DHCPv6 no-Lua TFTP conntrack ipset auth DNSSEC loop-detect inotify du>
Oct 23 01:50:48 mydnsmasqd dnsmasq[772]: DBus support enabled: connected to system bus
Oct 23 01:50:48 mydnsmasqd dnsmasq-dhcp[772]: DHCP, IP range 192.168.10.100 -- 192.168.10.200, lease time 1d
Oct 23 01:50:48 mydnsmasqd dnsmasq[772]: using local addresses only for domain mylan
Oct 23 01:50:48 mydnsmasqd dnsmasq[772]: reading /etc/resolv-custom.conf
Oct 23 01:50:48 mydnsmasqd dnsmasq[772]: using local addresses only for domain mylan
Oct 23 01:50:48 mydnsmasqd dnsmasq[772]: using nameserver 8.8.8.8#53
Oct 23 01:50:48 mydnsmasqd dnsmasq[772]: using nameserver 8.8.4.4#53
Oct 23 01:50:48 mydnsmasqd dnsmasq[772]: read /etc/hosts - 72 addresses

在故障排除过程中,我更改了 dnsmasq 配置,然后重新启动它。日志再次显示启动时没有错误,并且我的各种配置更改对此问题没有影响。此问题出现时,dnsmasq 配置未更改。这是一个相对简单的普通配置,但在故障排除过程中我将其简化为几乎没有。这是我现在所拥有的(省略了接口绑定部分,这显然不相关):

# grep -v '^#' /etc/dnsmasq.conf
resolv-file=/etc/resolv-custom.conf
dhcp-range=set:eth0,192.168.10.100, 192.168.10.200, 24h
cache-size=5000
no-negcache
conf-dir=/etc/dnsmasq.d,.bak

# cat /etc/resolv-custom.conf
search mylan
domain mylan
nameserver 8.8.8.8
nameserver 8.8.4.4

所有机器都运行 Arch Linux,4.18.10-arch1-1-ARCH Dnsmasq 版本 2.80

答案1

默认值ndots在您提出此问题时发生了变化。

新值为1,这意味着除非查询名称至少包含一个点,否则它将search依次添加列表中的每个值作为后缀,直到找到匹配项。

我相信旧的方法是“按原样”执行名称查询,并且只有在失败时才search一一尝试列表中列出的后缀。

老情况

  • myfileserver- 传递到dnsmasq找到匹配项的位置
  • noname- 传递给dnsmasq,不匹配,因此noname.mylan将传递给dnsmasq进行查找;也可能无法匹配,因此NXDOMAIN会被返回

新形势

  • myfileserver- 少于一个点,因此自动符合mylanmyfileserver.mylan传递给dnsmasq,这将无法匹配(因为它预计只被要求myfileserver

这些解决方案中的任何一个都可以工作:

  • 设置ndots=0/etc/resolv.conf恢复到以前的行为(可能不推荐)

  • 修改你的/etc/hosts后缀mylan

      192.168.1.2  myfileserver.mylan  myfileserver
    

答案2

您的主机文件中充满了 72 个主机,这可能是您的主机文件中的格式问题,DNSMasq 将跳过该问题,请参阅以下答案堆栈溢出

将 123.123.123.12 container.test 放入新文件中,例如 /etc/dnsmasq.hosts

通过将 addn-hosts=/etc/dnsmasq.hosts 添加到 /etc/dnsmasq.conf 将 dnsmasq 指向新文件

相关内容