DNS域名解析
什么叫DNS? DNS domain name system 域名系统 ============================================================================= 问题1: 为什么要有名字? 答:就像人要取名字一样,为了区分个体(人,计算机等) ============================================================================= 问题2: 域名和主机名(计算机名)的区别? 答:域名是公网的名字,唯一的,要花钱买的 主机名是内网的名字,可以一样(但一般傻子才这么做),不要花钱买 ============================================================================= 问题3: 公网不是有ip可以区分吗,为什么还要域名? 答: ip地址不好记忆,所以才用域名对应ip地址,因为域名好记忆(dns就是为了通过域名解析ip而生的) ============================================================================= 问题4: linux下/etc/resolv.conf配置文件和/etc/hosts配置文件的区别? 答案: # vim /etc/nsswitch.conf hosts: files dns --涉及到名称翻译的都会先查找/etc/hosts,再查找DNS(/etc/resolv.conf里面的nameserver指向) 结论:/etc/hosts文件相当于是一个内网的dns,一般只做内网主机名和内网ip之间的绑定 ============================================================================= DNS服务器 特点: 1,分布式的数据库 2,解决了数据不一致,避免了名字冲突 3,有缓存机制,提高了性能和可靠性 查询方式:递归查询,迭代查询 DNS 全世界有13台根域服务器 .com .org .edu .gov .net .mil .info 商业 组织 教育 政府 通迅 军事 信息 根 cn hk us jp tw in .com.cn .net.us .edu.cn 根 | | 中国 USA | | | | 大运营商 us大运营商 | | | | 小运营商 us大运营商 | | | | | | 自己的DNS服务器 US电信 | | | | daniel.com.cn. x.x.x.x abc.com.us. 问题: 上图中daniel在小运营商申请了域名,自己搭DNS服务器,请问如何与运营商联系起来(意思就是说,域名的查询怎样才能转到你自己搭的DNS服务器) 问题: 如果上面的DNS服务器做好了,全世界的任意一个访问点如何能访问到你的这个DNS服务器里的域名? 问题: 上图中DNS服务器里除了自己的域名和IP对应,能否写上qq.com这个域和IP的对应呢? ============================================================================= bind (berkeley internet name domain) 服务端: 准备一台新虚拟机,配置好yum(桥接网络,我这里的实验机ip为10.1.1.2) 第一步:安装 # yum install bind\* -y 安装服务 协议端口: tcp/udp 53 查询DNS记录只使用udp 53端口 主DNS服务器和备DNS服务器之间的数据同步使用tcp 53端口 第二步:配置 配置步骤: 1,编辑named.conf --记录你的域和域对应的数据文件在哪 2, 编辑zone区域文件 --就是数据文件,记录域名和IP的对应 # vim /etc/named.conf options { listen-on port 53 { any; }; --改为any,表示监听所有 listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { any; }; --改为any,表示所有人能查询这台服务器 recursion yes; dnssec-enable yes; dnssec-validation yes; dnssec-lookaside auto; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; #include "/etc/named.rfc1912.zones"; --注释子配置文件定义,我们这里直接配置到主配置文件里就好了 include "/etc/named.root.key"; 在文本的最后编写一个域名: zone "cluster.com" IN { type master; file "data/master.cluster.com.zone"; }; # vim /var/named/data/master.cluster.com.zone 编写一个配置文件 $TTL 3600 @ IN SOA sdfsadfas. zhangsan. ( 2017121501 --版本号,下面的是各种时间,如果不做主从结构,这些随便写 30 60 90 3600 ) IN NS 10.1.1.2. --这里就是DNS服务器的IP(实际应该是公网IP,但这里是内网环境,所以写的内网IP),但记得加点,也可以写DNS服务器的外网域名;并且这里可以写多个NS,代表了你公司的多台DNS服务器 mail IN A 1.1.1.1 --A记录就是真正的数据,这里代表了mail.cluster.com的公网地址为1.1.1.1 bbs IN A 2.2.2.2 sports IN A 3.3.3.3 news IN A 4.4.4.4 第三步:启动服务 # /etc/init.d/named restart --centos7上使用systemctl restart named service named restart --SOA Start Of Authority --NS Name Server --A Address 第四步:客户端测试(客户端测试) 再找一台机器,把dns指向刚刚配置的dns服务器,进行测试 # yum install bind-utils --客户端先确认安装查询命令的软件包 # vim /etc/resolv.conf 把服务端的ip绑定过来,写在最前面 nameserver 10.1.1.2 # nslookup mail.cluster.com Server: 10.1.1.2 Address: 10.1.1.2#53 Name: mail.cluster.com Address: 1.1.1.1 # nslookup bbs.cluster.com Server: 10.1.1.2 Address: 10.1.1.2#53 Name: bbs.cluster.com Address: 2.2.2.2 # dig bbs.cluster.com # host bbs.cluster.com ============================================================================= 例二,使用DNS的轮循(轮叫)(round-robin)实现简单的负载均衡 (一个域名对应多个IP) 属于一种基本的负载均衡(load balance) 课后网上查询CDN DNS轮循相对于其它的负载均衡软件来说: 优点:配置简单,成本低 缺点:没有后台健康检查,算法单一,因为DNS的缓存,会影响你修改DNS调度的生效速度 client | DNS服务器 | | www.cluster.com web1 web2 web3 # vim /var/named/data/master.cluster.com.zone $TTL 86400 @ IN SOA 10.1.1.2. cluster. ( 2017121501 10 20 30 86400 ) IN NS 10.1.1.2. web IN A 1.1.1.1 web IN A 1.1.1.2 web IN A 1.1.1.3 --对web记录再绑定两个IP ============================================================================= 例三:CNAME记录的使用 (一个IP对应多个域名) # vim /var/named/data/master.cluster.com.zone $TTL 86400 @ IN SOA 10.1.1.2. daniel. ( 2017121501 10 20 30 86400 ) IN NS 10.1.1.2. www IN CNAME venus venus IN CNAME mars mars IN CNAME earth earth IN CNAME web --这里加了几个cname记录 web IN A 1.1.1.1 web IN A 1.1.1.2 web IN A 1.1.1.3 mail IN A 2.2.2.2 # /etc/init.d/named reload # nslookup web.cluster.com --客户端验证 Server: 10.1.1.2 Address: 10.1.1.2#53 www.cluster.com canonical name = venus.cluster.com. venus.cluster.com canonical name = mars.cluster.com. mars.cluster.com canonical name = earth.cluster.com. earth.cluster.com canonical name = web.cluster.com. Name: web.cluster.com Address: 1.1.1.3 Name: web.cluster.com Address: 1.1.1.1 Name: web.cluster.com Address: 1.1.1.2 ============================================================================= 例四:辅助DNS服务器(从DNS服务器)的配置 10.1.1.2 10.1.1.3 主 ---- 从 type master type slave zone文件 被动的从主传过来zone文件 两台服务器的准备工作: 1,主机名三步 2,时间同步 3,iptables,selinux关闭 4,yum配置好 第一步: 主dns服务器的配置(这里省略,参照前面的例子) 第二步: 在从服务器上安装bind软件包 # yum install bind* -y # vim /etc/named.conf --打开此文件,和主的配法一样 options { listen-on port 53 { any; }; --改为any 全网监听 listen-on-v6 port 53 { ::1; }; directory "/var/named"; dump-file "/var/named/data/cache_dump.db"; statistics-file "/var/named/data/named_stats.txt"; memstatistics-file "/var/named/data/named_mem_stats.txt"; allow-query { any; }; --改为any recursion yes; dnssec-enable yes; dnssec-validation yes; dnssec-lookaside auto; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; }; logging { channel default_debug { file "data/named.run"; severity dynamic; }; }; zone "." IN { type hint; file "named.ca"; }; #include "/etc/named.rfc1912.zones"; 注释掉 include "/etc/named.root.key"; zone "cluster.com" IN { type slave; --类型定义为slave file "slaves/slave.cluster.com.zone"; --最好把zone文件定义到slaves目录下; masters { 10.1.1.2; }; --指定主DNS服务器的IP地址 }; 第三步:启动dns从服务器 # /etc/init.d/named restart --在从上启动named服务(centos7使用systemctl restart named) 第四步:验证 # ls /var/named/slaves/ --再次查看发现是主上面下载过来了 slave.cluster.com.zone 如果不能下载过来: 查看网络是否连通,就是ping一下 查看iptables,selinux是否关闭 时间是否同步等 tail /var/log/messages --或者查看日志也可以看到相关的日志内容 ============================================================================= 例九:验证主DNS到从DNS的更新 1,更新主服务器的区域文件的记录,注意,加大版本号 vim /var/named/chroot/var/named/data/master.cluster.com.zone 随便添加一条记录,然后增大版本号的数字,最好把刷新时间改小点(比如60秒) 2,/etc/init.d/named restart --重启服务 3,在从域名服务器这里查看 1,直接删除/var/named/chroot/var/named/slaves/slave.cluster.com.zone 文件 然后重启服务 2,从DNS服务器什么都不用做,用watch tail /var/log/messages查看日志看是否能够自动更新过来 --或者使用tail -f来查看 --上面看到这样的同步机制很慢,如果主服务器更新了大量记录,而从服务器还没有同步过去时,主服务器就崩溃了,则就会造成数据的不一致 --所以可以用脚本或程序开发或共享存储等技术实现同步更新就可以了,不一定要使用它自带的refresh功能 ============================================================================= 附录: 其它的一些应用 例:反向解析 IP解析为域名 --比如我们使用公司的一台内部机器,可以模拟zhangsan@126.com去给另一个lisi@qq.com发邮件; 那么qq如何知道你发的这封邮件是真的从126来的呢? --通过反向解析(IP解析为域名)就可以判别 第一步:主配置文件添加以下区域: # vim /etc/named.rfc1912.zones zone "1.1.10.in-addr.arpa" IN { type master; file "data/master.1.1.10.in-addr.arpa.zone"; }; --我这里做的是一个内网网段,在这里只是实验 第二步:建立区域数据文件 # vim /var/named/data/master.1.1.10.in-addr.arpa.zone $TTL 86400 @ IN SOA sdfsfd. sdfsda. ( 2013011101 30 40 50 86400 ) IN NS 10.1.1.2. 10 IN PTR dns.cluster.com. --10.1.1.2这个IP被反向解析为dns.cluster.com # /etc/init.d/named restart 重启服务 # nslookup 10.1.1.2 Server: 10.1.1.2 Address: 10.1.1.2#53 10.1.1.2.in-addr.arpa name = dns.cluster.com. 例:实现直接对域的解析 # vim /var/named/data/master.cluster.com.zone cluster.com. IN A 3.3.3.3 # /etc/init.d/named reload # nslookup cluster.com Server: 10.1.1.2 Address: 10.1.1.2#53 Name: cluster.com Address: 3.3.3.3 ============================================================================= 例:使用通配符实现泛解析 * IN A 4.4.4.4 # nslookup sdfasfsasdfsad.cluster.com Server: 10.1.1.2 Address: 10.1.1.2#53 Name: sdfasfsasdfsad.cluster.com Address: 4.4.4.4 ============================================================================= 例七:实现连接范围域名解析 实现station1~station254.cluster.com 与10.1.1.1~10.1.1.254的对应 正向DNS的写法 # vim /var/named/data/master.cluster.com.zone $GENERATE 1-254 station$ IN A 10.1.1.$ /etc/init.d/named reload 测试: nslookup 测试 反向DNS的写法 # vim /var/named/data/master.1.1.10.in-addr.arpa.zone $GENERATE 1-254 $ IN PTR station$.cluster.com. 测试: nslookup 测试 ============================================================================= 例:转发服务器的设置 前面所做的全是一个域的情况,也就是我只能解析cluster.com这一个域,如果想要解析另外一个域 方法一:在named.conf里再写一个域 然后再配置一个对应zone数据文件 重启服务 方法二:做转发 单域转发 1,named.conf里加上下面一段 zone "man.com" IN { type forward; forwarders { 10.1.1.127; }; }; /etc/init.d/named restart [root@li ~]# nslookup station171.man.com --查找能查出来,是因为127的DNS服务器的zone文件里有,我这里转发过去查找到结果,再返回过来 Server: 10.1.1.45 Address: 10.1.1.45#53 Non-authoritative answer: Name: station171.man.com Address: 10.1.1.171 2,完全转发 options { directory "/var/named"; forwarders { 10.1.1.1; }; --这是写到options里的完全转发,指的是本机的zone文件查不到的情况,会去查找10.1.1.1,都查不到才会返回错误 }; options { directory "/var/named"; forwarders { 10.1.1.127;10.1.1.199; }; --可以用分号隔开,写多个转发服务器的IP }; --在rhel6.3上测试的转发,不管是单域还是全局转发,都要把下面的这个参数改为no,才可以成功 dnssec-validation no; ============================================================================= 例:缓存dns服务器 如果你的DNS服务器就按上面的例子来配置一个cluster.com这个域; 如果你的公司内网用户,把DNS不去指向外网,而用内网地址指向你的DNS服务器去查baidu,youku,sina等域名,会是什么情况? 情况一:如果DNS服务器有一个能出去的外网网关,那么内网用户也可以查询到除了cluster.com之外的域名 情况二:没有网关,则不行; 但在去掉网关之前,你查过的域名还是可以,因为有缓存 情况三:或者你做了转发服务器,转发给外网或者转发给一个有外网网关的DNS服务器都可以 --DNS服务器缓存的清除方法rndc flush 怎么做一个only cache的DNS服务器? 一个DNS管理一个域或不管理域,然后加一个能出去的外网网关就OK。 子域 baidu.com news.baidu.com tieba.baidu.com us.news.baidu.com sports.tieba.baidu.com cn.news.baidu.com miltary.tieba.baidu.com