使用resolvectl为WireGuard隧道添加DNS无报错但失败,遇到lan0 LinkBusy问题
我之前折腾WireGuard split DNS的时候也碰到过几乎一模一样的问题,咱们来一步步拆解解决:
首先,这个org.freedesktop.resolve1.LinkBusy错误其实是systemd-resolved在告诉你:你的主网卡lan0处于**managed(被管理)**状态,它的DNS配置被系统网络管理工具(比如netplan或者NetworkManager)接管了,而你直接用resolvectl给wg0设置DNS时,resolved认为这和lan0的管理状态冲突了,所以悄悄失败了。
下面是几个亲测有效的解决方法,你可以根据自己的情况选:
方法一:用resolvectl完整配置split DNS(推荐)
别只单独设置DNS服务器,把域名规则和优先级一起加上,这样resolved就知道哪些域名该走wg0的DNS,不会和lan0冲突:
PostUp = resolvectl dns %i 10.160.20.15; resolvectl domain %i your-target-domain.com; resolvectl dns-priority %i -50; resolvectl default-route %i no
resolvectl domain %i your-target-domain.com:指定只有your-target-domain.com及其子域名的查询走wg0的DNS(实现split DNS核心)resolvectl dns-priority %i -50:给wg0的DNS设置更高优先级(数值越小优先级越高),确保指定域名的查询优先用wg0的DNSresolvectl default-route %i no:防止wg0接管全局默认DNS,避免影响正常上网
方法二:通过netplan直接配置WireGuard的DNS
如果你的系统用netplan管理网络(看你提到lan0是netplan重命名的,大概率是),直接在WireGuard的netplan配置里写DNS规则,让netplan自动帮你同步到resolved,避免手动调用resolvectl的冲突:
编辑你的netplan配置文件(一般在/etc/netplan/目录下,比如00-wireguard.yaml):
network: version: 2 ethernets: lan0: # lan0的原有配置... tunnels: wg0: addresses: [你的wg0内网IP/32] nameservers: addresses: [10.160.20.15] domains: [your-target-domain.com] # 要走split DNS的域名 routes: - to: 你的WireGuard内网段/24 via: WireGuard网关IP # WireGuard的其他配置(比如PrivateKey、Peer等)...
写完后执行sudo netplan apply生效,这样netplan会自动帮你配置resolved,不会出现LinkBusy的问题。
方法三:临时调整lan0的管理状态(不推荐,仅应急)
如果你只是临时测试,不想改配置,可以先把lan0设置为unmanaged,再给wg0设置DNS:
# 先让resolved停止管理lan0 resolvectl revert lan0 # 再给wg0设置DNS resolvectl dns wg0 10.160.20.15 # 测试完记得恢复lan0的管理状态,否则可能影响上网 resolvectl manage lan0
这个方法不建议长期用,因为重启后lan0会自动变回managed状态,而且可能导致临时DNS失效。
最后再提醒一句:如果你的系统同时装了NetworkManager和systemd-resolved,一定要确认是哪个在管理网络,别两个一起用,不然很容易出DNS冲突。
备注:内容来源于stack exchange,提问作者ericx

