hosts 是什么?
相信大家都看过流浪地球 2,其中有这么一个情节,重启世界根服务器
,那么这个根服务器到底是什么呢?这里就不得不提及域名解析系统的发展史了
在很早很早以前,域名解析系统还没有建立起来,全球的网络主机还很少的时候,IP 地址的映射主要靠的就是各主机里的 hosts 文件来实现,那时候的 hosts 文件保存着互联网上所有主机地址的映射。而 hosts 文件的更新是由一个专门来维护 hosts 文件的站点来实现。也就是说那时根本就不需要也没有 DNS 服务器这东西,用自己主机上的 hosts 文件就可以找到对方的 IP 地址然后建立连接了
但是后来随着互联网的规模不断扩大,hosts
文件的维护也越来越困难,毕竟全球的网络主机都需要通过这个负责维护 hosts 更新站点来更新,hosts 所存放的解析记录数量级不断增加,单单只是检索就要花不少时间 修改hosts文件理解DNS - (下)
当我们打开这个hosts
文件之后可以发现里面有一下内容
Windows 目录是: C:\Windows\System32\drivers\etc\hosts
Linux 目录是: /etc/hosts
|
|
看到第一行就是我们所熟悉的127.0.0.1 localhost
,就是在hosts中定义的
可以看第 5 行前面是 IP 后面是域名一一对应,是不是突然就明白了这个hosts
文件的作用
DNS 是什么
DNS(Domain Name System,域名系统),将人类可读的域名(例如 www.example.com)转换为机器用于相互通信的IP地址(例如 192.0.2.1 或 2001:db8::1)的一种分布式数据库。打个比方来说,DNS就像一个电话簿,IP相当于电话号码,域名相当于联系人
小贴示
这几条可以看出一个 IP 地址可以同时对应多个域名,这也就是为什么平时在地址栏上输入 google.com或www.google.com都可以访问 google 了。而https://是浏览器自动帮你加上去的,平时我们访问不了 google 的原因是,google 的域名 在本机转化为 IP 地址后经过中国大陆的防火长城,被防火长城检测到与黑名单内的关键词匹配(如:Google、Facebook、twitter等都在黑名单内),然后就会伪装成目标域名的解析服务器返回虚假的查询结果。关键的是通常的域名查询没有任何认证机制,而且域名的查询一般是基于无连接不可靠的 UDP 协议,所以浏览器只能接受最先到达的格式正确结果,并把之后的所有结果丢弃。所以这也就访问不了啦,这种情况就是所谓的 DNS 缓存污染,也称为 DNS 缓存投毒(这个真形象…)参考文献-从修改hosts文件科学上网中理解DNS(上)
一个域名背后可以有多个I地址。当域名解析服务器在解析域名记录的“值”中包含多个IP地址时,LDNS会返回所有IP地址,但返回I地址的顺序是随机的。浏览器默认选取第一个返回的 IP地址作为解析结果,其解析流程如下。
- 网站访问者通过浏览器向Local DNS(简称LDNS)发送解析请求。
- LDNS将解析请求逐级转发(递归)至权威DNS。
- 权威DNS在收到解析请求后,将所有I地址以随机顺序返回LDNS。
- LDNS将所有IP地址返回浏览器。
- 网站访问者的浏览器随机访问其中一个I地址,通常(不是绝对)选取第一个返回的IP地址。在没有做反向代理的情况下,如果返回的IP地址有多个,那么访问到这些IP地址的机会一般是均等的。
在DNS解析的描述过程中,浏览器首先通过本地的DNS服务(LDNS)发送第一个 解析请求,然后由LDNS返回IP地址,访问对应的服务器所提供的互联网服务。 这样就带来了一个问题:如果LDNS返回的不是公网的域名解析服务解析出的IP地址, 而是经过本地篡改的呢?
域名篡改
域名会被篡改吗?或域名解析服务器在解析域名后返回的IP地址会被篡改吗? 在回答上述问题前,我们先查看Linux系统中有关DNS的配置文件。
引言
/etc/hosts
:记录hostname对应的IP地址
/etc/resolv.conf
:设置DNS服务器的IP地址
/etc/host.conf
:指定域名解析的顺序,是先从hosts 解析还是先从DNS解析
LDNS 优先解析hosts 文件(Windows 路径是C:\Windows\System32\driversletclhosts
),在hosts文件中,改变域名指向的I地址,我们将不会访问到原来的公网主机。示例如下:
|
|
→在修改前,对城名执行ping命令
|
|
→使用dig命令解析域名
|
|
→修改后,再对域名执行ping命今
|
|
→使用host命令解析城名,可以看到依然是公网IP地址
|
|
##一修改hosts 文件后,dig命令解析的城名依然是公网IP地址。找寻A的记录,它是不经过LDNS iSERVER:8.8.8.8#53(8.8.8.8) ##→本机的DNS地址设置为8.8.8.8,DNS的默认端口是53 如果没有修改 hosts 文件,在什么情况下可能出现DNS返回错误的IP 地址呢?域名劫持是最可能出现的情况。域名劫持就是通过攻击或伪造域名解析服务器的方式,把目标网站域名解析到错误的 I地址,从而使用户访问一些非法、恶意网站。因此,我们需要使用域名解工具查看访问域名是都真正对应IP地址
DNS污染
小贴示
网域服务器缓存污染(英语:DNS cache pollution)、DNS污染或DNS劫持,是一种破坏域名系统查询解析的行为。[1]通常有计算机程序自动执行DNS劫持攻击导致DNS服务器缓存了错误记录的现象。而域名服务器缓存投毒(DNS cache poisoning)和DNS缓存投毒指由计算机程序执行的DNS劫持攻击。污染一词可能取自域名系统域名解析之特性,若递归DNS解析器查询上游时收到错误回复,所有下游也会受影响 参考文献(3)-域名服务器缓存污染
hosts是如何实现科学上网的
这里以GitHub为例
|
|
GitHub站点毕竟在国外,当dns请求时返回最快的那一个IP,但是想要访问就肯定要走大陆宽带,防火长城就会返回一个假的结果,那么hosts为什么能直接连上GitHub呢,这里就不得不提及域名解析的优先级了,hosts > DNS
,在DNS域名解析系统建立起来之后hosts被弃用,但仍然保留在Linux,Windows系统内,而且优先级一般大于dns解析结果,从而能够建立连接
当然,如果想流畅的访问GitHub单单只是修改hosts效果并不明显,可以搭配FastGithub合法的工具访问
附录
参考文献
参考文献(1)-从修改hosts文件科学上网中理解DNS(上)
参考文献(2)-Linux从入门到精通 第八章 Linux网络与安全
版权信息
本文原载于 nightrainmilkyway.cn,遵循 CC BY-NC-SA 4.0 协议,复制请保留原文出处。