“新冠肺炎”防治期间,公司安排在家办公,不去公司上班。通过VPN连接公司的网络,部分公司内网网站无法访问。
经过询问,分析,配置和学习dnsmasq,发现是我的路由器的配置问题。以下是问题排查过程,记下来备忘。
现象
连接上公司的VPN后,按照公司IT所说,我应该能够访问公司内部的网站。但是我连接上以后,通过Chrome访问公司的OA站点,发现结果都如下图
Chrome报的错误是 DNS_PROBE_FINISHED_NXDOMAIN
. 那是DNS哪里出了问题吗?
分析
询问IT是否需要手动设置DNS, 并且询问公司的其他同事是否有相同的情况。得到的回答是无需手动设置DNS,并且别人的访问时正常。那么问题应该就是出现在我这边客户端的问题上。
先通过dig命令查看dns解析是否出问题。
发现通过8.8.8.8能够正确解析到域名。所以网站也有正确的配置
但是,如果不指定DNS服务器的话,就无法解析这个域名。由于OpenWrt中自带dnsmasq, 所以路由器本身也是一个DNS服务器,连接到路由器的设备(我的电脑)默认使用路由器作为DNS服务器进行查询。所以问题应该是出现在路由器上
路由器分析
在路由器中,使用了ChinaDNS/pdnsd来对抗DNS污染问题。ChinaDNS/pdnsd作为dnsmasq的上游DNS服务器,通过tcp向特定的DNS服务器查询,解决DNS污染问题。所以ChinaDNS/pdnsd作为首先的怀疑对象。
分析过程中发现,如果直接通过dnsmasq(192.168.10.1:53)查询的话,OA站点一样解析失败
但是通过 ChinaDNS(192.168.10.1:5353)和pdnsd(192.168.10.1:1053)查询却能够解析成功。那么会不会是dnsmasq没有向ChinaDNS和pdnsd发送请求,或者配置出错了呢。
为了验证这个假想,我通过查询一些被污染的域名来排查这个问题。结果显示,dnsmasq的确会向ChinaDNS和pdnsd发送请求。那么这个过程没有问题的话,问题应该是出在dnsmasq上了。
问题所在
因特网域名分配组织IANA组织(Internet Assigned Numbers Authority)保留了以下三个IP地址块用于私有网络。1
2
310.0.0.0 - 10.255.255.255 (10/8比特前缀)
172.16.0.0 - 172.31.255.255 (172.16/12比特前缀)
192.168.0.0 - 192.168.255.255 (192.168/16比特前缀)
因此,以上三个网段地址被规定为私有地址,openWrt的dnsmasq包里面会对私有地址进行检测,一旦私有地址在路由器的外网转发,则会被丢弃。而路由器处理DNS回复时也会检查是否私有地址,一旦域名被解析为私有地址,则认为可能是DNS rebind攻击。
简单解析一下DNS rebind攻击,就是,假设黑客通过各种技术手段,响应了www.baidu.com的DNS请求,并把ip地址指定为一个私有地址,那么,当你想打开百度时,就访问了假的服务器。
而openWrt默认开启这个DNS rebind保护,就是防止域名被指向内网地址(私有地址),一旦域名被指向私有地址,即丢弃,防止访问了错误的服务器。(默认认为访问域名都通过外网,不需要通过域名访问内网)
解决方案
在OpenWrt的管理界面,在 网络 --> DHCP/DNS --> 常规配置
中,将 重绑定保护取消掉就可以了。