我有一个本地 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
- 少于一个点,因此自动符合mylan
;myfileserver.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 指向新文件