[DNSMasq] 解决 No DNS Rebind 误杀内网域名A记录

前两天给自己的域名下添加了两条 A 记录,指向了内网的两个IP地址(192.168..)。当时是通过 VPN 连到了这个 192.168.. 的网段,两条记录在添加后直接就生效了。奇怪的是晚上回到家后,发现无法通过这两个域名访问内网的页面,Chrome 里的错误信息提示 “ERR_NAME_NOT_RESOLVED”,当时试着用路由器里配置的三个 DNS 解析了下自己的域名,发现都可以正常解析,但是在浏览器里却始终没法访问,重启了路由器无果,当时没什么思路,猜想可能是某些缓存机制影响,就先扔在了一边。

今天继续排查这个问题,之前在查看 DNSMasq 的配置时,发现默认开启了 “No DNS Rebind” 的选项,简单地查了一下,DNS Rebinding 的维基百科介绍中提到了

This attack can be used to breach a private network by causing the victim’s web browser to access machines at private IP addresses and returning the results to the attacker. It can also be used to use the victim machine for spamming, distributed denial-of-service attacks and other malicious activities.

这一段话提到了 DNS Rebind 可能和内网有关,于是打开路由器的 DD-WRT 管理界面,找到 Status 下的 Syslog 查看系统日志,看能否发现有关的线索,果然看到了一条相关的日志

Nov 30 00:21:10 DD-WRT daemon.warn dnsmasq[10942]: possible DNS-rebind attack detected: internal.record.bydell.com

也就是说,这两条指向到内网 IP 的记录被 DNSMasq 当成是 DNS Rebind 攻击被拦截掉了,这也就解释了为什么我路由器中配置的3个 DNS 服务器都可以正常解析,但是在终端上却无法得到正确的结果。于是 Google 了一下解决方案,DNSMasq 支持对特定域名记录加入白名单,使用方法如下:

可以添加静态记录

address=/abc.example.com/1.1.1.1

也可以对整个域名允许绕过 No DNS Rebind 的限制

–rebind-domain-ok=example.com

第一种方式不需要对域名进行解析,相当于在本地添加一条 hosts 记录,适合内部网络使用。

不过还是推荐使用第二种方式,这样不论任何时候记录发生变化,不需要维护 DNSMasq 里面的配置,直接修改对应的 DNS 记录,会灵活一些。

欢迎留言讨论