DNS详解
DNS(Domain Name System):域名解析系统。
DNS的作用是根据域名查找ip,也就是输入一个域名输出一个ip。
域名的层级
根域名:.root
或者.
。
顶级域名:.com
、.cn
、还有我的.icu
都是顶级域名。
次级域名:比如我的域名ownpress.icu
。
主机域名:比如proxy.ownpress.icu
,主机域名由域名持有者自行分配。
DNS解析过程
比如在浏览器中输入了www.ownpress.icu
,会发生什么?
- 浏览器会查找本地dns缓存,有则返回结果,没有则继续下一步。
- 查看本地hosts文件有没有记录,有则返回,没有则继续下一步。
Hosts是一个没有扩展名的系统文件,可以用记事本等工具打开,其作用就是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的IP地址,一旦找到,系统会立即打开对应网页,如果没有找到,则系统会再将网址提交DNS域名解析服务器进行IP地址的解析。
需要注意的是,Hosts文件配置的映射是静态的,如果网络上的计算机更改了请及时更新IP地址,否则将不能访问。
- 浏览器向本地dns服务器(运营商提供的)发送查询请求,本地dns服务器收到请求后会查询本地缓存,有则返回,没有则向dns根域名服务器发出查询请求。
- 根域名服务器收到请求后就返回
.icu
这个顶级域名的服务器。 - 本地dns服务器收到返回的
.icu
顶级域名服务器地址后就给.icu
顶级域名服务器发出查询请求。 .icu
顶级域名服务器收到查询请求后返回ownopress.icu
的地址。- 本地dns服务器收到后,向
.ownpress.icu
这个域名服务器请求查询www.ownpress.icu
。 .ownpress.icu
域名服务器收到请求后,查询www.ownpress.icu
的ip并返回给本地dns服务器。- 本地dns收到最终查询结果后将其返回给了用户,不过本地dns服务器不会每次都傻傻的去一层层查询,它会缓存一部分在本地dns服务器中。
DNS缓存时间
dns服务器会配置有一个参数TTL(time to live)
,也就是dns记录的存活时间。
设置TTL的原因是一个域名对应的ip可能会发生变动导致dns服务器缓存记录失效,另外就是让访问量不是那么大的域名的解析不要一直占用dns服务器的缓存。
超过TTL的记录都会被删除,下次再有用户查询则重新获取。
DNS记录类型
DNS报文结构
DNS报文:
同一个dns解析的请求报文和应答报文具有相同的事务ID。
DNS劫持和http劫持
dns劫持:中国互联网早期经常出现dns劫持,dns劫持就是dns返回的ip与你要访问的域名的真实ip不符。dns劫持的方法有好几种,第一种是流氓软件或者恶意程序修改了用户本地的hosts文件,第二种是路由劫持,第三种是dns服务器查询并返回了错误的ip,这可能是dns服务器被攻陷了亦或者是dns服务器故意如此。
http劫持:
在用户的客户端与其要访问的服务器经过网络协议协调后,二者之间建立了一条专用的数据通道,用户端程序在系统中开放指定网络端口用于接收数据报文,服务器端将全部数据按指定网络协议规则进行分解打包,形成连续数据报文。
用户端接收到全部报文后,按照协议标准来解包组合获得完整的网络数据。其中传输过程中的每一个数据包都有特定的标签,表示其来源、携带的数据属性以及要到何处,所有的数据包经过网络路径中ISP的路由器传输接力后,最终到达目的地,也就是客户端。
HTTP劫持是在使用者与其目的网络服务所建立的专用数据通道中,监视特定数据信息,提示当满足设定的条件时,就会在正常的数据流中插入精心设计的网络数据报文,目的是让用户端程序解释“错误”的数据,并以弹出新窗口的形式在使用者界面展示宣传性广告或者直接显示某网站的内容。
使用工具管理DNS
- dig
dig可以查询dns记录以及dns解析的过程。
使用:dig +trace www.ownpress.icu
查询详细信息。
使用:dig +short www.ownpress.icu
查询结果。
使用:dig @8.8.8.8 www.ownpress.icu
指定dns服务器。
使用:dig cname www.ownpress.icu
查询指定类型的记录。
- host
host是dig的简化版,返回当前请求域名的各种记录。
用法:host www.ownpress.icu
- whois
查看域名的注册信息。
用法:whois ownpress.icu
- nslookup
1 | nslookup [待查询域名] [指定DNS服务器] |
清理本地dns缓存
- macos
1 | sudo dscacheutil -flushcache |
- linux
使用NSCD的dns缓存:
1 | sudo /etc/init.d/nscd restart |
使用DNSMASQ:
1 | sudo dnsmasq restart |
- windows
1 | ipconfig /flushdns |