今天的文章有点长,因为DNS不是几句话就能说完的,慢慢看吧。DNS(DomainNameSystem)域名系统是一种将某个URL解析成ip的服务。对于私有云方案,可以自己搭建一个DNS服务器,让所有的配置文件都以域名的形式存在,并实现自动化。部署的时候不需要因为不同的IP而改变太多的环境变量。是不是很方便?当然,如果你这样换掉别人首选的DNS服务器,转发一些网站流量,自己做个假网站骗别人密码什么的岂不是很好?PS:如果本节有不明白的术语,可以拉到最后阅读术语解释。DNS的基本概念。不管是开发还是运维,我都或多或少接触过DNS。一个域名是这样的,一个点击一个域,最多有四个域。电脑不管是ip还是域名!顶级域可分为三类:通用顶级域(.com商业组织、.org非营利组织、.net网络服务组织等)国家顶级域(.cn中国、.ukUK,.usUS,.jpJapan)反向域名(基础设施顶级域名,.arpa)如果我们自己注册一个域名,我们并不关心我们使用哪个顶级域名,这只是一个潜规则,让别人知道你的网站有什么用?我们一般都是在ICP申请二级域名。申请完之后,我们可以随意添加三级域名和四级域名,因为很多人拥有相同的顶级域名,申请了一个二级域名。然后你可以自己添加所有的三级和四级域名,它们都是你的。按照这个逻辑,域名系统就像一棵树。我们任何人都可以申请域名。以建站为例,我在腾讯云上申请的域名coding3min.com,一年要60元。域名解析的过程域名解析有很多种,www、@、*、mail、二级域名、手机网站对应不同的用途。在腾讯云上可以看到提示。通常以www为前缀的域名为主域名,但是输入起来比较麻烦。我将他重定向到coding3min.com,这是@方法。每个功能见上图。记录类型进一步分为以下类型。常用的类型是A类型,直接指向一个服务器的IP,CNAME类型指向另一个域名。比如我们可以搭建一个免费的博客会议,用github提供的声明网站服务提供一个域名进行传输,我们也可以用自己的域名解析到MX类型,搭建一个自己后缀的邮件服务器。下面是详细的域名解析过程,突出重点!这里的测试如上图所示。在浏览器中输入www.baidu.com域名,操作系统会先检查本地的hosts文件是否有这个URL映射关系。如果是,首先调用这个IP地址映射完成域名解析。如果在hosts中没有这个域名的映射,则去本地DNS解析器的缓存中查找是否有这样的URL映射关系。如果是,则直接返回,完成域名解析。如果主机与本地DNS解析器缓存之间没有对应的URL映射关系,它会先寻找TCP/IP参数中设置的首选DNS服务器。这里我们称之为本地DNS服务器。当本服务器收到查询时,如果查询是域名包含在本地配置区资源中,则将解析结果返回给客户端,完成域名解析,具有权威性。如果查询的域名没有被本地DNS服务器区域解析,但是服务器缓存了URL映射关系,调用这个IP地址映射完成域名解析,不具有权威性。如果本地DNS服务器的本地区域文件和缓存解析均无效,则根据本地DNS服务器的设置(是否设置转发器)进行查询。如果不使用转发方式,本地DNS会将请求发送给“根DNS服务器”,“根DNS服务器”收到请求后,会判断谁有权管理该域名(.com),并且会返回一个负责顶级域名服务器的IP,本地DNS服务器收到IP信息后,会联系负责.com域的服务器,负责.com域的服务器收到请求后,如果无法解析,它会寻找一个管理.com域的下级DNS服务器地址(baidu.com)到本地DNS服务器,本地DNS服务器收到这个地址后,会去寻找baidu.com域服务器,重复上述动作,查询直到找到www.baidu.com主机。如果采用转发方式,DNS服务器会将请求转发给上级DNS服务器,由上级服务器解析。如果上级服务器无法解析,则要么查找根DNS,要么将请求转发给上级。这个循环。不管是被本地DNS服务器使用,转发,还是roothints,最终都会将结果返回给本地DNS服务器,再由DNS服务器返回给客户端。DNS查询方式包括递归和迭代,解析方式包括正向解析和反向解析。原理我们都知道了,下面就来实践一下吧!搭建本地DNS服务器如果使用kubernetes部署服务,其kube-dns组件会自动做域名解析,从而自动使用服务间特定的名称规则完成服务发现。DNS只是一个协议,真正的服务是bind软件,所以现在安装:sudoyuminstallbind-utilsbindbind-chroot安装完成后,有几个目录或者文件需要记住:/etc/named.conf:mainconfigurationfile/etc/sysconfig/named:配置是否启动chroot及附加参数/var/named:数据库文件存放目录,存放主机名ip对应的文件/var/run/named:named程序时pid-file文件存放目录被执行(在ubuntu系统中,目录为/run/named)知道了这些重要的配置文件和目录后,下面开始配置。我们劫持baidu.com的流量试了一下。修改配置文件前的一个重要习惯是先复制一份。,以便在纠正错误后很容易恢复。更改主配置文件named.conf,找到对应的配置位置,改成我的listen-onport53{any;};listen-on-v6port53{any;};allow-query{any;};recursionyes;表示开放53号端口监听任意地址,允许所有主机访问我们,拒绝递归查询方式,采用迭代查询方式提高资源利用率。拉到最下面可以看到包含了配置文件,可以在里面定义正解(逆解)区域。包括“/etc/named.rfc1912.zones”;在/etc/named.rfc1912.zones底部添加以下内容。zone"baidu.com"IN{//一级域名为.com,二级域名为.baidutypemaster;//类型为主DNS服务器文件"named.baidu.com";//正确的解法文件是/var/named/named.baidu.com};修改/var/named/named.baidu.com文件如下,其中ip127.0.0.1可以改成你想要的。$TTL600;定义客户端缓存以下所有记录的时间@INSOAdns.yu.com.root.localhost(0;serial#序列号,用于判断主从dns是否为最新版本1H;refresh#每小时更新一次15M;retry#如果连接不上,15分钟后再尝试连接;expire#如果超过一个星期还是不能下载,则放弃下载3D);minimum#When客户端找服务器做dns解析,否定答案的缓存时间为3天@INNSdns.baidu.com.;NS记录表明dns服务器的SDQN为dns.baidu.com.dns.baidu.com.INA127.0.0.1;下面三个A记录表示www.baidu域内主机的IP地址。com.INA127.0.0.1ftpINA127.0.0.1重启服务,勾选SELinux并开启防火墙的dns服务systemctlrestartnamed#Restartservicesetenforce0#关闭SELinuxfirewall-cmd--add-service=dns#开启防火墙的dns服务修改DNS服务器指向在Linux中,DNS服务器指向的配置有一个固定的文件。以下文件有一个主服务器和一个备份服务器。DNS服务器设置好后,这个文件就变了。$cat/etc/resolv.confnameserver192.168.3.1nameserver114.114.114.114测试pingwww.baidu.comPINGwww.baidu.com(127.0.0.1)56(84)bytesofdata.64bytesfromVM-0-11-centos(127.0.0.1):icmp_seq=1ttl=64time=0.006ms64bytesfromVM-0-11-centos(127.0.0.1):icmp_seq=2ttl=64time=0.021ms^C---www.baidu.compingstatistics---2packetstransmitted,2received,0%packetloss,time999msrttmin/avg/max/mdev=0.006/0.013/0.021/0.008ms也可以使用nslookup查看域名的解析情况。如果你改变了新的DNS服务器的位置,你可以使用这个命令来查询。$nslookupcoding3min.com服务器:192.168.3.1地址:192.168.3.1#53非权威答案:coding3min.comcanonicalname=coding3min.com.cdn.dnsv1.com.coding3min.com.cdn.dnsv1.comcanonicalname=6yucorit.dispatch.spcdntip.com。名称:6yucorit.dispatch.spcdntip.com地址:112.67.251.116名称:6yucorit.dispatch.spcdntip.com地址:113.105.165.183名称:6yucorit.dispatch.spcdntip.com地址:113.96.98.77名称:6yucorit.dispatch1spcdntip.com地址7后的地址252.121Server是DNS服务器的地址。因为我用的是CDN,所以DNS解析多个地址。下面的Address,比如112.67.251.116,是真正的ipDNS协议,解析后运行在UDP协议上,所以使用的53在没有办法查询完整信息的时候,会用TCP协议重新查询。所以防火墙需要放开TCP和UDP的53端口。端口号可以在/etc/services文件中查看:cat/etc/services|grepdomaindomain53/tcp#name-domainserverdomain53/udpdomaintime9909/tcp#domaintimedomaintime9909/udp#domaintime术语解释DNS服务器:运行DNS服务器程序的计算机存储DNS数据库信息。DNS缓存:DNS服务器在解析客户端的域名请求时,如果本地没有该域名的记录,就会去询问其他DNS服务器。当其他域名将解析结果返回给DNS服务器时,DNS会在本地保存相应的记录。生成一个DNS缓存,客户端下次再次请求时,DNS服务器可以直接使用缓存中的DNS记录。DNS查询方式:递归查询和迭代查询。递归查询:当客户端向DNS服务器发起域名解析请求时,DNS服务器首先检查自己的DNS记录,如果没有,则向其他DNS服务器发起解析请求。迭代查询:当客户端向DNS服务器发起域名解析请求时,DNS服务器不会为客户端解析地址,而是告诉客户端另一台DNS服务器,客户端向该服务器发起地址解析请求。正向解析和反向解析正向解析:指从域名解析到IP地址的解析过程。反向解析:指从IP地址到域名的解析过程。参考https://www.cnblogs.com/Dy1an/p/11157152.htmlhttps://blog.csdn.net/weixin_41843699/article/details/90350077https://www.cnblogs.com/qingdaofu/p/7399670.htmlhttps://blog.csdn.net/crisdiano/article/details/104071227https://blog.csdn.net/Linjingke32/article/details/80993870本文转载自微信公众号“机智程序员熊”,大家可以使用以下二维码关注。转载本文请联系机智的程序员小熊公众号。
