DNS与服务器搭建-Linux每日一练(10)

今天的文章有点长,因为DNS三两句话说不完,容我慢慢道来。

DNS(Domain Name System)域名系统,也就是把某个网址解析成 ip 的服务,对于私有云的方案,有可能会自建 DNS 服务器,这样可以让所有的配置文件都以域名的形式存在,自动化部署的时候就不需要因为 ip 不同而改动太多的环境变量,是不是很方便?

当然了,这种方式如果你在替换了别人的首选DNS服务器,把一些网站流量转发过来,自己做一个假网站来骗别人的密码什么的,是不是很爽?

PS: 本节内容如有名词听不懂可以拉到最后看名词解释

DNS 基本概念

本节概念,如果已知可以直接跳到 搭建 DNS 服务器

其实不管是开发还是运维,多少都接触过DNS,一个域名长这样,一个点一个域,最多四个域,用域名也就是一个字符串来标记一个网址的方式,是为了让人更好记,计算机才不在乎是ip还是用域名呢!

顶级域又可以分为三类:

  1. 通用顶级域(.com 商业机构,.org 非营利性组织,.net 网络服务机构等)
  2. 国家顶级域(.cn 中国,.uk 英国,.us 美国,.jp 日本)
  3. 反向域(基础建设顶级域,.arpa)

我们如果自己注册一个域名,完全不用在乎用哪个顶级域名,只是一个潜规则,给别人知道大概你的网站可能有什么用,我们通常在ICP那里申请的域名是二级域名,申请下来以后就可以随意自己加三级、四级域名,因为很多人顶级域名是一样的,申请的是二级域名,然后所有的三级四级域名你都可以自己加,都属于你,按这种逻辑来看域名系统就像一颗树

我们任何人都可以申请域名,只要花几十块钱就可以用他来搭网站,比如我在腾讯云上申请的域名 coding3min.com 就是 60 块一年的。

域名解析的过程

域名解析有多种类型,www@*mail二级域名手机网站对应不同的用法。

可以在腾讯云上看到提示,通常www为前缀的是主域名,但是输入麻烦,我把他重定向到了coding3min.com上,也就是@方式,各个的作用看上图。

记录类型又分为下面这几种

常用的是A类型,直接指向一个服务器的 ip,CNAME类型是指向另一个域名,比如我们用github给我们提供的表态网站服务就可以搭建起来一个免费的博客会提供一个域名用来中转,我们也可以借助自己的域名来解析到MX类型,搭建自己后缀的邮件服务器。

下面是一个详细的域名解析过程,划重点!这里考试要考

如上图,

  1. 在浏览器中输入www.baidu.com域名,操作系统会先检查自己本地的hosts文件是否有这个网址映射关系,如果有,就先调用这个 IP 地址映射,完成域名解析。
  2. 如果hosts里没有这个域名的映射,则查找本地DNS解析器缓存,是否有这个网址映射关系,如果有,直接返回,完成域名解析。
  3. 如果hosts与本地DNS解析器缓存都没有相应的网址映射关系,首先会找TCP/IP参数中设置的首选DNS服务器,在此我们叫它本地 DNS 服务器,此服务器收到查询时,如果要查询的域名,包含在本地配置区域资源中,则返回解析结果给客户机,完成域名解析,此解析具有权威性。
  4. 如果要查询的域名,不由本地DNS服务器区域解析,但该服务器已缓存了此网址映射关系,则调用这个IP地址映射,完成域名解析,此解析不具有权威性。
  5. 如果本地DNS服务器本地区域文件与缓存解析都失效,则根据本地 DNS 服务器的设置(是否设置转发器)进行查询,如果未用转发模式,本地DNS就把请求发至 “根DNS服务器”,“根DNS服务器”收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器的一个 IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(baidu.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找baidu.com域服务器,重复上面的动作,进行查询,直至找到www.baidu.com主机。
  6. 如果用的是转发模式,此DNS服务器就会把请求转发至上一级DNS服务器,由上一级服务器进行解析,上一级服务器如果不能解析,或找根 DNS 或把转请求转至上上级,以此循环。

不管是本地 DNS 服务器用还是转发,还是根提示,最后都是把结果返回给本地 DNS 服务器,由此 DNS 服务器再返回给客户机。

DNS 查询方式包含递归和迭代,解析方式包含正向解析和反向解析。我们知道了原理,实战一下看看吧!

搭建本地 DNS 服务器

如果你用的是kubernetes来部署服务,他的kube-dns组件会自动做好域名解析,让服务和服务之间用特定的名称规则自动完成服务发现。

DNS 只是一种协议,真正提供服务的是 bind 软件,因此,现在来安装它:

sudo yum install bind-utils bind bind-chroot

安装后有几个目录或文件是需要记得的:

  • /etc/named.conf: 主配置文件
  • /etc/sysconfig/named: 配置是否启动 chroot 及额外的参数
  • /var/named: 数据库文件存放目录,存放主机名对应 ip 的文件
  • /var/run/named: named 程序执行时 pid-file 文件存放目录(在 ubuntu 系统中,目录为/run/named)

知道了这几个重要配置文件和目录后,下面开始配置,我们把baidu.com的流量劫持了试试看

修改配置文件前一个重要习惯是先复制一份,这样改错了方便恢复。

改主配置文件 named.conf,找到相应的配置位置,改成我这个

listen-on port 53 { any; };
listen-on-v6 port 53 { any; };
allow-query     { any; };
recursion yes;

意思是开放 53 号端口对于任意地址的监听,允许所有主机对我们进行访问,拒绝递归查询方式,使用迭代查询方式,增加资源利用率。

拉到底部可以看到 include 了这个配置文件,你可以在里面对正解(反解)区域进行定义。

include "/etc/named.rfc1912.zones";

/etc/named.rfc1912.zones底部添加如下内容。

zone "baidu.com" IN {           //一级域名为.com、二级域名为.baidu
         type master;               //类型为主DNS服务器
         file "named.baidu.com";    //指向正解文件为/var/named/named.baidu.com
};

修改/var/named/named.baidu.com文件如下,其中127.0.0.1这个 ip 你可以改成你想要的。

$TTL 600 ;定义下列所有记录缓存在客户端的时间
@       IN SOA dns.yu.com. root.localhost (
                                         0       ; serial       #序列号,用于主从dns中判断是否为最新版本
                                         1H      ; refresh      #一小时更新一次
                                         15M     ; retry        #若连接不上,等待15分钟后重新尝试连接
                                         1W      ; expire       #超过一周仍无法下载便放弃下载
                                         3D )    ; minimum      #客户端找服务端做dns解析时,否定答案的缓存时间为3天
@       IN      NS      dns.baidu.com.           ; NS记录表明了dns服务器的SDQN为dns.baidu.com.
dns.baidu.com.     IN      A       127.0.0.1     ; 下面三条A记录表明了域内主机的IP地址
www.baidu.com.     IN      A       127.0.0.1
ftp             IN      A       127.0.0.1

重启服务,检查 SELinux 并开启防火墙的 dns 服务

systemctl restart named  #重启服务
setenforce 0   #关闭SELinux
firewall-cmd --add-service=dns #开启防火墙的dns服务

修改 DNS 服务器指向

linux中,DNS服务器指向的配置有固定的文件,如下文件就有一个主服务器,一个备服务器,等搭建好DNS服务器后就是改这个文件。

$ cat /etc/resolv.conf
nameserver 192.168.3.1
nameserver 114.114.114.114

测试

ping www.baidu.com
PING www.baidu.com (127.0.0.1) 56(84) bytes of data.
64 bytes from VM-0-11-centos (127.0.0.1): icmp_seq=1 ttl=64 time=0.006 ms
64 bytes from VM-0-11-centos (127.0.0.1): icmp_seq=2 ttl=64 time=0.021 ms
^C
--- www.baidu.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.006/0.013/0.021/0.008 ms

也可以用nslookup来查看域名的解析,如果改完了新的DNS服务器的位置就可以用这个命令来查询。

$ nslookup coding3min.com
Server:  192.168.3.1
Address: 192.168.3.1#53

Non-authoritative answer:
coding3min.com canonical name = coding3min.com.cdn.dnsv1.com.
coding3min.com.cdn.dnsv1.com canonical name = 6yucorit.dispatch.spcdntip.com.
Name: 6yucorit.dispatch.spcdntip.com
Address: 112.67.251.116
Name: 6yucorit.dispatch.spcdntip.com
Address: 113.105.165.183
Name: 6yucorit.dispatch.spcdntip.com
Address: 113.96.98.77
Name: 6yucorit.dispatch.spcdntip.com
Address: 125.78.252.121
  • Server 后的就是DNS服务器的地址
  • 因为我用了CDN,所以DNS解析出了多个地址,下面的Address比如112.67.251.116就是解析出来的真实ip

DNS协议运行在UDP协议之上,因此使用的53号端口,当没有办法查询到完整的信息时,就会再次以 TCP 协议来查询,因此,防火墙需要放行TCPUDP的 53 号端口,端口号可以在/etc/services文件查看到:

cat /etc/services  | grep domain
domain          53/tcp                          # name-domain server
domain          53/udp
domaintime      9909/tcp                # domaintime
domaintime      9909/udp                # domaintime

名词解释

DNS 服务器:运行 DNS 服务器程序的计算机,存储 DNS 数据库信息。

DNS 缓存:DNS 服务器在解析客户机的域名请求时,如果本地没有该域名的记录,则会询问其它 DNS 服务器,当其它域名将解析结果返回给 DNS 服务器时,DNS 将对应的记录保存在本地,生成 DNS 缓存,当下一次客户机再次请求时,DNS 服务器则可以直接使用缓存中的 DNS 记录。

DNS 查询方式:递归查询和迭代查询

递归查询:当客户机向 DNS 服务器发起域名解析请求时,DNS 服务器首先查看自己本机的 DNS 记录,如果没有则会向其它 DNS 服务器发起解析请求。迭代查询:当客户机向 DNS 服务器发起域名解析请求时,DNS 服务器不会给客户机解析地址,而是告诉客户机另外一台 DNS 服务器,客户机再向这台服务器发起地址解析请求。

正向解析和反向解析正向解析:指域名解析到 IP 地址的解析过程。反向解析:指 IP 地址解析到域名的解析过程。

课后问题

这里我只是做了A记录的正解到www前缀的域名,你还可以自己实现任意一个其他的吗?比如A记录的@解析,试试看吧!

引用

https://www.cnblogs.com/Dy1an/p/11157152.html

https://blog.csdn.net/weixin_41843699/article/details/90350077

https://www.cnblogs.com/qingdaofu/p/7399670.html

https://blog.csdn.net/crisdiano/article/details/104071227

https://blog.csdn.net/Linjingke32/article/details/80993870

原文地址:https://cloud.tencent.com/developer/article/1734867

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、信号(signal)、消息队列、共享内存、信号量、套接字(socket)。管道用于具有亲缘关系的进程间通信,有名管道的每个管道具有名字,使没有亲缘关系的进程间也可以通信。信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别对整个系统的性能做统计,而进程级别则具体到进程,为每个进程维护统计信息。

按实现原理分,可分为基于计数器和跟踪以及剖析。含义如下:

计数器:内核维护的统计数据,通常为无符号整型,用于对发生的事件计数,比如,网络包接收计数器,磁
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书验证,详细追踪整个交互过程,可用于调用网络后端接口,诊断http和https网络服务故障。
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满、fd泄漏等问题。命令包括ping、fping、tcpdump、lsof、netstat、/proc/$pid/fd、du、grep、traceroute、dig。
linux的平均负载表示运行态和就绪态及不可中断状态(正在io)的进程数目,用uptime查看到负载很高,既有可能是CPU利用率高,也可能是大量在等待io的进程导致,用mpstat查看每个CPU的使用情况,查看CPU的使用率或者CPU花在等待io的时间,接着用pidstat定位具体的进程
CPU上下文频繁切换会导致系统性能下降,切换分为进程切换、线程切换及中断切换,进程切换的开销较大,除了需要保存寄存器和程序计数器中的值还需保存全局变量、栈等到内存中,以便下次运行恢复,而同一进程中的线程切换开销会小很多,只需更新寄存器和线程独有的栈,共享资源如打开的文件、全局变量等无需切换,当硬件中
1.top命令 作用:该命令可以按CPU使用.内存使用和执行时间对任务进行排序,常用来监控系统中占用CPU或内存较高的程序及CPU和内存的负载。 默认视图: 当想看系统负载时,可观察汇总的%CPU中的us用户进程和sy系统进程是否占用CPU很高,相加接近100%就说明占用很高了,有些程序可能得不到及
文章浏览阅读1.8k次,点赞63次,收藏54次。Linux下的目录权限!!!粘滞位!!!超详解!!!
文章浏览阅读1.6k次,点赞44次,收藏38次。关于Qt的安装、Windows、Linux、MacBook_mack book 安装qt
本文介绍了使用shell脚本编写一个 Hello
文章浏览阅读1.5k次,点赞37次,收藏43次。【Linux】初识Linux——了解操作系统的发展历史以及初次体验Linux编程环境
文章浏览阅读3k次,点赞34次,收藏156次。Linux超详细笔记,个人学习时很认真的记录的,觉得好的麻烦点个赞。
文章浏览阅读6.8k次,点赞109次,收藏114次。【Linux】 OpenSSH_9.3p1 升级到 OpenSSH_9.5p1(亲测无问题,建议收藏)_openssh_9.5p1
文章浏览阅读3.5k次,点赞93次,收藏78次。初识Linux中的线程,理解线程的各种概念,理解进程地址空间中的页表转换,介绍pthread线程库并理解线程库!
文章浏览阅读863次。出现此问题为Linux文件权限问题,解决方案为回到引擎目录执行命令。输入用户密码后运行./UnrealEditor。_increasing per-process limit of core file size to infinity.
文章浏览阅读2.9k次。使用文本编辑器:打开CSV文件,并使用文本编辑器(如Notepad++、Sublime Text、Visual Studio Code等)来查看文件的字符编码格式。通常在编辑器的底部状态栏或设置中可以找到当前编码的显示。请注意,上述方法并非绝对准确,特别是当文件没有明确的编码标识时。因此,如果你发现CSV文件在不同的工具或方法中显示不同的编码格式,可能需要进行进一步的分析和判断,或者尝试使用不同的编码转换方法。该命令将输出文件的MIME类型和编码信息。使用命令行工具:在命令行中,你可以使用。_shell读取csv文件逐行处理
本文介绍了如何在Linux系统中升级gcc版本,以便更好地支持C++11及以上版本的新特性。通过升级gcc,可以提升编译器的功能和性能,获得更好的开发体验。详细的步骤和方法请参考原文链接。
文章浏览阅读4.4k次,点赞6次,收藏19次。Mosquitto是一个开源的MQTT消息代理服务器。MQTT是一个轻量级的、基于发布/订阅模式的消息传输协议。 mosquitto的安装使用比较简单,可以方便的来进行一些测试。_linux mosquitto
文章浏览阅读7.2k次,点赞2次,收藏12次。Linux中,用于根目录下有一个.ssh目录,保存了ssh相关的key和一些记录文件。_~/.ssh/
文章浏览阅读4.5k次,点赞5次,收藏18次。首先需要安装 snmp ,使用下面的命令进行安装安装完毕之后,使用下面的命令查看是否安装成功当命令行显示如图即为安装成功。_snmp工具