其实之前就有发现,我在路由器(openwrt)后面的机器不能正常解析映射到内网地址的域名,我当时的做法是在openwrt的hosts文件里加上相应的项来workaround这个问题。当时我还以为只是我自己网络配置出的问题。直到昨晚,微博上有同学跟我聊起这个问题,我才意识到这可能是个普遍性的问题,于是便想google一下解决这个问题。
最终呢,确认是openwrt下dnsmasq的配置问题。只需将openwrt下/etc/config/dhcp 文件下,dnsmasq块下的这一句:
option rebind_protection 1
改为
option rebind_protection 0
即可。
你可以通过下面这一句命令来修改
sed -i ‘s/option rebind_protection 1/option rebind_protection 0/’ /etc/config/dhcp
看了一下openwrt的wiki,rebind_protection这一个选项的作用是Enables DNS rebind attack protection by discarding upstream RFC1918 responses。按我的理解,即是为了保护网络不受DNS rebind attack(DNS重定向攻击?),路由器会将上由路由的对RFC1918域(0.0.0.0/8, 172.16.0.0/12 and 192.168.0.0/16,即内网IP段)的响应包扔掉。
显然这是一个dnsmasq的DNS解析的问题,因此如果我们把/etc/resolv.conf下的nameserver 127.0.0.1删除掉,也能workaround这个问题,但那样就相当于放弃了dnsmasq的DNS缓存功能,得不偿失
或者在luci界面DHCP/DNS关闭冲绑定保护