广电宽带DNS访问某些国内网站的问题

问题说明

有段时间没有更新博客了,最近全国都处于重要的开会期间,不出所料常用的爬墙路线都被各种封锁,而我在的住处使用的广电宽带也出幺蛾子了。前两周我发现突然无法访问 www.ip138.com、www.chinaz.com 之类的国内网站,浏览器上的表现似乎是没有正常打开连接就中断了。

通过在本地运行 nslookup 命令解析这些域名我才发现,这些网站在我的电脑上根本没有解析到任何有效的 IP 地址,难怪无法正常访问了。

为此我登录到 OpenWRT 路由器,直接在路由器系统上运行 nslookup 命令解析这些无法访问的域名,从返回的结果才看出端倪:

[root@PandoraBox:/root]#nslookup www.baidu.com
Server:    127.0.0.1
Address 1: 127.0.0.1 localhost

Name:      www.baidu.com
Address 1: 180.97.33.108
Address 2: 180.97.33.107

[root@PandoraBox:/root]#nslookup www.ip138.com
Server:    127.0.0.1
Address 1: 127.0.0.1 localhost

Name:      www.ip138.com
Address 1: ::ffff:172.30.1.23

[root@PandoraBox:/root]#nslookup www.dasai8.com
Server:    127.0.0.1
Address 1: 127.0.0.1 localhost

Name:      www.dasai8.com
Address 1: ::ffff:172.30.0.44
Address 2: 172.30.0.44

可以看到百度域名可以返回正确的结果,因此能正常访问。

无法访问的 www.ip138.com 和 www.dasai8.com 域名返回的则是诡异的 IPv6 和 IPv4 地址,实际上这两个网站从目前来看是不太可能部署了 IPv6 支持的,而且返回的结果中 172.30.1.23 和 172.30.0.44 也是明显的本地局域网地址。

到此我也大概了解原因了:

广电宽带不知道出于节省成本还是什么的考虑,对某些国内网站内容做了缓存,用户解析这些网站域名时直接返回广电网内缓存服务器的地址,这样访问起来也比较快。但不巧的是这些解析到的局域网服务器地址没有通过路由器正确返回给我使用的电脑,导致无法正常访问这些网站。

问题原因

目前的问题看起来出在路由器上了,为此需要检查路由器的 DNS 服务器设置。最后终于在 PandoraBox 的 “DHCP/DNS” 界面中找到的相关的 “重绑定保护” 设置,把默认选中的 “丢弃RFC1918上行响应数据” 勾去掉之后保存并应用就可以了。

DNS 重绑定保护

这样修改之后,路由器就不会忽略内网地址的解析结果了。

现在再来看看修改之后 ping 这些网站的结果(广电宽带对于非广电内部网络的地址一般都是不允许 ping 的):

(trusty)zzm@localhost:~$ ping -c 4 www.dasai8.com
PING www.dasai8.com (172.30.0.44) 56(84) bytes of data.
64 bytes from 172.30.0.44: icmp_seq=1 ttl=58 time=7.94 ms
64 bytes from 172.30.0.44: icmp_seq=2 ttl=58 time=9.74 ms
64 bytes from 172.30.0.44: icmp_seq=3 ttl=58 time=7.40 ms
64 bytes from 172.30.0.44: icmp_seq=4 ttl=58 time=9.97 ms

--- www.dasai8.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3037ms
rtt min/avg/max/mdev = 7.402/8.766/9.975/1.115 ms

(trusty)zzm@localhost:~$ ping -c 4 www.chinaz.com
PING www.chinaz.com (172.30.1.22) 56(84) bytes of data.
64 bytes from 172.30.1.22: icmp_seq=1 ttl=57 time=7.57 ms
64 bytes from 172.30.1.22: icmp_seq=2 ttl=57 time=9.66 ms
64 bytes from 172.30.1.22: icmp_seq=3 ttl=57 time=8.59 ms
64 bytes from 172.30.1.22: icmp_seq=4 ttl=57 time=10.8 ms

--- www.chinaz.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 7.573/9.177/10.870/1.230 ms

(trusty)zzm@localhost:~$ ping -c 4 www.baidu.com
PING www.a.shifen.com (180.97.33.107) 56(84) bytes of data.

--- www.a.shifen.com ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 2999ms

可以看到前面两个域名的 ping 值显然是局域网内的结果,而 ping 百度则是 “正常” 地返回超时了 -_-#。

解决方法

经过后续测试我发现广电宽带甚至对土豆网这种级别的网站都做了缓存,解析时会返回 172.30.1.23 之类的局域网地址。

尽管可以忽略路由器 DNS 的重绑定保护机制,但访问这些网站完全使用广电缓存的话,很可能会出现网页不正确甚至被插广告的风险,为此我还是在路由器上开启了 pdnsd 服务,修改了 dnsmasq 配置文件,将这些可能被广电缓存的网站域名单独发给本地的 pdnsd 服务进行解析。

dnsmasq 配置文件类似这样:

server=/.google.com/127.0.0.1#5353
ipset=/.google.com/gfwlist
server=/.twitter.com/127.0.0.1#5353
ipset=/.twitter.com/gfwlist
server=/.facebook.com/127.0.0.1#5353
ipset=/.facebook.com/gfwlist
server=/.dasai8.com/127.0.0.1#5353
server=/.ip138.com/127.0.0.1#5353
server=/.chinaz.com/127.0.0.1#5353

前面几个是必须爬墙的域名,通过 pdnsd 解析并加入到名为 gfwlist 的 ipset 中,这样可以自动走 Shadowsocks ss-redir 线路,后面的几个常规情况下被缓存的域名则只是通过 pdnsd 解析。

pdnsd 服务器的配置是以 TCP 协议通过第三方的 DNS 服务器进行域名解析,考虑到 TCP 的 DNS 协议仍然会被广电给劫持的问题,还需要将 pdnsd 配置中的 DNS 服务器加入到 ipset 中,这样就可以让 pdnsd 的解析请求完全走 Shadowsocks 或者 OpenVPN 来避免污染了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

*