众所周知,在国内上网会遇到各种各样不同的人为网络故障,使得我们无法正常访问很多网站。但由于很多人并不熟悉网络,很多时候会无法区分不同的网络故障,导致明明是网络故障,却认为是服务器故障;或明明是服务器故障,却认为是网络故障的情况。我觉得有必要说明一下不同网络故障的特征,以及区分它们并解决它们的方法。
在国内上网环境中,我们经常遇到的网络故障有:DNS劫持、DNS污染、IP封锁、服务器防火墙IP过滤、服务器宕机、基于关键词的TCP连接重置、无状态的TCP连接重置、SSL证书过滤、SSL劫持、HTTP会话劫持等网络故障。下面我就依次进行说明:
1、DNS劫持
DNS劫持会导致我们访问了一些不存在的或不稳定的网站的时候,访问到的却是电信114搜索(详见月光博客《断网后互联星空的浏览器劫持》)或访问Google却显示了Baidu的主页(详见月光博客《Google博客搜索摇身一变成百度》)。
如果需要确认自己是否处在DNS劫持的环境中,我们可以在Windows命令行cmd中使用Windows自带的网络诊断工具nslookup查找一个不存在或不稳定的域名进行一下网络诊断:
C:>nslookup www.SomeRandomDomainName.com
Server: ns-pd.online.sh.cn
Address: 202.96.209.133
Non-authoritative answer:
Name: www.SomeRandomDomainName.com
Address: 218.83.175.155
我们看到,www.SomeRandomDomainName.com本应该是一个不存在的域名,DNS服务器应该告诉我们这个域名不存在,但我们却看到DNS服务器告诉我们这个域名的IP为218.83.175.155(不同地区的114搜索的IP都不同,可能得到的IP并不是218.83.175.155,而是自己所在地区的114搜索的服务器IP地址),而这个IP却是114搜索的IP,导致我们在浏览器中访问这个网站时看到的是114搜索的网页。
如果需要解决DNS劫持的问题,可以把自己的域名解析服务器换乘国外的,比如OpenDNS(详见月光博客《使用OpenDNS解决DNS域名劫持》)或Google DNS(详见月光博客《Google推出免费DNS服务》)。
解决之后我们再次使用nslookup查找一下这个网站:
C:>nslookup www.SomeRandomDomainName.com
Server: google-public-dns-a.google.com
Address: 8.8.8.8
*** google-public-dns-a.google.com can't find www.SomeRandomDomainName.com: Non-existent domain
我们看到DNS服务器正确的告诉了我们这个域名不存在,我们不会被劫持到114搜索了。
不过,正如《使用OpenDNS解决DNS域名劫持》中最后一段所说的那样,“但是对于DNS污染的劫持,使用OpenDNS也无法解决问题”。那么接下来,我就介绍一下DNS污染。
2、DNS污染
由于DNS劫持可以通过把域名解析服务器更换为国外的来解决问题,所以系统需要使用DNS污染来封锁一些域名。这样,即使使用国外的域名服务器也得不到服务器的正确IP,所以也就无法访问这些服务器了。比如现在著名的微博客始祖twitter主页就遭到了DNS污染。
如果需要确认域名遭到了DNS污染而不是其他的故障,首先要了解,DNS劫持是由国内的域名服务器完成的,所以我们把域名服务器换成国外的就可以解决问题;而DNS污染是由系统完成的,所以即使更换了域名服务器,系统仍旧可以发送伪造的域名解析结果替换正确的解析结果。所以我们可以通过使用一个不存在的国外IP作为我们的域名服务器进行诊断究竟是DNS劫持还是DNS污染。我们仍旧通过使用nslookup进行网络诊断,选一个不存在的国外IP为144.223.234.234:
C:>nslookup twitter.com 144.223.234.234
DNS request timed out.
timeout was 2 seconds.
*** Can't find server name for address 144.223.234.234: Timed out
Server: UnKnown
Address: 144.223.234.234
Name: twitter.com
Address: 93.46.8.89
我们看到,由于144.223.234.234不存在,理应没有任何返回。但我们却得到了一个错误的IP:93.46.8.89。我们再测试一下刚才被DNS劫持的IP的情况:
C:>nslookup www.SomeRandomDomainName.com 144.223.234.234
DNS request timed out.
timeout was 2 seconds.
*** Can't find server name for address 144.223.234.234: Timed out
Server: UnKnown
Address: 144.223.234.234
DNS request timed out.
timeout was 2 seconds.
DNS request timed out.
timeout was 2 seconds.
*** Request to UnKnown timed-out
我们看到,www.SomeRandomDomainName.com 没有返回结果,那么它没有被DNS污染。
如果要解决DNS污染,我们只能使用各种加密代理进行远程DNS解析、VPN或利用系统的漏洞了。
3、IP封锁
这里IP封锁指的是国内把国外服务器的IP加入了系统的黑名单,导致大部分地区甚至全国无法直接访问服务器。由于系统是分布式的,所以有可能出现部分地区可以访问,部分地区不能访问的情况。比如现在知名的云存储服务Dropbox的主页,就是遭到了IP封锁。
首先我们把域名服务器设置为国外的,排除了DNS劫持的问题。之后我们诊断一下dropbox的域名是否遭到了DNS污染:
C:>nslookup www.dropbox.com 144.223.234.234
DNS request timed out.
timeout was 2 seconds.
*** Can't find server name for address 144.223.234.234: Timed out
Server: UnKnown
Address: 144.223.234.234
DNS request timed out.
timeout was 2 seconds.
DNS request timed out.
timeout was 2 seconds.
*** Request to UnKnown timed-out
显然也没有遭到DNS污染。那么接下去我们可以在没有过滤ICMP协议的网络环境中(有些小区宽带和有些公司的内部网络过滤了ICMP协议,无法使用tracert),我们可以在Windows命令行cmd中使用Windows自带的网络诊断工具tracert进行一下网络诊断是网站遭到了IP封锁还是其他的故障:
C:>tracert -d www.dropbox.com
Tracing route to www.dropbox.com [174.36.30.70]
over a maximum of 30 hops:
1 18 ms 19 ms 26 ms 58.35.240.1
2 15 ms 20 ms 29 ms 58.35.240.1
3 13 ms 10 ms 14 ms 124.74.20.45
4 14 ms 14 ms 15 ms 124.74.209.137
5 10 ms 15 ms 14 ms 61.152.86.58
6 * * * Request timed out.
7 * * * Request timed out.
8 * * * Request timed out.
……