DNS
DNS全称Domain Name System。因为Ip地址难以记忆使用,所以通过域名来唯一表示主机,然后通过DNS将域名转变为IP地址。这样,还能使域名对应的ip可以改变。domain name(域名)的概念不仅用在dns上,只要通过点隔开的名字系统,都可以叫域名,比如mail addressing。
RFC 1034说明了DNS的概念和功能
1. DNS 名字空间
name space大概如图所示:
top-level domains(顶级域名)分为三个部分
- arpa is a special domain used for address-to-name mappings
- 7个3个字符的域名叫做(generic domains or organizational domains)组织域
- 所有两个字符的是国家域(根据country code found in iso 3166)
vangogh.cs.berkeley.edu.
最后一个点代表这个名称是完整的,就叫fully qualified domain name(FQDN)。
2. zone和dns服务器
zone
Zone,是DNS name space的子树。也是委托管理的单元。每个域名都属于某个区域(Zone)。每个Zone都会由专门组织来管理,来保证域名注册以及正常使用。比如中国互联网信息中心负责.cn域名的维护管理。.cn
就是一个zone。
zone是层级划分的。一个域名,在不同的点分隔的地方,会请求不同的zone。这个叫delegation
。比如baidu.com
,com
是一个zone,baidu.com
也是一个zone。
dns server
管理zone的信息,就需要dns servers。一般至少两个dns server。其它dns可以从主dns上拷贝zone信息,这叫做zone transfer
,既可以可以通过dns协议,也可以手动rsync
。
分布式的dns server不仅包括各个组织,ISP搭建的dns server,还有root servers和generic top-level domain servers。每个DNS请求,如果在ISP没有缓存结果,就会向root server请求。
在2011年,有13个root servers。每个root server不是单独的server。而是一组servers,一组servers用同样的ip地址。(通过IP anycast addressing)
搭建dn server
BIND
是美国加利福尼亚大学伯克利分校开发的软件,是一套域名服务器软件包,该软件实现了 DNS 解析协议,可以在 Linux 系统上通过这个软件包来提供域名解析服务。
缓存
dns请求的结果,一般会缓存在本地几分钟。可以通过ipconfig
来看本机缓存的情况。
# 显示本地dns缓存,配置在hosts的关系,也会显示出来
ipconfig /displaydns
# 清除本地dns缓存
ipconfig /flushdns
3. dns 格式
dns查询支持udp或tcp的方式进行。一个请求一个回答响应。 请求信息包括:name,type,class。 回答RRS包括:name,type,class,TTL,RData。
TTL:控制数据被缓存多久,单位秒。 Rdata:一般是ip地址 class:1,254,255.indicatiing the Internet,no class,all classes.
Rdata的主要类型如下:
|value|RR type|Description and Purpose|
|—|—|—|
|1|A|ipv4的地址|
|2|NS|name server;提供authoritative name server的名字|
|3|CNAME|canonical name;提供别名(CDN 用到了CNAME链)|
|6|SOA|Start of a zone of authority;一个域的权威记录|
|12|PTR|Pointer;提供了逆向查询。查询in-addr.arpa
domain|
|15|MX|Mail exchanger;提供域名对应的e-mail handling host。简单邮件传输有协议SMTP会根据MX记录来决定路由过程|
|。。。||
一共有14个类型,只列举了常用和我熟悉的,更多的需要看TCPIP详解。
soa类型
如下,我们可以通过查询域名的SOA记录,来看不同域名的name server。在网上查询name server,能进一步找到管理域名的组织
λ nslookup
Default Server: UnKnown
Address: 192.168.20.241
> set type=soa
> cn.
Server: UnKnown
Address: 192.168.20.241
Non-authoritative answer:
cn
primary name server = a.dns.cn
responsible mail addr = root.cnnic.cn
serial = 2026119302
refresh = 7200 (2 hours)
retry = 3600 (1 hour)
expire = 2419200 (28 days)
default TTL = 21600 (6 hours)
a.dns.cn internet address = 203.119.25.1
a.dns.cn AAAA IPv6 address = 2001:dc7::1
反向查找:PTR类型
通过ip地址查找对应的域名。通过IP地址添加特殊的in-addr.arpa
domain用来反向查找ipv4的地址。比如79.69.156.39.in-addr.arpa
来查询39.156.69.79的域名。
在实际中用API来反向查找,c函数的getnameinfo()
。java的getHostName()
。但因为并不是所有dns都支持反向,经常查询失败。这个API要尽量少用,不仅查询失败。还会造成等待,
InetSocketAddress address = new InetSocketAddress("28.28.1.3", 100);
//This method may trigger a name service reverse lookup
String hostName = address.getHostName();
4. dns update
通过发起dns update请求,可以动态更新Zone。window会自动请求更新它的计算机名和域名。dns server需要配置支持dns update。
# Refreshes all DHCP leases and re-registers DNS names
C:\> ipconfig /registerdns
5. 其它相关
- dhcp服务器也可以赋予客服端域名(FQDN)
whois service
whois service用来查询域名,ip的分配情况,注册用户和其它信息。具体定义在RFC 3912。whois协议现在一般基于TCP。
除了命令行的方式,还有很多web网站,比如:https://ipinfo.info/html/ip_checker.php 可以查询域名的whois信息。但是具体的组织能查询更具体的信息
例子
看ip地址39.156.69.79(百度的ip)的分配情况,先访问美国的whois,http://whois.arin.net/rest/ip/39.156.69.79.txt
。就可以发现这个ip是APNIC组织分配管理的。详细信息http://wq.apnic.net/apnic-bin/whois.pl
在这里查询。
#
# ARIN WHOIS data and services are subject to the Terms of Use
# available at: https://www.arin.net/resources/registry/whois/tou/
#
# If you see inaccuracies in the results, please report at
# https://www.arin.net/resources/registry/whois/inaccuracy_reporting/
#
# Copyright 1997-2020, American Registry for Internet Numbers, Ltd.
#
NetRange: 39.0.0.0 - 39.255.255.255
CIDR: 39.0.0.0/8
NetName: APNIC-39
NetHandle: NET-39-0-0-0-1
Parent: ()
NetType: Allocated to APNIC
OriginAS:
Organization: Asia Pacific Network Information Centre (APNIC)
RegDate: 2011-01-09
Updated: 2011-02-10
Comment: This IP address range is not registered in the ARIN database.
Comment: For details, refer to the APNIC Whois Database via
Comment: WHOIS.APNIC.NET or http://wq.apnic.net/apnic-bin/whois.pl
Comment: ** IMPORTANT NOTE: APNIC is the Regional Internet Registry
Comment: for the Asia Pacific region. APNIC does not operate networks
Comment: using this IP address range and is not able to investigate
Comment: spam or abuse reports relating to these addresses. For more
Comment: help, refer to http://www.apnic.net/apnic-info/whois_search2/abuse-and-spamming
Ref: https://whois.arin.net/rest/net/NET-39-0-0-0-1
#
# ARIN WHOIS data and services are subject to the Terms of Use
# available at: https://www.arin.net/resources/registry/whois/tou/
#
# If you see inaccuracies in the results, please report at
# https://www.arin.net/resources/registry/whois/inaccuracy_reporting/
#
# Copyright 1997-2020, American Registry for Internet Numbers, Ltd.
#
DDNS
动态域名服务。能用固定的域名地址访问动态IP。实现方式不在DNS协议范畴,而是应用层上的协议沟通。通过在客服端或者路由器上运行客服端程序,间隔检测IP地址,如果变更,就发送到提供DDNS服务的服务器上。国内提供DDNS服务器的主要有花生壳。
本地网络的名字解析
除了DNS,在本地网络中还有其它的name services。包括mac的Bonjour/ZeroConf,windows的LLMNR和NetBIOS。这些都是不同厂商自己的,没有建立IETF标准。所以在不同local environment下解析name的行为会不同。而了解这些具体的行为只有参看具体操作系统给出的文档。
mac的本地名字解析,Multicast DNS协议(属于Bonjour)会添加.local
后缀。所以mac用电脑名连接windows电脑,需要加上.local
后缀。
例如windows在做名字解析的步骤(refer:Microsoft TCP/IP Host Name Resolution Order)
- 看这个名字是否自己
- 查看hosts文件
- 请求dns server
- NetBIOS name resolution(这个顺序可以配置) 4.1 Check Netbios name cache; 4.2 check LMHOSTS file; 4.3 Query WINS server ( if configured ); 4.4 Try Netbios broadcasts.
7. dns安全
主要是两种:dos和伪造dns记录(dns挟持,dns污染)。
伪造dns记录,在我们日常生活中并不少见。平常我们不管访问什么页面,角落都有广告,可能就遇到了运营商dns挟持。通过修改dns记录,返回新的地址,将原来内容包括在iframe中,另外新增广告页面。现在基本这种情况大运营商基本没有了,投诉到工信部是有用的,访问https页面,因为证书的关系,也能够一定程度防止dns挟持。
还有一种情况,一些国外网站死活打不开,就算DNS服务器就算改到国外,还是不能访问。你可以遇到了GFW防火墙篡改DNS记录。科学上网,自己搭建DNS服务器,通过非常规端口请求dns,可能会解决这种情况。
还有一些工具能够内网dns欺骗,比如ettercap
。
预防dns污染的方法看这个RFC 5452:Measures for Making DNS More Resilient against Forged Answers
8. 还有什么
zone transfer
,dns suffix
,wins服务器
,detect dns spoofing
。
9. 工具
windows
主要是:
ipconfig
: 显示ip,dns信息。
nslookup
:能发起dns请求。
Nbtstat
: a diagnostic tool for NetBIOS over TCP/IP
#NetBIOS名称
Nbtstat -A 192.168.1.12
#会显示出计算机名。
`ping ip`
################################
# 清除dns缓存
C:\> ipconfig /flushdns
Windows IP Configuration
Successfully flushed the DNS Resolver Cache.
################################
# 能发起不同type的dns请求
C:\> nslookup
Default Server: gw
Address: 10.0.0.1
> set type=a
> berkeley.edu.
Server: gw
Address: 10.0.0.1
Non-authoritative answer:
Name: berkeley.edu
Address: 169.229.131.81
linux
主要是:host
dig
# host命令既可以正向查找,也可以反向查找
[near@xx]$ host digisky.com
digisky.com has address 125.64.92.11
digisky.com mail is handled by 10 qiye163mx02.mxmail.netease.com.
digisky.com mail is handled by 5 qiye163mx01.mxmail.netease.com.
#
[near@xx]]$ host 125.64.92.11
11.92.64.125.in-addr.arpa has no PTR record
[near@xx]]$ dig www.pixiv.net @208.67.222.222