DNS简析

Introduction

DNS: Domain Name System,指的是整一个系统,而不是一个特定的机器
NS: Nameserver,提供域名解析服务的机器,给它一个域名,它会给你解析出ip或者给你对应的NS信息
DNS server: 代替用户的机器向NS查询域名<->ip
A记录 -> 域名 -> ip,直接给你ip
NS记录 -> 域名 -> NS,给你一个NS地址php

Name Server架构

DNS 利用相似树状目录的架构,将主机名称的管理分配在不一样层级的 DNS 服务器当中,经由分层管理, 因此每一部 DNS 服务器存储的数据就不会不少linux

Layer host name domain name
顶级 edu .tw
二级 ksu edu.tw
三级 www ksu.edu.tw

分层管理机制

  • 每部机器只管理下一层的 hostname 对应 IP
  • 至于下层的下层,则受权给下层的 DNS 主机来管理

分层查询机制

这里给出一个不太严谨的例子。这里以查询www.baidu.com 为例, 展现DNS服务器如何一级级地查询到它的IP地址,中间要通过三个NS。若是DNS服务器里面有缓存(一段时间失效),就能够直接报给client。缓存

下面使用dig +trace来模拟DNS查询出南京大学小百合bbs的地址安全

dig +trace bbs.nju.edu.cn

; <<>> DiG <<>> +trace bbs.nju.edu.cn
;; global options: +cmd
.            3230    IN    NS    g.root-servers.net.
.            3230    IN    NS    e.root-servers.net.
.            3230    IN    NS    m.root-servers.net.
.            3230    IN    NS    l.root-servers.net.
.            3230    IN    NS    d.root-servers.net.
.            3230    IN    NS    b.root-servers.net.
.            3230    IN    NS    i.root-servers.net.
.            3230    IN    NS    h.root-servers.net.
.            3230    IN    NS    a.root-servers.net.
.            3230    IN    NS    k.root-servers.net.
.            3230    IN    NS    j.root-servers.net.
.            3230    IN    NS    c.root-servers.net.
.            3230    IN    NS    f.root-servers.net.
;; Received 460 bytes from 127.0.1.1#53(127.0.1.1) in 8 ms

cn.            172800    IN    NS    b.dns.cn.
cn.            172800    IN    NS    a.dns.cn.
cn.            172800    IN    NS    ns.cernet.net.
cn.            172800    IN    NS    e.dns.cn.
cn.            172800    IN    NS    d.dns.cn.
cn.            172800    IN    NS    c.dns.cn.
;; Received 513 bytes from 192.5.5.241#53(f.root-servers.net) in 300 ms

edu.cn.            172800    IN    NS    ns2.cuhk.hk.
edu.cn.            172800    IN    NS    deneb.dfn.de.
edu.cn.            172800    IN    NS    dns.edu.cn.
edu.cn.            172800    IN    NS    dns2.edu.cn.
edu.cn.            172800    IN    NS    ns2.cernet.net.
;; Received 716 bytes from 203.119.25.1#53(a.dns.cn) in 30 ms

NJU.edu.cn.        172800    IN    NS    DNS.NJU.EDU.CN.
NJU.edu.cn.        172800    IN    NS    NS.NJU.EDU.CN.
;; Received 131 bytes from 202.112.0.35#53(dns.edu.cn) in 3639 ms

bbs.nju.edu.cn.        10800    IN    A    210.28.129.4
;; Received 59 bytes from 202.119.32.12#53(NS.NJU.EDU.CN) in 167 ms

简化过程以下:服务器

  • 查询cn
    127.0.0.1 -> f.root-servers.net
  • 查询edu.cn
    127.0.0.1 -> a.dns.cn
  • 查询nju.edu.cn
    127.0.0.1 -> dns.edu.cn
  • 查询bbs.nju.edu.cn
    127.0.0.1 -> NS.NJU.EDU.CN

这是一个企业级的网站的例子,能够看出架构

  • 除了最后一步,向Nameserver查询获得的记录都是Nameserver的地址
  • 本身搭建的网站须要有一个本身的Nameserver,存储本身的网站的ip
  • 本身搭建的网站的Nameserver要向上一级登记
  • 查询的时候用wireshark抓包,发现本机只和系统指定的DNS服务器通信,说明这些操做目前由DNS服务器来处理。
  • 前面的查询记录都是NS记录,也就是Nameserver的地址,最后一个记录是A记录,也就是bbs.nju.edu.cn真正的地址。
  • 这里会显示一些数字,也就是DNS查询结果的TTL
  • NS也有A记录,由于查询的过程当中要链接NS。

若是搭建一个很简单的网站,也能够不用创建Nameserver,向上一级申请填写你的主机名和ip,这样就简便多了。这样在DNS查询的最后一步,结果是直接指向你的网站,而不是指向你的网站的dns服务器less

Name Server之间的Master-Slave架构

解析一个域的DNS服务器能够有多个。这样数据的同步更新就是一个问题了,因此有了Master-Slave架构。dom

当Master更新了数据以后,Slave会向其拿更新的数据,这样维护DNS的时候就不用每一台都去更新了。tcp

DDNS

当你从ISP得到动态IP的时候,IP常常变换的状况就会显得很不方便。DDNS机制使得你能够频繁地将本身的IP报告给NS,而后Internet上面的DNS主机须要频繁地更新解析的记录(设定一个较短的最大缓存时间)。函数

底层协议

DNS一般使用基于port 53的UDP,有时候数据量太大的时候使用TCP

cat /etc/services  | grep 53
domain        53/tcp                # Domain Name Server
domain        53/udp

配置文件

/etc/hosts

用户自定义的 ip <-> 域名

# cat /etc/hosts
127.0.0.1 localhost.
1.2.3.4 www.fake.com
3.4.5.6 www.fake1.com

/etc/resov.conf

存储DNS服务器的地址,在DHCP以后,DHCP client会自动修改这个配置文件。

#cat /etc/resolv.conf 
# Generated by dhcpcd
nameserver 8.8.8.8

注意到,uclibc里面的__dns_lookup函数,会使用__open_nameservers函数从这个文件里面拿到的DNS服务器的地址,而后向这个地址发送DNS数据包。

相关命令

nslookup

Nslookup is a program to query Internet domain name servers. Nslookup has two modes: interactive and non-interactive

tan@tanhangbo-pc:~$ nslookup bbs.nju.edu.cn
Server:        127.0.1.1
Address:    127.0.1.1#53

Non-authoritative answer:
Name:    bbs.nju.edu.cn
Address: 210.28.129.4

tcpdump抓包结果以下,说明是进行了一次DNS查询。

host

host is a simple utility for performing DNS lookups. It is normally used to convert names to IP addresses and vice versa

@query1
tan@tanhangbo-pc:~$ host bbs.nju.edu.cn
bbs.nju.edu.cn has address 210.28.129.4

@query2
tan@tanhangbo-pc:~$ host 8.8.8.8
8.8.8.8.in-addr.arpa domain name pointer google-public-dns-a.google.com.

@query3
tan@tanhangbo-pc:~$ host www.baidu.com 8.8.8.8
Using domain server:
Name: 8.8.8.8
Address: 8.8.8.8#53
Aliases: 

www.baidu.com is an alias for www.a.shifen.com.
www.a.shifen.com has address 61.135.169.125
www.a.shifen.com has address 61.135.169.121

tcpdump抓包结果以下,说明是进行了一次DNS查询。

能够看出,host也能够做为反解,而且能够指定DNS服务器的地址让它进行查询。

dig

dig (domain information groper) is a flexible tool for interrogating DNS name servers. It performs DNS lookups and displays the answers that are returned from the name server(s) that were queried. Most DNS administrators use dig to troubleshoot DNS problems because of its flexibility, ease of use and clarity of output. Other lookup tools tend to have less functionality than dig

从man的介绍来看,dig的逼格是最高的,上面已有一个实例,就再也不介绍了。

总结

推荐程度来讲,dig > host > nslookup

DNS安全问题

  • 由于DNS服务器是开放的,友好的,因此你发查询数据的时候它会老老实实地返回一堆你要的数据。因此当你须要攻击别人的时候,只须要伪造原地址为别人的ip,向一堆DNS服务器发送查询,那么这些DNS服务器的查询结果就如洪水般淹没他家的网口。
  • DNS服务器自己若是被攻破,那么返回的ip地址不必定就是对的,那么没有HTTPS保护的网站可能会被伪冒。
  • DNS服务器和客户端之间是没有认证的,因此你能够站在那台真实的服务器以前拦截你的数据,告诉你一个假的地址。

Reference

http://linux.vbird.org/linux_server/0350dns.php



相关文章
相关标签/搜索