后端每日一题 2:DNS 解析过程

本文首发于公众号:腐烂的橘子

本文梗概:

  • DNS 是什么,有什么作用
  • 一条 DNS 记录是什么样的
  • DNS 域名解析原理
  • DNS 服务器如何抵御攻击

DNS 是什么,有什么作用

DNS(Domain Name System)是一种应用层协议,用于映射域名和 ip 地址。

为什么要做映射呢?就像可以用身份证号来对应一个人,也可以用电话对应一个人,但打招呼时我们不会说:“138xxxxxx,早上好”,而是会用名字来打招呼。同样的道理,人们在访问网站时希望用更容易被记住的域名,比如 www.baidu.com,而不是 213.22.345.33。但是对于网络设备而言,使用 ip 地址却比域名更友好,因为 ip 地址的格式更规范,更容易被机器理解。

DNS 最重要的作用是提供域名解析服务,除此之外,它的作用还有:

  • 规范主机名:www.baidu.com 可能只是一个别名,它可能会有一个规范主机名 relay1.east.baidu.com,别名比规范主机名更容易记忆,客户端可通过别名获取到规范主机名和 ip 地址
  • 邮件服务器别名:邮件服务器为了让自己的域名更号机,可能也会有一个邮件服务器别名,这个别名允许和 web 服务器一致,比如你开发的邮件服务器和 web 服务器可以都使用 www.enterprise.com 这个域名
  • 负载均衡:DNS 服务器可能会非常繁忙,所以一个域名可能对应若干个 ip 地址,这时会返回一个 ip 地址的集合,由于客户总是向集合里的第一个 ip 地址建立连接并传输数据,因此 DNS 服务器通过控制返回 ip 的顺序来达到负载均衡的目的

一条 DNS 记录是什么样的

与 DNS 记录相关的,最常见到的就是域名解析里的 A 记录和 CNAME 记录了,如下:

在这里插入图片描述

DNS 记录就是 DNS 服务器内保存的信息,是一个 4 元祖:

(Name, Value, Type, TTL)

这里比较好理解,Name 是域名,Value 是 ip,Type 是记录的类型,包含上图中的 A 记录和 CNAME 记录,TTL 是过期时间,代表这条记录多久后会失效。

我们可以使用 nslookup -debug www.rottenorange.cn 来查找 www.rottenorange.cn 相关的 DNS 记录:

de@MacBook-Pro ~ % nslookup  -debug www.rottenorange.cn
Server:		26.26.26.53
Address:	26.26.26.53#53------------QUESTIONS:www.rottenorange.cn, type = A, class = INANSWERS:->  www.rottenorange.cncanonical name = z1ming.github.io.ttl = 505->  z1ming.github.iointernet address = 185.199.110.153ttl = 3320->  z1ming.github.iointernet address = 185.199.109.153ttl = 3320->  z1ming.github.iointernet address = 185.199.108.153ttl = 3320->  z1ming.github.iointernet address = 185.199.111.153ttl = 3320AUTHORITY RECORDS:ADDITIONAL RECORDS:
------------
Non-authoritative answer:
www.rottenorange.cn	canonical name = z1ming.github.io.
Name:	z1ming.github.io
Address: 185.199.110.153
Name:	z1ming.github.io
Address: 185.199.109.153
Name:	z1ming.github.io
Address: 185.199.108.153
Name:	z1ming.github.io
Address: 185.199.111.153

可以看到我们搜到了多条 A 类型的记录,对应多个 ip 地址,以及一个权威 DNS 记录 z1ming.github.io.。

Type 枚举有:

  • Type = A:主机名到 ip 地址,如 (relayl.bar.foo.com, 145.37.93.126, A)
  • Type = CNAME:主机名到规范主机名,如 (foo.com, relay1.bai.foo.com, CNAME)
  • Type = NS:域名到权威 DNS 主机名,如 (foo.com, dns.foo.con1, NS)
  • Type = MX:别名为 Name 的邮件服务器的规范主机名,如 (foo.com, mail.bar.foo.com, MX)

DNS 域名解析原理

在这里插入图片描述
(图片来源于https://www.cloudflare.com/zh-cn/learning/dns/what-is-dns/​)

假设你输入 www.baidu.com,如果都不命中缓存,会经历如下 4 类 DNS 服务器:

  • 本地 DNS 服务器:客户端会先请求本地 DNS 服务器,如果不命中缓存,则请求根服务器
  • 根服务器(DNS Root Nameserver):全球共 400 多台,由 13 个不同的组织管理(大部分是老美),根服务器的列表可以在 https://www.iana.org/domains/root/servers 里查到,如下图[1]。回到正题,请求根服务器会返回顶级域名权威服务器的 ip,对于 www.baidu.com,.com 保存在顶级域名服务器,根服务器返回 .com 所在的顶级域名服务器的 ip 地址
  • 顶级域名服务器(DNS TLD Nameserver):根据返回的 ip 查询顶级域名服务器,它保存了 baidu.com 所在的权威服务器的 ip
  • 权威服务器(DNS Authoritative Nameserver):这里保存了 www.baidu.com 域名对应的 ip,权威服务器将这个 ip 返回给本地 DNS 服务器,本地 DNS 服务器将这个 ip 返回给客户端,至此完成了一次 DNS 查询

DNS 服务器如何抵御攻击

常见的攻击方式有 DDoS(Distributed Denial-of-Service)泛洪攻击和中间人攻击,不过由于 DNS 服务器都有自己的本地缓存,客户端也有自己的浏览器缓存,所以至今还没有大规模 DNS 服务瘫痪的情况。

分布式拒绝服务 (DDoS) 攻击是拒绝服务 (DoS) 攻击的一个子类。[2]Dos 是使用一个服务器攻击,DDoS 是利用多个服务器组成一个僵尸网络来攻击。它们的特点是发送大量需要密集资源的数据包从而使网络出现大量超时、甚至瘫痪的情况。

所以 DNS 的 DDoS 攻击就是僵尸网络向 DNS 服务器发送大规模分组,使得大部分 DNS 请求得不到回答,比如向根域名服务器、或顶级域名服务器发起攻击。

而中间人攻击就是攻击者截获到 DNS 请求,并返回伪造的回答,这样客户端无感知地访问到了被攻击者重定向的网站。通常这种方式难以实现,因为中间人攻击要求截获分组或控制住服务器。[3]

参考

  1. https://www.iana.org/domains/root/servers
  2. https://www.imperva.com/learn/ddos/denial-of-service/
  3. 计算机网络:自顶向下方法(原书第七版)

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

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

相关文章

JS高级 -- 数据类型

1. 分类 基本(值)类型 String:任意字符串Number:任意的数字Boolean:true / falseundefined:undefinednull:null 对象(引用)类型 Object:任意对象Function:一种特别的对象(可以执行)Array&am…

解决 Oracle 表锁

程序更新大量数据的时候, 由于时间太长, 页面刷新又重新提交了一次, 结果后续的任何变动都直接卡住, 一开始以为是代码问题, 使用 jstack 命令导出了当前堆栈, 结果发现有重复的语句卡在 update 上了, 看 sql 语句, 发现就是正常的 update, 那问题大概率就是出在表被锁身上了. …

使用和配置:超秀的 MySQL 客户端工具 MyCli

1.安装一个更人性化的一个mysql客户端、终端: sudo apt install mycli 登录方式 mycli -uroot password 2. 功能:界面更好看,且支持自动补全,按tab可以补全 3.mycli使用帮助说明文档 mycli --help用法: mycli [OPTIONS] [DATABASE]例如:…

西门子程序专业备份软件BUDdy for S7和使用说明

西门子程序专业备份软件BUDdy for S7和使用说明

如何在Django中使用Ajax进行动态数据更新?

在Django中使用Ajax进行动态数据更新需要以下步骤&#xff1a; 在前端页面中引入jQuery库。 <script src"https://ajax.googleapis.com/ajax/libs/jquery/3.5.1/jquery.min.js"></script>创建一个处理Ajax请求的视图函数。 from django.http import Json…

虹科Pico汽车示波器 | 免拆诊断案例 | 2006 款林肯领航员车发动机怠速抖动

故障现象 一辆2006款林肯领航员车&#xff0c;搭载5.4 L发动机&#xff0c;累计行驶里程约为26万km。该车因发动机怠速抖动故障进厂维修&#xff0c;维修人员更换了火花塞、点火线圈及凸轮轴位置传感器&#xff0c;清洗了积炭和喷油器&#xff0c;故障依旧&#xff0c;于是向笔…

富格林:正确曝光做单欺诈套路

富格林悉知&#xff0c;黄金是一种不错的投资产品&#xff0c;其具有良好的避险作用。选择已曝光的正确黄金产品&#xff0c;也能把握不错的收益。虽然黄金投资的对象单一&#xff0c;但这并不意味着投资者可以轻而易举获得收益&#xff0c;要想获得收益就得杜绝欺诈套路。下面…

SpringBoot学习之Redis下载安装启动【Windows版本】(三十六)

一、下载Redis for Windows Redis 官方网站没有提供 Windows 版的安装包,但可以通过 GitHub 来下载安装包,下载地址:https://github.com/tporadowski/redis/releases 1、网站提供了安装包和免安装版本,这里我们直接选择下面的免安装版本 2、下载后的压缩包解压以后,如下…

C#基础之结构体

结构体 文章目录 1、概念2、基本语法3、示例4、结构体的使用5、访问修饰符6、结构体的构造函数思考1 描述矩形信息思考2 职业名字释放了技能思考3 小怪兽思考4 多个小怪兽思考5 奥特曼打小怪兽 1、概念 结构体是一种一定义变量类型 它是数据和函数的集合&#xff0c;可以在结…

Entity Framework6 Oracle 官网开发说明

Entity Framework, LINQ and Model-First for the Oracle Database

面试复试基础题目-数据库相关

维护数据库的完整性&#xff0c;一致性&#xff0c;你喜欢用触发器还是自写业务逻辑&#xff1f;为什么&#xff1f; 尽可能用约束&#xff0c;比如主键、外键、唯一键、非空字段等&#xff0c;具体问题具体分析&#xff0c;数据量巨大的不要用触发器&#xff0c;小的可以用&am…

揭秘被忽视的商业模式:全民拼购助力客户实现日销千万的惊人业绩

今天&#xff0c;我想和大家分享一个颇具潜力的模式与玩法&#xff0c;尽管它在外界看来可能略显陈旧。这个模式曾被忽视&#xff0c;但我的一位客户却巧妙运用&#xff0c;实现了惊人的业绩——日销售额接近五千万&#xff0c;日订单量高达300万单。 值得注意的是&#xff0c;…

C语言:计算整数每一位数字和(用递归的方式)

用递归函数DigitSum&#xff0c;来计算整数每一位数字和 #include<stdio.h> int DigitSum(int n) { if (n > 9) return DigitSum(n / 10) n % 10; return n; } int main() { int n 0; scanf_s("%d", &n); i…

实现序列化和反序列化为什么要实现Serializable接口?

1.什么是序列化和反序列化&#xff1f; 序列化&#xff1a;把对象转换为字节序列的过程称为对象的序列化 反序列化&#xff1a;把字节序列恢复为对象的过程称为对象的反序列化 2.什么时候要用到序列化和反序列化&#xff1f; 当我们只在JVM里面运行Java实例&#xff0c;这个…

将文件导入数据库

#include <stdio.h> #include <sqlite3.h> #include <string.h> int main(int argc, const char *argv[]) { //打开数据库 sqlite3 *db NULL; if(sqlite3_open("./dict.db",&db) ! SQLITE_OK){ printf("sqlite…

NLP(9)--rnn实现中文分词

前言 仅记录学习过程&#xff0c;有问题欢迎讨论 利用rnn实现分词效果(感觉十分依赖词数据) 使用jieba分词好的数据做样本 pip install jieba 代码 import jieba import numpy as np import torch import torch.nn as nn from torch.utils.data import DataLoader"&quo…

Java 提取HTML文件中的文本内容

从 HTML 文件中提取文本内容是数据抓取中的一个常见任务&#xff0c;你可以将提取的文本信息用于编制报告、进行数据分析或其他处理。本文分享如何使用免费 Java API 从HTML 文件中提取文本内容。 安装免费Java库&#xff1a; 要通过Java提取HTML文本&#xff0c;需要用到Free…

QT——简易计算器(从0开始)

目录 一、题目描述&#xff1a; 二、创建工程&#xff1a; 1. ​编辑 2. 3. 4. 默认 5. 6. 7. 8. 默认 9. 创建完成 三、UI界面设计&#xff1a; 1. 添加按钮 1. 2. 按钮界面 3. 按钮绑定快捷键 2. 文本框添加 1. 文本框字体 2. 默认文本 3. 文本对齐方式…

48、spfa求最短路

spfa求最短路 题目描述 给定一个n个点m条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c; 边权可能为负数。 请你求出1号点到n号点的最短距离&#xff0c;如果无法从1号点走到n号点&#xff0c;则输出impossible。 数据保证不存在负权回路。 输入格式 第一行包…

Linux多线程(二) 线程同步 信号量互斥锁读写锁条件变量

多个进程同时访问某些资源时&#xff0c;必须考虑同步问题&#xff0c;以确保任一时刻只有一个进程可以拥有对资源的独占式访问。通常&#xff0c;程序对关键资源的访问代码只是很短的一段&#xff0c;我们称这段代码为关键代码段或者临界区&#xff0c;对进程同步&#xff0c;…