WireGuard配置咨询:实现VPN子网客户端共用自定义DNS及避免覆盖本地DNS的方法
嘿,我来帮你搞定这两个WireGuard相关的DNS问题,分两部分详细说:
一、服务器端统一管理自定义域名,让客户端自动获取最新解析
要实现只在服务器端修改域名解析,所有客户端自动同步,最靠谱的方式是在WireGuard服务器上搭建一个轻量的本地DNS服务,比如dnsmasq,步骤如下:
安装dnsmasq
根据你的服务器系统执行对应命令:# Debian/Ubuntu系 sudo apt update && sudo apt install dnsmasq # RHEL/CentOS系 sudo yum install dnsmasq配置自定义域名解析
推荐单独创建一个配置文件来管理WireGuard相关的域名,避免污染主配置:sudo touch /etc/dnsmasq.d/wireguard-domains.conf编辑这个文件,添加你的自定义域名解析规则,格式为
address=/自定义域名/目标IP,比如:# 示例:把my-vpn-service.com解析到10.1.0.10 address=/my-vpn-service.com/10.1.0.10 # 可以添加多条规则 address=/internal-files.net/10.1.0.15限制dnsmasq监听范围
为了安全,让dnsmasq只监听WireGuard接口和本地回环,编辑/etc/dnsmasq.conf,添加或修改以下配置:interface=wg0 # 这里改成你的WireGuard接口名 interface=lo bind-interfaces然后重启dnsmasq服务:
sudo systemctl restart dnsmasq客户端配置验证
确保客户端.conf里的DNS = 10.1.0.1保留着,这样客户端连接VPN后就会自动使用服务器上的dnsmasq服务,你后续在服务器端修改域名解析规则后,客户端刷新DNS缓存就能拿到最新结果,完全不用改客户端配置。
二、避免WireGuard覆盖本地DNS,改为添加模式
wg-quick默认会替换/etc/resolv.conf,导致本地DNS丢失,这里给你两种可靠的解决方法:
方法1:用systemd-resolved管理(推荐,适合用systemd的系统)
如果你的系统用systemd-resolved(现在大部分Linux发行版都默认用),可以在客户端.conf里添加PostUp和PostDown脚本,让WireGuard把自定义DNS添加到全局解析列表,同时保留本地原有DNS:
[Interface] Address = 10.1.0.4/32 PrivateKey = XXXX # 注释掉原来的DNS行,改用下面的脚本 # DNS = 10.1.0.1 PostUp = resolvectl dns %i 10.1.0.1; resolvectl domain %i ~. PostDown = resolvectl revert %i
resolvectl dns %i 10.1.0.1:给WireGuard接口添加指定DNSresolvectl domain %i ~.:让这个DNS处理所有域名解析(也可以指定特定域名,比如~my-vpn-domain.com,只解析你的自定义域名)PostDown会在断开VPN后恢复原来的DNS配置
方法2:手动修改resolv.conf(适合不用systemd-resolved的场景)
如果你的/etc/resolv.conf是普通文件(不是软链接到systemd-resolved),可以用脚本手动添加/删除DNS:
[Interface] Address = 10.1.0.4/32 PrivateKey = XXXX # 注释掉原来的DNS行 # DNS = 10.1.0.1 PostUp = echo "nameserver 10.1.0.1" >> /etc/resolv.conf PostDown = sed -i '/nameserver 10.1.0.1/d' /etc/resolv.conf
注意:如果resolv.conf是NetworkManager生成的软链接,这种方法可能无效,建议优先用方法1。
方法3:用NetworkManager管理WireGuard(图形化/桌面场景)
如果你是用NetworkManager来管理WireGuard连接,直接在连接设置里修改:
- 打开NetworkManager的WireGuard连接配置
- 切换到IPv4设置选项卡
- 把“DNS”设置为“自动(仅地址)”,然后在“DNS服务器”列表里手动添加
10.1.0.1,保留原来的本地DNS服务器 - 保存后,NetworkManager会自动把所有DNS服务器合并,不会覆盖本地配置
备注:内容来源于stack exchange,提问作者無名前




