dnsmasq轮询解析异常:客户端ping/WireGuard连接始终获取同一IP的配置求助
兄弟,我之前做WireGuard负载均衡的时候也碰到过一模一样的问题!dig能拿到轮询的IP,但ping或者WireGuard启动就死咬同一个IP不放,其实问题出在两个地方:dnsmasq的默认会话粘性,还有客户端的DNS缓存。咱们一步步来改:
首先调整dnsmasq的配置:
dnsmasq默认有个「粘性地址」的功能——同一个客户端反复查同一个域名时,它会返回同一个IP,目的是帮你保持会话一致性,但这刚好和咱们要的轮询负载均衡反着来。咱们得把这个功能关掉:
- 打开dnsmasq的主配置文件,一般是
/etc/dnsmasq.conf - 找有没有
sticky-address这个选项,如果有就改成sticky-address=no;如果没有,直接加一行:
sticky-address=no
- 重启dnsmasq服务生效:
sudo systemctl restart dnsmasq
这一步改完,dnsmasq就不会对同一个客户端的请求“偏心”了,每次都会轮着返回不同的IP顺序。
接下来处理客户端的DNS缓存问题:
你用dig能拿到不同结果,是因为dig是直接给dnsmasq发查询,绕开了客户端系统的本地DNS缓存;但ping、wg-quick这些工具用的是系统自带的解析库,会把第一次查到的IP缓存起来,根本不会再去问dnsmasq。所以咱们得把客户端的本地DNS缓存关掉:
如果你用的是systemd-resolved(现在大部分Ubuntu/Debian系默认用这个)
- 打开
/etc/systemd/resolved.conf,把Cache那一行改成:
Cache=no
- 重启服务生效:
sudo systemctl restart systemd-resolved
- 先清空现有缓存:
sudo systemd-resolve --flush-caches
如果你用的是nscd(老一点的系统可能用这个)
直接停掉并禁用这个缓存服务就行:
sudo systemctl stop nscd sudo systemctl disable nscd
最后,针对WireGuard的特殊情况:
wg-quick在启动wg0的时候,只会解析一次域名,之后就把IP写到配置里了。如果想每次启动都拿到新的IP,除了上面的缓存设置,还可以在wg0.conf里加个启动钩子来动态解析:
在wg0.conf里加一行:
PreUp = ENDPOINT=$(dig +short wgserver.example.com | shuf -n1); sed -i "s/Endpoint = .*/Endpoint = $ENDPOINT:51820/" /etc/wireguard/wg0.conf
这样每次启动wg-quick之前,都会先随机选一个IP替换到配置里,保证每次用的都是不同的服务器。
现在你再测试一下:先清空客户端缓存,然后多ping几次,或者反复启停WireGuard,应该就能每次拿到不同的IP了!
备注:内容来源于stack exchange,提问作者arkantos

