在访问DNS有的时候会比较慢甚至无法打开,而我最近遇到的一个问题是DNS被污染,并且由于同时加载了境内和境外DNS,根本无法找到究竟是哪里受到了DNS污染。为此我搜了不少资料,最终得到了以下的解决方案,不过其实这个方法个人认为也是治标不治本。
解决方法就是本地设置hosts
/DNS
,强制直接让网站访问某个ip从而跳过寻找ip地址。
原理
简单讲一下原理(应该其实会一点CS的都懂啦),可以跳过。
在访问网站时,由于我们输入的是域名(如www.google.com
),需要寻找它真实的ip地址再去访问。
那如何获取它的ip地址呢,这就是DNS和hosts的用处了。
电脑首先在本地的hosts
中寻找域名对应的ip,比如localhost
是直接对应127.0.0.0
。
如果能在hosts中寻找到,那么就直接进行下一步去加载网页了
但往往hosts中没有太多的对应,于是就下一步采用DNS
寻找ip。
相对于hosts在本地,DNS在无其他配置情况下是通过网络查找的,而在这个时候,可能会有人在查找的结果中动一些手脚,明明是11.11.11.11
的ip,却让它返回22.22.22.22
。
那这样,这个网址就无法加载了。
此外,当Github访问速度过慢也可能是在DNS查找时比较慢,又或者因为这种大的网站一般有多个ip,我们访问了最远的ip,那么就会很慢了。
因此,通过修改hosts直接强制域名对应ip,使得DNS查找这个步骤可以省略,且访问速度较快的一个ip。
一、获取需要解析的地址
为了确保加载,我解析的地址比较多,其中分为必须和可选(自己加上后发现效果比较好)
必须
- gist.github.com
- github.com
- assets-cdn.github.com
- github.global.ssl.fastly.net
可选
- www.github.com
- api.github.com
- github.githubassets.com
- github.map.fastly.net
- raw.githubusercontent.com
- avatars0.githubusercontent.com
- avatars1.githubusercontent.com
- avatars2.githubusercontent.com
- avatars3.githubusercontent.com
如何有针对性的选择添加解析的域名
在加载github的时候打开开发者模式(F12),选择网络(Network),观察加载比较慢的或者直接加载失败的。
如图,可以看到头像是加载失败的,找到网址是:avatars0.githubusercontent.com,把它加入需要解析的地址
二、获取Github的DNS解析地址
方法一
采用IPAddress.com查询ip地址。
输入需要查找的网址,如:assets-cdn.github.com,就可以看到结果。
可以看到assets-cdn.github.com有四个对应ip
方法二
在用方法一的时候,发现电脑本来自动加载的ip和搜索出来的ip相差很大,因此可以直接采用电脑本来自己加载的时候采用的ip。
又或者如果有自己的服务器可以尝试用服务器ping一下查看服务器所找到的ip。
又又或者直接试试网上别人提供的ip。
三、修改Hosts文件
打开系统的hosts文件,Windows是在C:\Windows\System32\drivers\etc
,Mac和Linux是在/etc
均需要采用管理员(root)打开
在文件最后加上需要的ip和域名对应的地址,如下:
1 | 192.30.255.112 gist.github.com |
四、刷新DNS缓存
对于Windwos用户,需要刷新一下DNS缓存
打开cmd
或powershell
输入
1 | ipconfig /flushdns |
这样就可以使用我们自定义的hosts了
缺点
这其实是一个硬方法,由于ip可能会变且存在很多不同的ip,采用自定义ip其实并没有那么方便,一是不一定能找到最快的ip,二是一旦ip修改还得自行修改hosts文件,并没有那么方便。
但网上搜索了那么多,也没有找到一些好的方法,就先选择采用这个方法吧。
ps.几年前的采用修改hosts的方法是可以当半个梯子用的,不过现在好像并不太好用了。。