You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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(如果有则注释掉),并显式添加:
    round-robin
    
    这个选项会让dnsmasq对同一域名的多个IP地址按顺序轮询返回。
  • 禁用严格顺序模式:
    如果配置中有strict-order,请注释掉它:
    # strict-order
    
    开启这个选项后,dnsmasq会严格按照/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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 15:29:32