修改Hosts访问被DNS污染的网站
Github 访问失败或者缓慢?
为什么会访问失败或者速度很慢?
国内网络访问 Github 速度过慢的原因有许多,但其中最直接和原因是其 CND 域名遭到 DNS 污染,导致我们无法连接使用 GitHub 的加速服务,因此访问速度缓慢。
简单理解:CDN「Content Delivery Network」,即内容分发网络,依靠部署在各地的边缘服务器,平衡中心服务器的负荷,就近提供用户所需内容,提高响应速度和命中率。DNS 污染,是指一些刻意或无意制造出来的数据包,把域名指向不正确的 IP 地址,阻碍了网络访问。
我们默认从目标网址的最近 CDN 节点获取内容,但当节点过远或 DNS 指向错误时,就会操成访问速度过慢或无法访问的问题。
访问慢、无法加载还是无法通讯?
这三种情况是有区别的,含义不一样:
- 访问慢:连接延迟高,内容能够被加载但需要较长的时间。
- 无法加载:浏览器无法打开网址。
- 无法通讯:无法进行直接的网络通讯,包括了上一种情况。
自然导致这三种情况的原因也不尽相同:
- 访问慢:服务器或 CDN 节点的地理位置相对较远,难以物理超度。注意这里的表现是延迟高,不一定是每秒传输速度慢。
- 无法加载:可能由于长时间的未响应,即访问慢的情况,导致浏览器判定无法加载内容;可能由于网址对应内容不能被直接访问,即无可访问内容或无权限访问。
- 无法通讯:这类情况往往是 IP 解析错误,即遭受 DNS 污染;否则就是 IP 服务器出现了内部错误。
检测一下
可以利用两个工具来判断不同域名或 IP 地址是上述那种情况。笔者以github.com
为例,实际操作一遍检测的过程,看看是什么情况:
- 首先利用网络上的
ping
工具,例如这个,检测网址、IP 地址的通讯情况。输入要检测的网址github.com
,点击「Ping 检测」。工具提供的服务是利用自己分布在各地的网络节点的本机ping
工具,执行对网址的ping
操作,汇总结果,统计响应网址的服务器 IP。 - 检测结果如下图示。共计 106 个检测点,其中接受响应速度最快的节点在加拿大,目标服务器对其响应时间为 14ms;最慢在中国香港,响应时间 243ms。在成功访问的所有节点中,目标服务器的平均响应时间是 163.5ms。地图与颜色响应了国内不同省市的访问时间,红色说明访问超时,白色说明没有参与节点;约偏向绿色则响应时间越短。右侧还有一个统计表。这里的情况是:国内节点无法
ping
通github.com
,即无法建立网络通讯。
- 再往下便是具体的每个节点的响应信息。
网络上的ping
工具能为我们提供三个重要的信息:首先,如果存在ping
通的节点,那么 IP 服务器没有宕机;其次,响应 IP 汇总表提供了所有可能的服务器与 CDN 的 IP 地址;最后,具体信息部分可以点击响应时间排序,我们可以找到响应最快的服务器 IP。
- 接着我们使用自己电脑的
ping
工具来测试网络。打开终端,输入ping [ip address]
,替换其中的 IP 地址或域名即可。我们不ping
域名,那样会ping
向设置的 DNS 解析出来的 IP 地址。我们ping
上一步得到的响应最快的服务器。
ping 140.82.114.4 # 这个IP是响应最快的,来自加拿大
ping 192.30.253.112 # 这个IP也可以响应,来自中国香港
这一步说明,如果我们网络设置的 DNS 解析出的github.com
的 IP 无法在本机ping
通,我们便不能够访问该网址。这也是后面通过修改系统 Hosts 文件来解决访问失败问题的原因。
最后我们可以用浏览器尝试直接打开ping
通的 IP 地址。其结果是:140.82.114.4
无法被浏览器加载;192.30.253.112
可以加载出 Github 首页。
检测结果
上一步操作的结果就是我们判断三种情况的依据。
- 通过
192.30.253.112
响应的github.com
,属于「访问慢」,可以连接但延迟较高;IP 可以被浏览器加载。 - 通过
140.82.114.4
响应的github.com
,同样属于「访问慢」;但被浏览器直接加载时,属于「无法加载」,即可以ping
通但无法直接访问。 - 通过
13.229.188.59
响应的github.com
,属于「无法通讯」,无法建立链接。
域名,网址与 IP 地址
上面提到的这些东西有点乱了,整理一下。
- 「IP 地址」:每个连接到互联网的主机都会被分配一个 IP 地址,用来唯一标识该主机,节点之间的访问通过 IP 地址来进行,形如
192.30.253.112
。 - 「域名」:IP 地址使用数字标识,使用时不好记忆书写,因此在 IP 地址的基础上又发展出一种符号化的地址方案,来代替数字型的 IP 地址。每一个符号化的地址都与特定的 IP 地址对应。IP 地址相对应的字符型地址,就被称为域名。形如
github.com
。 - 「网址」:URL「统一资源定位符」,俗称为网址。浏览器地址栏输入的字符串,服务器上储存文件的位置。格式为:
<协议>://<域名或IP>:<端口>/<路径>
。<协议>://<域名或IP>
是必需的,<端口>/<路径>
有时可省略。形如https://www.github.com
。 - 「DNS」:域名虽然便于人们记忆,但节点之间通过 IP 地址通讯。两者之间的转换工作称为域名解析,域名解析需要由专门的域名解析服务器来完成,即 DNS 服务器。域名的最终指向是 IP 地址。
注意,IP 地址和域名是一对多的关系。一个 IP 可以对应多个不同的域名,但是一个域名只能对应一个 IP 地址。就跟人的名字一样,你可以有多个名字。但这些名字都是指的你。
然而我们利用网络工具测试时,发现github.com
有多个响应 IP 服务器。这就是开头提到的 CDN 服务。多个平行的服务器响应,均匀了中心服务器的负载,使得网络通讯更加迅速。
现实的情况是,github.com
启用的 CDN 节点遭到了 DNS 污染,错误的 IP 指向,包括错误 IP、响应过慢的 IP,都会造成我们访问 Github 失败。
方案:修改 Hosts 文件
再总结一下 Github 访问失败或者缓慢的原因:本机网络设置的 DNS 服务器解析 Github 相关域名到遭受污染的 IP 地址,这些 IP 地址要么本身无法访问,要么节点过远,从而导致了访问失败或者速度缓慢。
那么我们修改的方案可以是:
- 修改本机 Hosts 文件,主动建立域名与 IP 的映射关系,访问到这些域名时直接使用 Hosts 指定的 IP,绕过 DNS 解析。
- 修改网络的 DNS 服务器,换到能够解析出合适 IP 的 DNS 服务器。
显然第一种方案更加方便。因为 DNS 服务器储存的映射关系是动态更新的,无法直接控制。直接修改本机 Hosts 文件,锁定域名对应的 IP,更加有效方便。当然,Hosts 文件的作用就是绑定域名与 IP 的映射关系。
Windows 修改 Hosts 文件
- 打开 cmd,修改 Hosts 文件:
C:\Windows\System32\drivers\etc\hosts
- 刷新网络 DNS 缓存:
ipconfig /flushdns
当前 IP 值
列出当前使用的 Github 相关域名比较合适的 IP 值。其中的设置可以解决github.com
头像无法显示的问题:
#Github xj
52.192.72.89 github.com
54.251.140.56 nodeload.github.com
203.208.39.99 api.github.com
203.208.39.99 github.global.ssl.fastly.net
140.82.113.9 codeload.github.com
185.199.108.133 raw.github.com
185.199.108.153 training.github.com
185.199.108.153 assets-cdn.github.com
185.199.108.153 documentcloud.github.com
185.199.108.154 help.github.com
185.199.108.153 githubstatus.com
185.199.111.133 raw.githubusercontent.com
185.199.108.133 cloud.githubusercontent.com
185.199.108.133 gist.githubusercontent.com
185.199.108.133 marketplace-screenshots.githubusercontent.com
185.199.108.133 repository-images.githubusercontent.com
185.199.108.133 user-images.githubusercontent.com
185.199.108.133 desktop.githubusercontent.com
185.199.108.133 avatars.githubusercontent.com
185.199.108.133 avatars0.githubusercontent.com
185.199.108.133 avatars1.githubusercontent.com
185.199.108.133 avatars2.githubusercontent.com
185.199.108.133 avatars3.githubusercontent.com
185.199.108.133 avatars4.githubusercontent.com
185.199.108.133 avatars5.githubusercontent.com
185.199.108.133 avatars6.githubusercontent.com
185.199.108.133 avatars7.githubusercontent.com
185.199.108.133 avatars8.githubusercontent.com
不一定保证每一项都是正确、有效的,但目前来说实测能够稳定访问 Github。