DNS服务解析与原理笔记

news2024/12/24 9:57:15

  • 引言
  • 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.76124.251.124.251
114114.114.114.114114.114.115.115
腾讯119.29.29.29182.254.116.116
阿里云223.5.5.5223.6.6.6
谷歌8.8.8.88.8.4.4
openDNS208.67.222.222208.67.220.220
FreeDJS37.235.1.17437.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) :一般代表的是该公司或者组织在社会中的某个领域,或者所说的国家,这些域名服务器负责管理在该顶级域名服务器注册的所有二级域名。在顶级域名中包含两种:

    1. 通用顶级域名(generic top-level domains,gTLDs):通用的顶级域名代表的便是在社会中的某个领域,例如 com 表示的是商业,edu 表示的教育机构,gov 表示的政府机构,org 表示的组织机构
    2. 国家代码顶级域名(country code top-level domains,ccTLDs):国家代码顶级域名代表国家代表,例如 cn 代表的是中国,jp 代表的是日本,ca 代表的是加拿大等等

      当然gTDLS 与 ccTLDs 是可以混用的,比如我
      在这里插入图片描述
  • 根域名服务器(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服务器为两台,分别为ns3ns4,那我们可以从这两台中的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劫持大多会出现两种情况:

  1. 广告劫持: 跳转到灰色页面,或者指定页面广告上
  2. 恶意劫持: 伪造一个跟目标页面相关的布局,将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应用扩展

参考与推荐

  1. https://www.bilibili.com/video/BV1uL4y1B7aE/
  2. wiki:Domain Name System
  3. https://www.lanqiao.cn/courses/601
  4. Chapter 6. BIND 9 Configuration Reference
  5. 计算机网络之DNS
  6. 万字长文!搞定逃不脱的 DNS 面试题
  7. CentOS8.4 Bind服务配置(DNS解析)
  8. 抓包理解 DNS 流程和 CDN 原理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/194778.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android.mk文件编写

来源:https://www.jianshu.com/p/9aab51f4cd6f 1. Android.mk 介绍 Android.mk 是Android 提供的一种makefile 文件,注意用来编译生成 exe(二进制可执行文件)、so(动态库文件)、a(静态库文件)、jar(jar包) 和 apk 等文件。Android.mk和一个或多个.c的源…

PWN入门程序装载与虚拟内存 小白笔记

1.源代码到执行源代码test.c从磁盘中,通过gcc编译成a.out(可执行文件)。执行的时候,是将磁盘中的可执行文件(a.out)映像到内存中。2.节视图和段视图节视图(磁盘中的可执行文件)不同的…

采用消息中间件实现最终一致性的分布式事务

基于可靠消息服务的方案是通过消息中间件保证上下游应用数据操作的一致性。假设有A和B两个系统,分别可以处理任务A和任务B。此时存在一个业务流程,需要将任务A和任务B在同一个事务中处理。就可以使用消息中间件来实现这种分布式事务。 第一步&#xff…

一篇文章带你了解KendoReact DateRangePicker,让日期选择变得更酷炫!

Kendo UI致力于新的开发,来满足不断变化的需求。现在我们非常自豪地宣布,通过React框架的Kendo UI JavaScript封装来支持React Javascript框架。KendoReact能够为客户提供更好的用户体验,并且能够更快地构建更好的应用程序。理想情况下&#…

python中有哪些运算符,python里的运算符号

大家好,给大家分享一下python中有哪些运算符,很多人还不知道这一点。下面详细解释一下。现在让我们来看看! 1、Python中的算术运算符有哪些呢? 1. 比较运算符: 如果比较式成立,返回True;不成立…

[Linux系列]linux bond详解

目录 背景 简介 bond分类 1. mode0(balance-rr) 2. mode1 (active-backup) 3. mode2(balance-xor) 4. mode3(broadcast) 5. mode4(802.3ad) 6. mode5(balance-tlb)…

STL模拟实现——stack、queue和priority_queue(适配器、仿函数、反向迭代器)

适配器 适配器是一种设计模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总 结),该种模式是将一个类的接口转换成客户希望的另外一个接口。下列的这些stack、queue和priority_queue以及反向迭代器都是适配器。 stack介绍 1. sta…

数据结构-第八期——树状数组-原理区间和

目录 1、树状数组 2、基本应用 2.1、前缀和:不修改,只查询 2.2、树状数组:动态修改,求区间和 3、实现数组树状 3.1、神奇的lowbit (x)操作 3.2、tree[ ]数组 3.3、基于tree[ ]的计算 3.4 sum[]的计算 3.5、tree[]的更新…

CD3药物研发进展-销售数据-上市药品前景分析

CD3作为近几年的双抗热门靶点之一,目前在全球登记的CD3相关药物就有470个,上市的CD3药物有8款,Ⅰ期临床到Ⅲ期临床有116种,临床前及药物发现达200多种,其火热程度可想而知,笔者为方便大家更加清晰了解CD3在…

ESP-IDF:冒泡排序和选择排序测试代码

ESP-IDF:冒泡排序和选择排序测试代码 /冒泡排序/ void printarry16 (int arr[],int length) { for(int i0;i<length;i) { cout<<arr[i]<<" “; } cout<<endl; } void test16() { int arr[] {9, 8, 7, 6, 5, 4, 3, 2, 1, 0,9, 8, 7, 6, 5, 4, 3, 2…

【笔记】容器基础-容器与虚拟机

杂记&#xff1a; 容器技术的兴起源于 PaaS 技术的普及Docker 公司发布的 Docker 项目具有里程碑式的意义Docker 项目通过“容器镜像”&#xff0c;解决了应用打包这个根本性难题容器本身没有价值&#xff0c;有价值的是“容器编排”进程&#xff1a; 静态表现&#xff1a;程序…

Java NIO同步非阻塞编程原理解析及案例

Java NIO同步非阻塞编程原理解析及案例 文章目录Java NIO同步非阻塞编程原理解析及案例NIO介绍NIO和 BIO的比较NIO 三大核心原理示意图缓冲区(Buffer)基本介绍Buffer常用API介绍Buffer 类及其子类缓冲区对象创建缓冲区对象添加数据缓冲区对象读取数据通道(Channel)基本介绍Chan…

生物医药校招这么难,怎么锁定高端人才?

“每年招聘压力大&#xff0c;进校太难。”“各个事业部人才选用要求高&#xff0c;很难达到要求。”“企业、事业单位、高校三方‘围剿’&#xff0c;人才竞争实在太大&#xff01;”……人才招聘内卷&#xff0c;在生物医药行业可以说是体现得淋漓尽致。生物医药岗位及学历要…

【小白课程】以openKylin看图软件为例,浅谈图片编解码库—FreeImage

看图软件是openKylin操作系统上一款开源的图像查看软件&#xff0c;支持对图片进行基本操作,如&#xff1a;缩放、翻转、详情查看、复制、打印、重命名等&#xff0c;同时还可以对图片进行裁剪、存储、标注和ocr&#xff08;文字识别&#xff09;。 图1 看图软件界面 作为图像…

信通院联合偶数科技等企业发布《云原生湖仓一体白皮书》

2023年1月9日&#xff0c;云原生产业联盟在今年年会上重磅发布了《云原生湖仓一体白皮书》。该白皮书由中国信通院牵头&#xff0c;偶数科技、中国人寿、中信建投、中国联通等单位共同编写。 本次白皮书从云原生湖仓的发展历程、技术方案、生态现状、实践案例等方面进行了全面深…

Linux C 捕捉 Ctrl+C 的SIGINT信号

kill -l可以看每个数字对应的信号信号值9和15的区别&#xff1a;kill命令默认是-15&#xff0c;代表的信号为SIGTERM&#xff0c;在结束此进程之前&#xff0c;允许此进程做一些清理工作kill -9会直接杀死目标进程&#xff0c;不给其机会做清理工作按键盘的 CtrlC时&#xff0c…

测试高薪必备

测试人员由于工作原因要经常检查数据库的数据是否正确&#xff0c;这个时候就需要频繁使用多表查询。 在多表查询中&#xff0c;应用最多的就是内连接&#xff0c;其次就是子查询。 为什么子查询是在工作中应用也有这么广泛的应用呢&#xff1f;原因在于子查询非常方便…

macOS下使用vscode+xdebug调试php

手动安装xdebug1、浏览器访问https://xdebug.org/wizard2、在本地终端输入php -i 命令&#xff0c;将输出的内容复制到指南中的输入框中并提交分析3、分析完后会给出分析概览&#xff0c;然后根据下面提示步骤进行手动安装即可第5步中的phpize 命令位置:/usr/local/Cellar/php7…

神经网络基础与原理

7.1 神经网络基础与原理 学习目标 目标 了解感知机结构、作用以及优缺点了解tensorflow playground的使用说明感知机与神经网络的联系说明神经网络的组成说明神经网络的分类原理说明softmax回归说明交叉熵损失应用 无 7.1.1 神经网络 人工神经网络&#xff08; Artificial N…

Oracle数据库卸载安装

卸载oracle步骤&#xff1a;1.首先关掉所有oracle的相关服务&#xff0c;然后找到oracle的卸载程序Universal Installer&#xff1a;2.卸载&#xff0c;删除所有应用然后继续点击卸载产品&#xff0c;然后点击展开全部&#xff0c;将主目录以外的所有应用全部卸载掉&#xff0c…