# ubuntu24.04本地域服务器dns解析解决方案

\# 问题根源与完整修复步骤  
\## 核心原因1：`Domains=~local:192.168.0.5` 语法存在兼容性缺陷  
Ubuntu24.04 的 systemd-resolved 对 `~域名:DNS` 这种绑定写法识别不稳定，`.local` 仍会被 mDNS 逻辑拦截，推荐用\*\*drop-in分片配置\*\*强制覆盖本地域转发规则，不直接改主文件。  
\## 核心原因2：netplan 与 resolved 配置存在优先级冲突，cloud-init 可能覆盖网卡DNS  
\## 步骤1：创建 resolved 专用drop-in配置（最有效修复）  
```bash  
\# 创建配置目录  
mkdir -p /etc/systemd/resolved.conf.d/  
\# 写入强制转发local域配置  
tee /etc/systemd/resolved.conf.d/99-fix-local-dns.conf &lt;&lt;EOF  
\[Resolve\]  
DNS=192.168.0.5  
\# 所有.local 强制走单播DNS，彻底禁用mDNS  
MulticastDNS=no  
LLMNR=no  
\# 强制将local域路由到内网DNS  
Domains=local  
DNSOverTLS=no  
DNSSEC=no  
EOF  
```  
\## 步骤2：修正主配置 `/etc/systemd/resolved.conf`  
把 `Domains=~local:192.168.0.5` 删除，只保留基础配置：  
```ini  
\[Resolve\]  
DNS=192.168.0.5  
MulticastDNS=no  
LLMNR=no  
\#Domains=~local:192.168.0.5 # 注释/删除这一行  
\#FallbackDNS=  
\#DNSSEC=no  
\#DNSOverTLS=no  
\#Cache=no-negative  
\#DNSStubListener=yes  
```  
\## 步骤3：重启并重载解析服务  
```bash  
\# 重载systemd配置  
systemctl daemon-reload  
\# 重启解析服务  
systemctl restart systemd-resolved  
\# 清空全部缓存  
resolvectl flush-caches  
\# 查看完整生效配置，确认drop-in加载成功  
systemd-analyze cat-config systemd/resolved.conf  
```  
\## 步骤4：验证网卡DNS域规则  
```bash  
resolvectl status eth0  
```  
输出必须看到两行关键内容：  
1\. `DNS Servers: 192.168.0.5`  
2\. `Domains: local`

\## 步骤5：测试解析  
```bash  
nslookup shuncom.local  
```  
正常会直接返回 `192.168.0.4 / 0.5 / 0.8`，不再报SERVFAIL。

\---

\# 若依旧报错：兜底方案（彻底绕开systemd-resolved拦截）  
\## 方案A：修改netplan，强制为local域指定独立DNS  
编辑 `/etc/netplan/50-cloud-init.yaml`，给eth0增加`domains`绑定：  
```yaml  
eth0:  
 addresses:  
\- 192.168.4.16/24  
 nameservers:  
 addresses:  
\- 192.168.0.5  
 search: \[shuncom.local\]  
 # 强制local后缀全部转发到192.168.0.5  
 domains:  
\- local:192.168.0.5  
 routes:  
\- to: default  
 via: 192.168.4.1  
```  
生效配置：  
```bash  
netplan apply  
systemctl restart systemd-resolved  
resolvectl flush-caches  
```

\## 方案B：永久禁用systemd-resolved stub监听（完全绕过127.0.0.53）  
1\. 修改 `/etc/systemd/resolved.conf`  
```ini  
DNSStubListener=no  
```  
2\. 重建 `/etc/resolv.conf` 软链接，直接指向内网DNS  
```bash  
rm -f /etc/resolv.conf  
echo "nameserver 192.168.0.5" &gt; /etc/resolv.conf  
```  
3\. 重启服务  
```bash  
systemctl daemon-reload  
systemctl restart systemd-resolved  
```  
此时 `nslookup` 不再走本地127.0.0.53，直接查询192.168.0.5，彻底解决.local拦截问题。

\---

\# 补充关键说明  
1\. `.local` 是mDNS标准保留域，只要启用systemd-resolved，默认优先组播解析，\*\*仅关闭MulticastDNS并强制Domains转发才能覆盖\*\*；  
2\. `~local:dnsip` 这种格式是高级路由语法，部分systemd版本存在bug，改用drop-in分片配置兼容性更强；  
3\. 长期建议：内网DNS后缀更换为 `.lan` / `.corp`，从根源规避mDNS冲突。