dnsmasq轮询模式下ping/WireGuard客户端始终解析同一IP的配置调整问询
dnsmasq轮询模式下ping/WireGuard客户端始终解析同一IP的配置调整问询
问题场景
我在Ubuntu 24.04上运行dnsmasq,希望实现DNS客户端每次查询同一域名时返回不同IP,以此负载均衡两个WireGuard服务器的流量。
当前配置:
- 在dnsmasq服务器的
/etc/hosts中添加了两行同一域名对应不同IP:192.168.77.72 wgserver.example.com wgserver 192.168.77.71 wgserver.example.com wgserver - 已将客户端的DNS服务器指向这台运行dnsmasq的机器
现象:
- 使用
dig查询时能得到轮询的IP顺序,符合预期:vagrant@worker:~$ dig wgserver.example.com +short 192.168.77.71 192.168.77.72 vagrant@worker:~$ dig wgserver.example.com +short 192.168.77.72 192.168.77.71 - 但使用
ping或执行wg-quick up wg0时,始终解析到同一个IP,无法实现轮询负载均衡。
解决方案
出现这个问题的核心原因通常是dnsmasq的轮询配置未正确生效,或者客户端DNS缓存导致重复使用同一个IP。可以按以下步骤调整:
1. 调整dnsmasq核心配置
编辑dnsmasq的主配置文件/etc/dnsmasq.conf,检查并设置以下选项:
- 确保轮询功能开启:
确认配置中没有no-round-robin(如果有则注释掉),并显式添加:
这个选项会让dnsmasq对同一域名的多个IP地址按顺序轮询返回。round-robin - 禁用严格顺序模式:
如果配置中有strict-order,请注释掉它:
开启这个选项后,dnsmasq会严格按照# strict-order/etc/hosts中的IP顺序返回,不会进行轮询。 - 降低本地TTL值:
添加或修改local-ttl选项,设置较小的TTL(比如60秒),让客户端更快刷新DNS缓存,避免长时间复用同一个IP:local-ttl=60
修改完成后重启dnsmasq服务:
sudo systemctl restart dnsmasq
2. 清理客户端DNS缓存
客户端的DNS解析器(比如systemd-resolved)可能已经缓存了之前的IP记录,导致后续请求仍使用旧IP。可以在客户端执行以下命令清理缓存:
- 如果使用systemd-resolved:
sudo systemd-resolve --flush-caches - 如果使用nscd:
sudo systemctl restart nscd
3. 确认客户端解析方式
确保客户端没有直接从本地/etc/hosts读取该域名的IP(如果客户端hosts里有相关记录会优先使用),并且客户端的DNS服务器确实指向了你的dnsmasq机器。可以通过以下命令验证客户端的DNS配置:
cat /etc/resolv.conf
确认输出中nameserver指向的是dnsmasq服务器的IP。
验证调整效果
完成上述配置后,在客户端多次执行ping wgserver.example.com,查看每次解析的IP是否变化;或者使用getent hosts wgserver.example.com多次查询,确认返回的IP顺序是否轮询。
备注:内容来源于stack exchange,提问作者arkantos
相关产品推荐
相关产品推荐

