为何systemd-resolved未使用本地BIND9 DNS服务器?
解决Ubuntu 17.04下systemd-resolved不使用本地BIND9查询本地域名的问题
我之前碰到过一模一样的情况,核心问题其实很明确:systemd-resolved不会默认把所有查询都转发到你的BIND9服务器——它是按域名后缀(也就是你的本地域)来匹配对应的DNS服务器的。哪怕你把BIND9设成了默认DNS,没有配置本地域的路由规则,resolved还是会用默认逻辑处理查询,自然找不到本地域名的结果。
下面是一步步的排查和解决方法:
1. 给本地域配置专属DNS路由
首先得让systemd-resolved知道:你的本地域名(比如home.lan这类自定义域)必须交给BIND9处理。
- 先运行
resolvectl status,找到你正在使用的网卡(比如eth0或wlan0),查看下面的Domains字段。如果这里没列出你的本地域,那resolved根本不知道该把这类查询交给BIND9。
临时生效配置(重启后失效)
执行这条命令,把你的本地域绑定到网卡:
sudo resolvectl domain eth0 your-local-domain
替换eth0为你的实际网卡名,your-local-domain为BIND9托管的本地域名(比如home.lan)。
永久生效配置
编辑/etc/systemd/resolved.conf,找到Domains行,取消注释并添加你的本地域:
[Resolve] #DNS= #FallbackDNS= Domains=your-local-domain #LLMNR=no #MulticastDNS=no #DNSSEC=no #Cache=yes #DNSStubListener=yes
保存后重启systemd-resolved服务:
sudo systemctl restart systemd-resolved
2. 确保/etc/resolv.conf指向正确的stub resolver
Ubuntu 17.04里,systemd-resolved是通过127.0.0.53这个stub resolver处理本地查询的,如果你的/etc/resolv.conf没指向它,dig默认就不会用resolved的配置。
- 先检查当前链接:
ls -l /etc/resolv.conf
- 如果输出不是
lrwxrwxrwx 1 root root 39 ... /etc/resolv.conf -> /run/systemd/resolve/stub-resolv.conf,就重新创建软链接:
sudo rm /etc/resolv.conf sudo ln -s /run/systemd/resolve/stub-resolv.conf /etc/resolv.conf
3. 验证配置是否生效
现在直接用dig查询你的本地域名,不用指定BIND9服务器:
dig your-local-host.your-local-domain
如果返回正确的结果,说明配置成功。要是还是失败,就得检查BIND9本身的配置了:
- 确认BIND9允许来自
127.0.0.1和本地局域网的查询(看named.conf.options里的allow-query设置); - 检查本地域的zone文件,确保包含了你要查询的主机记录。
内容的提问来源于stack exchange,提问作者Civing
相关产品推荐
相关产品推荐

