文章作者:luxianghao

文章来源:http://www.cnblogs.com/luxianghao/p/6189633.html  转载请注明,谢谢合作。

免责声明:文章内容仅代表个人观点,如有不当,欢迎指正。

---

为什么会有DNS?

在internet的世界里最早是只有IP的,这就要求人们人们去浏览一些站点的时候必须记住对应的IP地址,

但人们对数字的记忆能力显然不怎么样,这样就催生出了DNS的服务,借助于这个服务,人们可以给一些

IP地址起个名字,如给111.13.101.208起个外号叫baidu.com, 这样人们访问baidu.com跟访问

111.13.101.208是一个效果;但是DNS服务也不是完全没有坏处,首先人们需要维护这样一个服务,增加

了维护成本,然后现在有的服务架构中对DNS是强依赖的,如果DNS不可用,对应的服务也将不可用。

DNS的正解和反解

正解:由主机名查到IP

反解:由IP查询主机名

不管正解和反解,每个领域的所有记录就是一个域,如example.net就是一个域

DNS Linux环境下的配置

存放位置: /etc/resolv.conf

内容:

search example.net

nameserver 10.118.6.6
nameserver 10.118.7.6

其中example.net是默认的域,比如nslookup web1 = nslookup web1.example.net

10.118.6.6是DNS server的IP地址

常用的DNS查询的命令

ping:

是个一个简单的丢包诊断工具,主机查询是顺带的作用, ping会使用一切的方式去解析主机名或者ip,
缓存 /etc/hosts 等,这可能取决于你的配置和操作系统,在去向dns server查询之前,ping会首先
使用如/etc/hosts 缓存等其他方式
 
host, nslookup, dig是专门用来做DNS查询的,简单列几个使用示例
host web1
nslookup web1
nslookup web1 10.118.6.6        # 指定DNS server来查询
dig web1
dig web1 @10.118.6.6             # 指定DNS server来查询,可绕过缓存
dig +short web1                      #仅获取IP地址
dig +trace web1.example.net    #获取递归过程的查询结果
dig -x 192.168.10.32               #反解得到域名
 
由于DNS是层层托管的方式,查询的时候也是递归的查询,比如查询web1.example.net需要先访问域为
.net的DNS server,由此查询到example.net的DNS server,最终查询到web1.example.net对应的记录
 
比起nslookup,我更喜欢dig,因为dig出来的信息比nslookup出来的信息更加翔实,如用dig出来的信息包含
TTL:DNS缓存时间
query time:查询时间,这对于DNS server查询慢的时候的故障排查很重要
SERVER:查询访问的DNS server
 
对于具体的报错信息,举例如下
nslookup返回的结果:server can't find www.example.net: REFUSED
dig返回的结果: WARNING: recursion requested but not available
从两种返回结果我们都可以看出,DNS server已经正常启动并能够响应,不过请求被拒绝了,
但是从dig的请求中我们还可以看出,请求被拒绝的原因是递归的请求不可用

[root@test.bj ~]# dig baidu.com
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.10.rc1.el6_3.5 <<>> baidu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 63255
;; flags: qr rd ra; QUERY: 1, ANSWER: 4, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;baidu.com. IN A

;; ANSWER SECTION:
baidu.com. 35 IN A 111.13.101.208
baidu.com. 35 IN A 123.125.114.144
baidu.com. 35 IN A 180.149.132.47
baidu.com. 35 IN A 220.181.57.217

;; Query time: 34 msec
;; SERVER: 10.118.6.6#53(10.108.6.6)
;; WHEN: Sat Dec 17 13:36:43 2016
;; MSG SIZE rcvd: 91

[root@test.bj ~]# nslookup baidu.com

Server: 10.118.6.6
Address: 10.118.6.6#53

Non-authoritative answer:
Name: baidu.com
Address: 111.13.101.208
Name: baidu.com
Address: 123.125.114.144
Name: baidu.com
Address: 180.149.132.47
Name: baidu.com
Address: 220.181.57.217

关于递归查询

很多组织为了安全起见,都严格限制了能够像他们发起递归查询的主机

相关配置的所在地址:

/etc/bind/named.conf

具体的配置示例:

options {

recursion no;

...

}

options {

allown-recursion {10.1.1.0/24}; #10.1.1.0整个子网可以

...

}

acl "internel" {127.0.0.1; 10.1.1.0/24;};

options {

allown-recursion {"internel"}; #以上acl中的IP可以

...

}

关于DNS缓存

作用:

1) 可以更快速的响应查询请求

2)可以减轻DNS server负载,所以有些DNS server会直接忽略掉特别小的TTL,然后重写一个合理的值

但是DNS缓存也会造成自己的更改迟迟不能生效等问题

除了DNS server有缓存,如下的情况也能造成DNS缓存,当有DNS server调整的时候要格外关注,以避免不必要的损失

JAVA:由于 Java缓存的原因,可能会导致JAVA进程不会使用系统中新的 DNS服务配置,导致期间出现解析失败的情况。

Java对dns 的缓存默认是forever, refer to http://docs.oracle.com/javase/7/docs/technotes/guides/net/properties.html

解决方法:重启Java进程

操作系统:

在Linux中,nscd daemon会处理这类缓存

解决方法:/etc/init.d/nscd restart

DNS server:
解决方法:/etc/init.d/named restart

其他的解决方法:绑定/etc/hosts

提示:在实际的生产环境中,并不建议绑定/etc/hosts,另外这种绑定仅支持A记录,并不支持CNAME

如果你并不着急,可以慢慢等缓存失效

但如果你等待的时间已经超出缓存时间,修改仍不生效,那可能是

1)修改后的配置有语法错误,DNS server会自动忽略错误的配置,继续使用上次ok的配置,可以查syslog或message查相关的报错信息

2)主DNS server的更改没能同步到slave的DNS server,原因可能是,中间网络的问题;salve没配置相关的主server, 拒绝了更新通知;

slave server的版本号大于主的待更新的版本号

另外在实际的生产环境中DNS 的生效时间直接决定了工作效率,故障时间等,所以能够寻求快速的使DNS修改生效的方式也是造福一类的一件事,

不断探索中。。。

漫谈DNS的更多相关文章

  1. dns泛解析漫谈

    比如说:http://www.aaa.com/ 指向10.10.1.1,ftp.aaa.com/ 指向10.10.2.2,如果这时候客户访问的是aaa.com或者error.aaa.com (这里er ...

  2. 计算机网络漫谈之OSI七层模型和TCP/IP四层模型

    在 什么是网络? 中,你已经知道计算机网络是物理连接的"局域网"和工作于这个局域网上的"网络协议",并且我们的重心是网络协议.有关网络协议,按照目前的分层方式主 ...

  3. 6.DNS公司PC访问外网的设置 + 主DNS服务器和辅助DNS服务器的配置

    网站部署之~Windows Server | 本地部署 http://www.cnblogs.com/dunitian/p/4822808.html#iis DNS服务器部署不清楚的可以看上一篇:ht ...

  4. 【道德经】漫谈实体、对象、DTO及AutoMapper的使用

    写在前面 实体和值对象 实体和对象 故常无欲以观其妙,常有欲以观其徼 初始实体和演化实体 代码中的DTO AutoMapper实体转换 后记 实体(Entity).对象(Object).DTO(Dat ...

  5. CSS实现水平|垂直居中漫谈

    利用CSS进行元素的水平居中,比较简单,手到擒来:行级元素设置其父元素的text-align center,块级元素设置其本身的left 和 right margins为auto即可.而撸起垂直居中, ...

  6. Liunx下配置DNS服务

    当Ping 主机名时可以映射出该主机的IP地址,反之亦然.配置并指定DNS服务器可以快速部署集群,不需要每台主机都去修改HOSTS文件即可实现IP与主机名的相互解析.而在Linux下的DNS是用bin ...

  7. ★Kali信息收集~4.DNS系列

    ★.1host:DNS信息 参数: 一般情况下,host查找的是A,AAAA,和MX的记录 案例: DNS服务器查询  host -t ns 域名 A记录和MX记录查询  host 域名(host - ...

  8. Node.js:DNS模块的使用

    Nodejs的DNS模块包涵有关DNS查询和操作的方法,下面介绍该模块的基本用法以及实现一个DNS查询小工具. 1.获取DNS服务器地址 使用getServers方法,该方法返回一个IP地址组成的数组 ...

  9. Java DNS查询内部实现

    源码分析 在Java中,DNS相关的操作都是通过通过InetAddress提供的API实现的.比如查询域名对应的IP地址: String dottedQuadIpAddress = InetAddre ...

随机推荐

  1. Round #322 (Div. 2) 581D Three Logos (模拟)

    先枚举两个矩形,每个矩形横着放或竖着放,把一边拼起来, 如果不是拼起来有缺口就尝试用第三个矩形去补. 如果没有缺口就横着竖着枚举一下第三个矩形和合并的矩形x或y拼接. #include<bits ...

  2. UVA Planning mobile robot on Tree树上的机器人(状态压缩+bfs)

    用(x,s)表示一个状态,x表示机器人的位置,s表示其他位置有没有物体.用个fa数组和act数组记录和打印路径,转移的时候判断一下是不是机器人在动. #include<bits/stdc++.h ...

  3. CF Gym 100463D Evil (二维前缀和+离散)

    题意:给一些带颜色的点,求一个最小的矩形,恰好包括一半的红色点,且不包括蓝色点. 题解:暴力,求个二维前缀和,用容斥原理更新一下.N很小所以我采用了离散优化,跑了个0ms. 之前没写过二维前缀和,加上 ...

  4. [手势识别] CNN + OpenCV 手势识别记录

    这几天没事,想着再学点一些视觉识别方向的东西,因为之前做了验证码识别,有了机器学习的信心,因此这次打算做个手势识别,参考了很多网上的图像处理方式,中间也遇到了很多问题,最终算是做出来了吧. 1.训练集 ...

  5. 组件的通信 :provide / inject 对象进入后,就等于不用props,然后内部对象,直接复制可以接受数组,属性不能直接复制,可以用Object.assgin覆盖对象,或者Vue的set 双向绑定数据

    组件的通信 :provide / inject 对象进入后,就等于不用props,然后内部对象,直接复制可以接受数组,属性不能直接复制,可以用Object.assgin覆盖对象,或者Vue的set 双 ...

  6. 使用Python生成ASCII字符画

    使用Python生成ASCII字符画 在很多的网站主页中或者程序的注释中会有一些好看的字符注释画.显得很牛逼的样子 例如: 知乎 _____ _____ _____ _____ /\ \ /\ \ / ...

  7. linux基本命令及使用方法

    shell环境: shell:命令解释器,是Linux 系统的用户界面,提供了用户与内核进行交互操作的一种接口,它接收用户输入的命令并把它送入内核去执行. bash:是GNU 计划中重要的工具软件之一 ...

  8. Virt-install用法:

       #一般选项:指定虚拟机的名称.内存大小.VCPU个数及特性等 -n  NAME,  --name=NAME:虚拟机名称,需全局惟一: -r  MEMORY,  --ram=MEMORY:虚拟机内 ...

  9. RabbitMQ学习(二):Java使用RabbitMQ要点知识

    转  https://blog.csdn.net/leixiaotao_java/article/details/78924863 1.maven依赖 <dependency> <g ...

  10. Windows7设置局域网文件共享

    首先要实现共享必须设置共享的机器与访问共享的机器在同一个工作组中. 右键桌面上的计算机图标=>属性 如果不一样的话,就需要点击[更改设置] 右键要共享的文件或者文件夹,点击[共享]打开共享标签: ...