- 引言
- DNS介绍
- DNS原理与解析
- DNS查询
- DNS服务搭建
- DNS劫持和污染
- 计算机面试 or 真题
- DNS应用扩展
- 参考与推荐
引言
我想很多人遇到过这样一种情况,电脑突然上不了网了,或者说可以登陆QQ,但是进不了网页,任何网页都会出现如下的类似截图:
有些浏览器可能还要再多一层,会弹出故障检测,然后再是DNS配置选项错误,这时候的解决方案,可以是用本地安装的电脑管家的工具箱里,找到“网页打不开”的故障维修功能,大概率是能修复的,当然,也可以手动去更新配置,见百度知道里的DNS修改步骤:
全部过程链接为:https://baijiahao.baidu.com/s?id=1726267633457240930&wfr=spider&for=pc
那么本篇就是想探究一下DNS的相关原理,更加系统的记录一下DNS从查询,搭建到扩展的应用,如下内容将主要使用Linux演示。
DNS介绍
DNS 是 Domain Name System(域名系统)的简称,DNS 是一个分层的分布式命名系统,用于连接到互联网或专用网络的计算机,服务或其他资源。它将各种信息与分配给每个参与实体的域名关联起来。
简单来说其最大的功能就是将域名翻译成 IP 地址,例如bilibili的 IP 地址就是一串毫无规则的数字,其中之一为110.43.33.47
,或者ping www.bilibili.com
后查询到的IP为157.148.134.11
,这不利于记忆,且因为有CDN等因素外,并不唯一,同样,同个IP,也可以具有多个DNS,这个后续会解释原因,所以,还是直接输入B站的com
域名更加方便。
域名是由多个部分构成的,跟人的名字一样,由姓氏与名字组合而成,构成域名的每个部分称为一个区域(zone),主要是这样分级的:主机名.二级域名.顶级域名.
这样通常就代表了一个IP,而域名的集合成的系统,可以看成是一个IP地址和域名相互映射的分布式数据库
,就像一本家族的族谱。
如果需要查询得更快,本地会有一个local DNS
服务器,Windows中的位置位于C:\Windows\System32\drivers\etc
下的hosts文件:
而在Linux中,可直接用vim打开/etc/hosts
文件查看所添加的DNS情况,比如我就在原来基础上加了一些我需要的,一般该文件存放常用的 DNS 记录与开发中测试使用的服务器记录:
127.0.0.1 localhost
140.82.114.4 github.com
199.232.69.194 github.global.ssl.fastly.net
140.82.112.10 codeload.Github.com
23.64.114.78 ngc.download.nvidia.cn
# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
可以看到,hosts文件中分为了两部分,IP地址 + 域名的部分即为访问时会优先查询的一些链接,第二部分主要是ipv4或ipv6对应的地址,比如这里的::1
是 IPv6 的本地地址表示方式,后面的类似。
以上就是本地添加DNS映射的操作,这里再列举一些常用的DNS服务选择:
首选DNS | 备用DNS | |
---|---|---|
百度 | 180.76.76.76 | 124.251.124.251 |
114 | 114.114.114.114 | 114.114.115.115 |
腾讯 | 119.29.29.29 | 182.254.116.116 |
阿里云 | 223.5.5.5 | 223.6.6.6 |
谷歌 | 8.8.8.8 | 8.8.4.4 |
openDNS | 208.67.222.222 | 208.67.220.220 |
FreeDJS | 37.235.1.174 | 37.235.1.177 |
一般来讲,较大的厂都设置了自己的DNS服务器,该添加哪个,哪个更好这些其实因人而异,作为远程的服务器,速度受到距离、请求方式等等制约,也有可能今天我添加Google的DNS感觉速度很快,明天发现就很慢了,emmm。。。那就是时空的第四维度了,说不得准,不过这个跟网速一样是有测试工具的,我在查找资料的时候,找到在Windows平台下的一个工具为:
DNSspeeder,这里Mark一下,但我没找到官网,感觉是作者闲着无聊时写得一个小工具吧,Linux下应该也有,不过我没有详细找了,测速能比较清晰的看到DNS速度的可视化,但平常也不会将很多的地址往里加,麻烦不说也意义不大,下面将分析DNS解析的原理与结构。
DNS原理与解析
在上节中,DNS这种IP与域名的映射关系是可以不断往hosts里面添加的,但我们不可能把所有想要看的映射找到加入local DNS中,所以大部分情况下,我们会先绕一层,先去请求表格中我列出的比较知名的大厂所搭建的DNS服务器,然后它返回想看域名的IP再进行跳转,那么依DNS介绍里说的,该服务就像一个分布式数据库,管理了大量各种用户能请求到的DNS。
举个例子,当想在学校里的图书馆查询想要的那一本书,那根据传统方法,首先进入图书馆后,先在大厅了解各层的图书大类分布,比如数学类在某楼,然后进入数学分区后,发现有小学、中学、大学、数学论文、期刊等等,找到大学数学,还有数学专业和非数学专业,或者按科目分,为高等数学、代数、数理概率、运筹与博弈论等等,最后,才找到了《数学模型》姜启源注(emmm,第一时间想到的是这。。。),当然,手机时代已经大大简化操作了,公众号平台直接搜就行了。。。所有这些的原理,还是用索引加树,在本节里更具体点,就是域名结构树。
域名结构树
这里直接以bilibil为例,结构如图(为最后参考链接中的视频截图),从最下层开始,到 .
root根域名服务器,相当于四层结构,从下往上分析:
-
权限(权威,authoritative)域名服务器(主机名):一般代表公司或者组织的主机名或者某个服务名,这些域名服务器负责管理某个区的域名。每一个主机的域名都必须在某个权限域名服务器处注册登记。因此权限域名服务器知道其管辖的域名与IP地址的映射关系。另外,权限域名服务器还知道其下级域名服务器的地址。比如这里的
www
我们知道是访问主站的,而mail/member/space
分别为邮箱、会员和空间,它都管理着各自的功能。 -
二级域名(second-level domains):一般代表公司或者组织的名字,二级域名是网站的特定部分,页面域名或URL地址,可补充顶级域名。定义二级域的最简单方法之一是它由“.com”左侧的域名部分或其他类似的扩展组成,比如这里的bilibili,对顶级域和下级域的分析有助于分析URL或页面地址。
-
顶级域名服务器(top-level domains,TLDS) :一般代表的是该公司或者组织在社会中的某个领域,或者所说的国家,这些域名服务器负责管理在该顶级域名服务器注册的所有二级域名。在顶级域名中包含两种:
- 通用顶级域名(generic top-level domains,gTLDs):通用的顶级域名代表的便是在社会中的某个领域,例如
com
表示的是商业,edu
表示的教育机构,gov
表示的政府机构,org
表示的组织机构 - 国家代码顶级域名(country code top-level domains,ccTLDs):国家代码顶级域名代表国家代表,例如
cn
代表的是中国,jp
代表的是日本,ca
代表的是加拿大等等
当然gTDLS 与 ccTLDs 是可以混用的,比如我
- 通用顶级域名(generic top-level domains,gTLDs):通用的顶级域名代表的便是在社会中的某个领域,例如
-
根域名服务器(root):是最高层次的域名服务器。每个根域名服务器都知道所有的顶级域名服务器的域名及其IP地址。在ipv4时期,因特网上共有13个不同IP地址的根域名服务器,分别为10个在美国,一个在日本,两个在欧洲。而ipv6时期,ip地址已经变成128位,整个dns也更加分布式,但主要的根服务器有三台,分别为中美日。
根域名服务器的原理是,当本地域名服务器向根域名服务器发出查询请求时,路由器就把查询请求报文转发到离这个DNS客户最近的一个根域名服务器。这就加快了DNS的查询过程,同时也更合理地利用了因特网的资源,同时,它采用了任播技术:将任播报文至少传输到一个具有任播地址的主机,最好仅仅传输到一个主机,改善网络负载拓扑,较好地分摊网络负载,提高网络服务的范围和服务质量,使网络资源得到合理利用。
那么到此,就将域名结构树的层级关系说明白了。这里回答最开始的问题:当我们访问网页时,出现故障,无法浏览查看任何地址,而QQ或者其它软件是没有影响的,这是因为QQ在内部已经设置好了相关的DNS,或者说默认代理模式,保证了安全传输,这里以我正在听的QQ音乐为例,在我之前公司净网的时候,将很多提高我敲代码效率的软件加入了黑名单,但我又想听歌,那怎么办?emmm,现在腾讯云、阿里云什么的云服务器很便宜,搭个代理让QQ音乐走我的云服务器流量就好了。
当我设置代理后,网络便会先走我设置的代理,同样,DNS也是有优先级的。一个大致的流程顺序为:
过程可以简单概括为:
1、主机首先向其本地域名服务器进行递归查询。
2、本地域名服务器采用迭代查询,它先向某个根域名服务器查询。
3、根域名服务器告诉本地域名服务器,下一次应查询的顶级域名服务器的IP地址。
4、本地域名服务器向顶级域名服务器进行迭代查询。
5、顶级域名服务器告诉本地域名服务器,下一次应查询的权限域名服务器的IP地址。
6、本地域名服务器向权限域名服务器进行迭代查询。
7、权限域名服务器告诉本地域名服务器所查询的域名的IP地址。
8、本地域名服务器最后把查询的结果告诉主机。
下面将用一个例子论述这个过程。
DNS查询
在Linux下,有nslookup命令查询DNS的一个路径方式,比如我们首先查询根域名服务器:
desktop:~$ nslookup
> set type=ns
> .
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
. nameserver = k.root-servers.net.
. nameserver = g.root-servers.net.
. nameserver = c.root-servers.net.
. nameserver = b.root-servers.net.
. nameserver = h.root-servers.net.
. nameserver = i.root-servers.net.
. nameserver = e.root-servers.net.
. nameserver = j.root-servers.net.
. nameserver = l.root-servers.net.
. nameserver = d.root-servers.net.
. nameserver = m.root-servers.net.
. nameserver = f.root-servers.net.
. nameserver = a.root-servers.net.
Authoritative answers can be found from:
我们会看到目前的13个a-m的根域名服务器地址,.
就是查询根域名方式,最上面的是使用的DNS服务器,我这是自己搭建的,DNS 协议也是应用层的协议,使用TCP和UDP端口53,大多都采用udp传输。下行的Non-authoritative
表示非权威,非权威的结果一般来说就是缓存的结果,而不是管控的相应服务器返回的结果。
那继续,从13个服务器中选择一个查看下级,选择root b:
> set type=a
> b.root-servers.net.
Server: 198.41.0.4
Address: 198.41.0.4#53
Name: b.root-servers.net
Address: 199.9.14.201
> server 199.9.14.201
Default server: 199.9.14.201
Address: 199.9.14.201#53
> set type=ns
> com.
Server: 199.9.14.201
Address: 199.9.14.201#53
Non-authoritative answer:
*** Can't find com.: No answer
Authoritative answers can be found from:
com nameserver = a.gtld-servers.net.
com nameserver = b.gtld-servers.net.
com nameserver = c.gtld-servers.net.
com nameserver = d.gtld-servers.net.
com nameserver = e.gtld-servers.net.
com nameserver = f.gtld-servers.net.
com nameserver = g.gtld-servers.net.
com nameserver = h.gtld-servers.net.
com nameserver = i.gtld-servers.net.
com nameserver = j.gtld-servers.net.
com nameserver = k.gtld-servers.net.
com nameserver = l.gtld-servers.net.
com nameserver = m.gtld-servers.net.
a.gtld-servers.net internet address = 192.5.6.30
a.gtld-servers.net has AAAA address 2001:503:a83e::2:30
b.gtld-servers.net internet address = 192.33.14.30
b.gtld-servers.net has AAAA address 2001:503:231d::2:30
c.gtld-servers.net internet address = 192.26.92.30
c.gtld-servers.net has AAAA address 2001:503:83eb::30
d.gtld-servers.net internet address = 192.31.80.30
d.gtld-servers.net has AAAA address 2001:500:856e::30
e.gtld-servers.net internet address = 192.12.94.30
e.gtld-servers.net has AAAA address 2001:502:1ca1::30
f.gtld-servers.net internet address = 192.35.51.30
f.gtld-servers.net has AAAA address 2001:503:d414::30
> server 192.33.14.30
Default server: 192.33.14.30
Address: 192.33.14.30#53
>
这里的操作是通过root b找到它对应的IP,然后再根据它的IP地址,找到它管控下的顶级域名,我们可以发现,answer从Non-authoritative
变为了Authoritative
,查找方式为com.
,返回的两段式跟上节DNS介绍的结构一样,这里不再论述。
> server 192.33.14.30
Default server: 192.33.14.30
Address: 192.33.14.30#53
>
>
> set type=ns
> bilibili.com.
Server: 192.33.14.30
Address: 192.33.14.30#53
Non-authoritative answer:
*** Can't find bilibili.com.: No answer
Authoritative answers can be found from:
bilibili.com nameserver = ns3.dnsv5.com.
bilibili.com nameserver = ns4.dnsv5.com.
ns3.dnsv5.com internet address = 1.12.0.17
ns3.dnsv5.com internet address = 1.12.0.18
ns3.dnsv5.com internet address = 1.12.0.20
ns3.dnsv5.com internet address = 18.194.2.137
ns3.dnsv5.com internet address = 223.166.151.16
ns3.dnsv5.com has AAAA address 2402:4e00:1430:1102:0:9136:2b2b:ba61
ns3.dnsv5.com internet address = 36.155.149.211
ns3.dnsv5.com internet address = 49.234.175.103
ns3.dnsv5.com internet address = 52.220.136.67
ns3.dnsv5.com internet address = 61.151.180.51
ns4.dnsv5.com internet address = 1.12.0.16
ns4.dnsv5.com internet address = 1.12.0.19
ns4.dnsv5.com internet address = 106.55.82.76
ns4.dnsv5.com internet address = 117.89.178.200
ns4.dnsv5.com internet address = 183.192.164.119
ns4.dnsv5.com internet address = 183.47.126.155
ns4.dnsv5.com internet address = 223.166.151.126
ns4.dnsv5.com has AAAA address 2402:4e00:1020:1264:0:9136:29b6:fc32
ns4.dnsv5.com internet address = 52.198.159.146
>
这里选择一个顶级域名进行探针,然后直接查询bilibili.com.
所在的IP地址,就相当于到了二级域名的位置,而查询到的bilibili的dns服务器为两台,分别为ns3
和ns4
,那我们可以从这两台中的ip地址中继续往下查询:
> server 1.12.0.17
Default server: 1.12.0.17
Address: 1.12.0.17#53
> set type=a
> www.bilibili.com.
Server: 1.12.0.17
Address: 1.12.0.17#53
www.bilibili.com canonical name = a.w.bilicdn1.com.
> a.w.bilicdn1.com.
;; Got SERVFAIL reply from 127.0.0.53, trying next server
Server: 223.5.5.5
Address: 223.5.5.5#53
Non-authoritative answer:
Name: a.w.bilicdn1.com
Address: 183.232.239.19
Name: a.w.bilicdn1.com
Address: 183.232.239.22
Name: a.w.bilicdn1.com
Address: 120.240.75.132
Name: a.w.bilicdn1.com
Address: 120.240.75.133
Name: a.w.bilicdn1.com
Address: 120.240.75.131
Name: a.w.bilicdn1.com
Address: 120.240.75.134
Name: a.w.bilicdn1.com
Address: 120.240.75.130
Name: a.w.bilicdn1.com
Address: 183.232.239.21
Name: a.w.bilicdn1.com
Address: 183.232.239.20
Name: a.w.bilicdn1.com
Address: 183.232.239.18
Name: a.w.bilicdn1.com
Address: 2409:8c54:2810:9105::18
Name: a.w.bilicdn1.com
Address: 2409:8c54:1841:2002::20
Name: a.w.bilicdn1.com
Address: 2409:8c54:2810:9105::15
Name: a.w.bilicdn1.com
Address: 2409:8c54:2810:9105::17
Name: a.w.bilicdn1.com
Address: 2409:8c54:2810:9105::16
Name: a.w.bilicdn1.com
Address: 2409:8c54:1841:2002::22
Name: a.w.bilicdn1.com
Address: 2409:8c54:2810:9105::19
Name: a.w.bilicdn1.com
Address: 2409:8c54:1841:2002::17
>
切换到二级域名,输入www.bilibili.com.
,输出了一个cdn,然后再输入该cdn,就会进行跳转,输出最终的IP地址以及DNS信息了,上述过程可以用下图总结。
DNS查询通常从请求主机到本地域名服务器的查询是递归查询,而其余的查询是迭代查询。
DNS服务搭建
本节会简单搭建,因为个人也不是做运维,找到了一些资料想Mark一下。DNS 的使用方案有许多,常见的开源软件有:
- BIND:全名为 Berkeley Internet Name Domain,是早在 1980 年左右有 Berkeley 大学公开出来的 DNS 服务实现,也是使用最为广泛的方案。后由 ISC 基于 BIND 重写发布 BIND9
- PowerDNS:PowerDNS 由 C++ 实现于 1990 年末,起源一个商业软件于 2002 年开源,相对于 BIND 在数据库选用上与集群上功能更多更灵活
- CoreDNS:由 SkyDNS 进化而来,主要作为一种可插拔的中间件
- DNSpod-sr:一款由国内服务商开源的一套 DNS 的实现
这里选用比较成熟的BIND9 来搭建DNS服务器,另外虽然DNS一般会设置两个服务器,作为主从,但这里一切从简,只是熟悉熟悉过程,我感觉一些搭建比较好的会放最后的参考与推荐中,所以只做主服务器,先安装bind:
sudo apt-get update
sudo apt-get install -y bind9 bind9utils bind9-doc
vi /etc/default/bind9
这里修改bind参数,激活 IPv4 Mode:
BIND 的配置由多个文件组成,这些文件包含在主配置文件中named.conf。这些文件名以“named”开头,因为这是 BIND 运行的进程的名称,可以查看为:
$ cat /etc/bind/named.conf
// This is the primary configuration file for the BIND DNS server named.
//
// Please read /usr/share/doc/bind9/README.Debian.gz for information on the
// structure of BIND configuration files in Debian, *BEFORE* you customize
// this configuration file.
//
// If you are just adding zones, please do that in /etc/bind/named.conf.local
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";
增加了ipv4后,我们首先修改配置选项文件,在named.conf.options
最开头加入本地ip地址,并以一个新的 ACL 块命名 “trusted”,我们把之前找到的内网 ip 添加到可信客户端列表里,并称为 ns1 ,只允许它们查询 DNS 服务器,提高安全性:
$ vi /etc/bind/named.conf.options
acl "trusted" {
192.168.1.215; # ns1 信任的名单
};
options {
directory "/var/cache/bind";
// If there is a firewall between you and nameservers you want
// to talk to, you may need to fix the firewall to allow multiple
// ports to talk. See http://www.kb.cert.org/vuls/id/800113
// If your ISP provided one or more IP addresses for stable
// nameservers, you probably want to use them as forwarders.
// Uncomment the following block, and insert the addresses replacing
// the all-0's placeholder.
// forwarders {
// 0.0.0.0;
// };
//========================================================================
// If BIND logs error messages about the root key being expired,
// you will need to update your keys. See https://www.isc.org/bind-keys
//========================================================================
dnssec-validation auto;
auth-nxdomain no; # conform to RFC1035
listen-on-v6 { any; };
};
关于此文件的一些配置项说明,可以去bind官网查看:Chapter 6. BIND 9 Configuration Reference
这里还有非常多的东西没有开启,我这里记录一下named 服务运行的安全问题:
配置项 | 作用 |
---|---|
allow-query | 指定可以查询主解析记录的服务器地址 |
dnssec-enable | 是否开启 DNS 安全模块 |
dnssec-validation | 是否进行 DNS 安全确认 |
bindkeys-file | 配置 DNS 安全模块所使用的密钥 |
managed-keys-directory | 配置 DNS 安全模块管理密钥的目录 |
session-keyfile | 更新策略的 key 文件名 |
加入了trust
后,接着配置本地文件,这里需要写明正向解析与反向的地址,比如我以我的博客名加sample组成我想改的dns名:
$ vi /etc/bind/named.conf.local
//
// Do any local configuration here
//
// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";
zone "submarineas.example.com" {
type master;
file "/etc/bind/zones/db.submarineas.example.com"; # zone file path
};
zone "168.192.in-addr.arpa" {
type master;
file "/etc/bind/zones/db.192.168";
};
正向与反向,就是字面意思,IP地址与域名间的互转。更加详细的解释,参考:DNS中的正向解析与反向解析 及 nslookup命令使用
这里总结一个表为:
记录类型 | 作用 |
---|---|
A 记录 | 正向解析记录,域名到 IP 地址的映射 |
NS 记录 | 域名服务器记录(NS 为 NameServer) |
MX 记录 | 邮件记录 |
PTR 记录 | 反向解析记录,IP 地址到域名的映射 |
CNAME 记录 | 别名记录,为主机添加别名 |
SOA 记录 | 域权威记录,说明本服务器为域管理服务器 |
AAAA 记录 | 正向解析记录,域名到 IPv6 地址的映射 |
其中每一种都有相应的语法格式,比如说这里要用到的SOA,PTR、NS中的SOA,其记录表示的是域管理服务器,解析文件中除了一些命令放在 zone file 的开头,所有记录的第一条记录应该为 SOA 记录,格式为:
@ IN SOA primary-name-server hostmaster-email (
serial-number
time-to-refresh
time-to-retry
time-to-expire
minimum-TTL )
其中 @
表示的是本机意思,等同于 $ORIGIN
命令,而 $ORIGIN
代表的值为我们在声明中所自定义域的名字。serial-number
是指定的一个同步序列号,每当 zone file 变化的时候该值便会递增,slave 便知道该同步,该重新加载 zone file 了。其它四个参数都跟时间有关,这里就不再详述了。
所以根据上述的规则,我们可以分别写出正向解析与反向解析:
正向解析:
mkdir /etc/bind/zones
sudo cp /etc/bind/db.local /etc/bind/zones/db.submarineas.example.com
sudo vi /etc/bind/zones/db.submarineas.example.com
然后对db.local
的复制域名·submarineas.sample·文件进行修改:
;
; BIND data file for local loopback interface
$TTL 604800
@ IN SOA ns1.submarineas.example.com. admin.submarineas.example.com. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
;
; name servers - NS records
IN NS ns1.submarineas.example.com.
; name servers - A records
ns1.submarineas.example.com. IN A 192.168.1.215
host1.submarineas.example.com. IN A 192.168.1.216
反向解析:
与正向类似,在之前的 named.conf.local
的文件里有写了一个反向域名解析的文件名db.192.168
,现在重新改写:
sudo cp /etc/bind/db.127 /etc/bind/zones/db.192.168
sudo vi /etc/bind/zones/db.192.168
文件的具体内容如下:
;
; BIND reverse data file for local loopback interface
;
$TTL 604800
@ IN SOA submarineas.example.com. admin.submarineas.example.com. (
3 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
; name servers
IN NS ns1.submarineas.example.com.
; PTR Records
5.42 IN PTR ns1.submarineas.example.com. ; 192.168.1.215
1.42 IN PTR host1.submarineas.example.com. ; 192.168.1.216
两个文件编写完成后,bind9有检测语法函数,跟nginx -t一样,它的检测函数是named-checkconf
,为:
named-checkzone submarineas.example.com /etc/bind/zones/db.submarineas.example.com
named-checkzone 168.192.in-addr.arpa /etc/bind/zones/db.192.168
无误后,将DNS添加进系统设置,打开文件resolv.conf
,添加为:
options timeout:1 attempts:1 rotate
nameserver 192.168.1.215
最后重启bind9,就可以看到搭建的DNS服务器啦:
service bind9 restart
DNS劫持和污染
这里参考计算机网络之DNS,因为我感觉描述加图已经很清晰明了了:
DNS劫持:
什么是DNS劫持?DNS劫持指DNS服务器被控制,攻击者利用其他攻击手段,篡改了某个域名的解析结果,使得指向该域名的IP变成了另一个IP,导致对相应网址的访问被劫持到另一个不可达的或者假冒的网址,从而实现非法窃取用户信息或者破坏正常网络服务的目的。
一般来说,DNS劫持大多会出现两种情况:
- 广告劫持: 跳转到灰色页面,或者指定页面广告上
- 恶意劫持: 伪造一个跟目标页面相关的布局,将DNS修改后引流,从而达到盗取账号,或者钱财的目的。
DNS污染:
由于域名查询没有任何认证机制,且通常是基于无连接不可靠的UDP协议,查询者只接受最先到达且格式正确的查询结果(后来的查询结果均被丢弃),因此可以通过对UDP的53端口上的域名查询进行IDS入侵检测,一旦发现相匹配的域名查询请求,就立刻伪装成目标域名的解析服务器返回虚假的查询结果,不过由于缓存过期时间的限制,污染的域名不是一成不变的,若某个污染过的域名缓存记录过了缓存过期时间后没有对其进行再污染,则该域名的污染就会消失。
其实上述两种bug到现在,已经很难在发生很大的影响了,先从DNS污染说起,这种只要不是自己搭建的,或者说没有加安全验证方式的,比如说秘钥,ssh等等,大厂的DNS服务器已经足够完善了,因为阿里云在几年前就防御了全世界范围的DDos攻击,那攻都攻不进来,谈何污染。另外就是DNS挟持,攻击者想要重定向,但可能很快就会被异常识别,代理商也加入了混淆 or 加密代理,吃力不讨好,不如去ctf 插旗,emmm。。。
计算机面试 or 真题
1.(2016年真题)假设所有域名服务器均采用迭代查询方式进行域名解析。当H4访问规范域名为www.abc.xyz.com的网站时,域名服务器201.1.1.1在完成该域名解析过程中,可能发出DNS查询的最少和最多次数分别是__0,4 __
解析: 最少情况下:当本机 DNS高速缓存中存有该域名的DNS信息时,则不需要查询任何域名服务器,这样最少发出0次DNS查询。最多情况下:因为均采用迭代查询的方式,在最坏的情况下,需要依次迭代地向本地域名服务器、根域名服务器(.com)、顶级域名服务器(xyz.com)、权限域名服务器(abc.xyz.com)发出DNS查询请求,因此最多发出4次DNS查询。
2.(2018年真题)下列 TCP/IP应用层协议中,可以使用传输层无连接服务的是()
A) FTP
B) DNS
C) SMTP
D) HTTP
解析: FTP用来传输文件,SMTP用来发送电子邮件,HTTP用来传输网页文件,都对可靠性的要求较高,因此都用传输层有连接的TCP 服务。无连接的UDP服务效率更高、开销小,DNS在传输层采用无连接的UDP服务。
3.(2020年真题)假设下图所示网络中的本地域名服务器只提供递归查询服务,其他域名服务器均只提供迭代查询服务;局域网内主机访问Internet上各服务器的往返时间(RTT)均为10ms,忽略其他各种时延。若主机H通过超链接http://www.abc.com/index.html请求浏览纯文本Web页index.html,则从单击超链接开始到浏览器接收到index.html页面为止,所需的最短时间与最长时间分别是()。
解析: 题中RTT均为局域网内主机(主机H、本地域名服务器)访问Internet上各服务器的往返时间,且忽略其他时延,因此主机H向本地域名服务器的查询时延忽略不计。
最短时间:本地主机中有该域名到IP地址对应的记录,因此不需要DNS查询时延,直接和www.abc.com服务器建立TCP连接再进行资源访问,TCP连接建立需要1个RTT,接着发送访问请求并收到服务器资源响应需要1个RTT,共计2个RTT,即 20ms;
最长时间︰本地主机递归查询本地域名服务器(延时忽略),本地服务器依次迭代查询根域名服务器、com顶级域名服务器、abc.com域名服务器,共3个RT’,查询到IP地址后,将该映射返回给主机H,主机H和 www.abc.com服务器建立TCP连接再进行资源访问,共2个RTT,因此最长时间需要3+2=5个RTT,即50ms。
4.DNS的报文结构:
没啥说的,因为我也不会,emmm,计网里没得,而且也不会去开发DNS协议,只是看到万字长文!搞定逃不脱的 DNS 面试题 写得很详细,关于这些字段详细的解释可以参考。
5.说一下浏览器输入URL发生了什么?
这里有两个角度,一个是从面试官想听到的回答角度,为:
1.解析URL——>2.查找缓存——>3.DNS解析——>4.TCP握手——>5.HTTP请求——>6.TCP挥手——>7.HTML渲染
更详细的解释为:
【1、URL解析】:判断浏览器输入的是搜索内容还是URL
【2、查找缓存】:如果能找到缓存则直接返回页面,如果没有缓存则需要发送网络请求页面
【3、DNS域名解析】:将域名转换为IP地址的过程,得到了服务器具体的IP地址,才可以进行TCP链接以及数据的传输。
【4、三次握手建立TCP连接】:
• 第一次握手:客户端主动链接服务器,发送初始序列号seq=x与SYN=1同步请求标志,并进入同步已发送SYN_SENT状态,等待服务器确认。
• 第二次握手:服务端收到消息后发送确认标志ACK=1与同步请求标志SYN=1,发送自己的序列号seq=y以及客户端确认序号ack=x+1,此时服务器进入同步收到SYN_RECV状态。
• 第三次握手:客户端收到消息后发送确认标志ACK=1,发送自己的序列号seq=x+1与服务器确认号ack=y+1,发送过后即确认链接已建立状态ESTABLISHED,服务端接收确认信息后进入链接已建立状态ESTABLISHED。
【5、发起HTTP请求】:浏览器构建HTTP请求报文,并通过TCP协议传送到服务器的指定端口,HTTP请求报文一共有三个部分
• 报文首部,通常包含请求行与各种请求头字段等;
• 空行,告诉服务器请求头部到此为止
• 报文主体,即发送的数据信息,通常并不一定要有报文主体。
【6、服务器响应并返回结果】:服务端响应HTTP请求,返回响应报文,HTTP响应报文由四部分组成:响应行、响应头、空行、响应体。
【7、通过四次握手释放TCP连接】
【8、浏览器渲染】
【9、js引擎解析】
参考牛客,为:说一下浏览器输入URL发生了什么?
另一个是从网络原理的角度:
1.输入的URL会先触发DNS,先查浏览器缓存,再查hosts文件,再查DNS服务器。
2.构造HTTP协议数据包,方法get,输入的URL,浏览器会自动加上报头,接下来这个数据报就是交给传输层。
3.TCP就会把这个数据构造成TCP数据报,经历三次握手。
4.IP协议构造一个IP数据报,此处根据数据报长度,以及MTU限制,考虑是否分包。并查路由表,决定从哪个端口转发,数据交给数据链路层。
5.构造以太网数据帧,源Mac就是本机,目的Mac就是根据上面的IP确定的转发端口决定的。
6.物理层转换成光信号或者电信号,就行传输。
7.先传输到下一台路由器上,路由器进行解析和分用。解析到传输层。,把数据进行封装,往下一个路由器上转发。
8.中间经历若干路由器转发,最后到达目标服务器。
9.服务器进行分用,物理层吧光电信号转换成bit流,交给数据链路层。
10.数据链路层解析出IP数据报,交给网络层
11.网络层解析数据给传输层。
12.TCP解析出应用层数据,交给应用程序,返回ack。
13.服务器的应用程序读取数据根据请求计算响应,得到一个HTML页面。吧页面构造成一个HTTP响应报文,进过封装分用传输最终返回到客户端。
参考:IP,DNS,经典面试题:从一个浏览器上输入URL,最终看到页面内容,这中间经历了哪些过程?
DNS应用扩展
参考与推荐
- https://www.bilibili.com/video/BV1uL4y1B7aE/
- wiki:Domain Name System
- https://www.lanqiao.cn/courses/601
- Chapter 6. BIND 9 Configuration Reference
- 计算机网络之DNS
- 万字长文!搞定逃不脱的 DNS 面试题
- CentOS8.4 Bind服务配置(DNS解析)
- 抓包理解 DNS 流程和 CDN 原理