关于dnsmasq的一次query却forwarded了两次这件事

开了dnsmasq的日志之后,发现一次query下面却跟了两个forwarded

1
2
3
4
Jul  6 13:03:12 dnsmasq[14543]: 1 192.168.x.xxx/60201 query[A] clientservices.googleapis.com from 192.168.x.xxx
Jul 6 13:03:12 dnsmasq[14543]: 1 192.168.x.xxx/60201 forwarded clientservices.googleapis.com to 223.5.5.5
Jul 6 13:03:12 dnsmasq[14543]: 1 192.168.x.xxx/60201 forwarded clientservices.googleapis.com to 223.5.5.5
Jul 6 13:03:12 dnsmasq[14543]: 1 192.168.x.xxx/60201 reply clientservices.googleapis.com is 120.253.255.98

我第一反应跟我用两条宽带有关,于是把其中一条宽带的DNS改成114.114.114以区分,果然,两次forwarded,一次223.5.5.5一次114.114.114

1
2
3
4
Jul  6 13:29:45 dnsmasq[780]: 1 192.168.x.xxx/58192 query[A] www.google.com from 192.168.x.xxx
Jul 6 13:29:45 dnsmasq[780]: 1 192.168.x.xxx/58192 forwarded www.google.com to 223.5.5.5
Jul 6 13:29:45 dnsmasq[780]: 1 192.168.x.xxx/58192 forwarded www.google.com to 114.114.114.114
Jul 6 13:29:45 dnsmasq[780]: 1 192.168.2.135/58192 reply www.google.com is 142.251.43.4

不知道为什么dnsmasq要每一条宽带都请求一次,可能是在负载均衡的规则中进了balanced。

于是去负载均衡里面加上了两条DNS的规则,让tcp/udp协议的目标端口为53的流量都优先走其中一条宽带,发现并不管用。

去看看dnsmasq的解析文件/tmp/resolv.conf.d/resolv.conf.auto

1
2
3
4
# Interface wan
nameserver 223.5.5.5
# Interface wan1
nameserver 114.114.114.114

突然明白了,我之前勾选了“使用 all-servers 并发查询”,这样每个网络接口里面自定义的DNS服务器都会查一次,但只用最快得到的结果。我取消了并发查询之后,一次query只有一个forwarded。

其实问题出在resolv.conf,两个网络接口用相同的nameserver,resolv.conf会加上两条相同的nameserver,而不是相同的nameserver会自动去重。