Domain Name System
linux下DNS设置方法
1.HOST 本地DNS解析
vi /etc/hosts
223.231.234.33 www.baidu.com
2.网卡配置文件
vi /etc/sysconfig/network-scripts/ifcfg-eth0
DSN1=114.114.114.114 (DNS后面的1不能少)
3.系统默认DNS配置
vi /etc/resolv.conf
nameserver 119.29.29.29
DNS配置文件的解析优先级
关于先使用/etc/hosts还是/etc/resolv.conf
取决于etc/nsswitch.conf。默认配置如下,即先使用/etc/hosts
[root@master1 ~]# cat /etc/nsswitch.conf |grep hosts
#hosts: db files nisplus nis dns
hosts: files dns myhostname
如何查看和清空DNS缓存
1、Chrome浏览器:
查看缓存: chrome://net-internals/#dns
清空:
2、Windows系统:
查看 ipconfig/displaydns
清空 ipconfig/flushdns
windows下的DNS Cache 是由DNS Client后台进程控制的,你可以在控制面板 ->服务中将其关闭, 这样windows就不会进行DNS缓存,每次都将直接查询DNS Server。
3、Linux
清空NSCD Cache:删除rm -f /var/db/nscd/hosts,重启service nscd restart,停止service nscd stop
查看bind缓存:rndc -dumpdb
清空bind缓存 : rndc flush
清空dnsmasq缓存:sudo /etc/init.d/dnsmasq restart
注:DNSmasq是一个轻巧的,容易使用的DNS服务工具,它可以应用在内部网和Internet连接的时候的IP地址NAT转换,也可以用做小型网络的DNS服务。
4、 Mac OSX
清空:sudo killall -HUP mDNSResponder(适用10.10.4以后的版本)
DNS解析过程详解
简要过程:
浏览器的dns缓存>操作系统dns缓存> hosts文件> dns服务器的zone文件>dns服务器缓存>根dns服务器>com.服务器>qq.com.服务器(得出结果)
详细过程:
1) 在浏览器中输入www.qq.com域名,先查询浏览器的dns缓存。如有,结束。如无或者过期(过期时间是由什么控制的?不知道),继续。
老版chrome可以看到缓存记录,新版看不到
2、查找操作系统的dns缓存(过期时间是TTL)。通过cmd下ipconfig /displaydns查看(清除命令 ipconfig /flushdns)
3、读取/etc/hosts文件。windows下是c:/windows/system32/drivers/etc/hosts
4、向本地电脑设置的dns服务器发起请求,windows下,如果设置了dns服务器地址,则按顺序请求。如果没设置,那dns服务器的地址会是dhcp服务器自动分配的,可以在cmd下通过ipconfig /all命令查看。
如果是linux下,先查网卡配置文件中的dns服务器地址,再查 /etc/resolv.conf,dns服务器收到查询请求后,如果要查询的域名,包含在本地配置区域文件中(如果这个dns服务器是用bind搭建的,那这里的本地配置区域文件是 /var/named/qq.com.zone),则返回解析结果给客户机,完成域名解析,此解析具有权威性。
5、如果不在zone文件里面,就查dns服务器的dns缓存。此解析不具有权威性
6、DNS服务器的zone文件与缓存都没有,则根据本地DNS服务器的设置(是否设置转发器)进行查询,如下
如果设置了转发,在查询根dns服务器之前先查询转发的dns服务器。
如果未用转发模式,本地DNS就把请求发至13台根DNS(13的意思是地址是13个,真正提供服务是集群,有很多服务器)中的任意一个,根DNS服务器收到请求后会判断这个域名(.com)是谁来授权管理,并会返回一个负责该顶级域名服务器(com.)的一个IP。本地DNS服务器收到IP信息后,将会联系负责.com域的这台服务器。这台负责.com域的服务器收到请求后,如果自己无法解析,它就会找一个管理.com域的下一级DNS服务器地址(qq.com)给本地DNS服务器。当本地DNS服务器收到这个地址后,就会找qq.com域服务器,qq.com这台dns域服务器进行查询,找到www . qq .com的ip后返回给本地dns服务器
理论上,所有域名查询都必须先查询根域名,因为只有根域名才能告诉你,某个顶级域名由哪台服务器管理。 由于根域名列表很少变化,大多数 DNS 服务商都会提供它的缓存(一般为1000小时),所以根域名的查询事实上不是那么频繁。 从客户端到本地DNS服务器是属于递归查询,而DNS服务器之间就是的交互查询就是迭代查询
DNS配置选项
options timeout:1 attempts:1 rotate single-request-reopen
nameserver 10.0.0.1
nameserver 10.0.0.2
nameserver 10.0.0.3
选项说明
- dns服务器最多能设三个。
- search最多设6个。
- timeout:查询一个dns的超时时间,单位是秒。默认是5,最大可以设为30。改成最小值:1
- attempts:全部dns服务器都查询一遍的次数。缺省是2,有3台dns的前提下,都查询一遍完全够了
- rotate:随机选取一个作为首选查询的dns。没有这个选项的话,系统缺省是从上到下的
- single-request:默认并行执行 IPv4 and IPv6 的解析,但某些 DNS 服务器可能无法正确处理这些查询使请求超时。该选项改为串行发送IPv6 and IPv4 的解析。(禁用IPv6可以避免AAAA查找)
- single-request-reopen :IPV4请求和IPV6请求默认使用同一个socket,同一个源端口。 当并发发包时,为它们分别创建 conntrack 表项,如果两个dns请求被发送kube-dns后端的同一个POD时,它们的五元组相同,dns请求返回时后面那个包就会被丢掉,现象就是 dns 请求超时,client 默认策略是等待 5s 自动重试,如果重试成功,我们看到的现象就是 dns 请求有 5s 的延时。这个参数可以改为使用不同的socket,即使用不同的源端口。从而避免冲突,引发5秒延迟。
- no-check-names:禁止对传入的主机名和邮件地址进行无效字符检查。
- use-vc:强制使用 TCP 进行 DNS 解析。(有些特殊镜像Alpine Linux使用musl libc的限制,不起作用)
- ndots:5 所有查询中,如果.的个数少于5个,则会根据search中配置的列表依次在对应域中先进行搜索,如果没有返回,则最后再直接查询域名本身
dns的负载均衡设置
在DNS域名映射zone文件中加入几条域名IP映射条目。如:
host1 IN A 192.168.1.100
host1 IN A 192.168.1.101
host1 IN A 192.168.1.102
host1 IN A 192.168.1.103
DNS缓存nscd
linux本身是没有dns缓存的。不过可以通过软件来实现缓存。
Linux下DNS缓存实现通常有两种方式
- 一种是普通服务器下用DNS缓存程序NSCD(name service cache daemon)负责管理DNS缓存。
- 一种是由Bind或dnsmasq软件架设的域名服务器会自带dns cache
这里主要介绍nscd。
nscd(Name Service Cache Daemon)是一种能够缓存 passwd、group、hosts 的本地缓存服务,分别对应三个源 /etc/passwd、/etc/hosts、/etc/resolv.conf。其最为明显的作用就是加快 DNS 解析速度,在接口调用频繁的内网环境建议开启。
安装
$ yum install nscd
安装后,nscd 的缓存文件路径为/var/db/nscd/。
配置
nscd 的配置文件默认路径为/etc/nscd.conf。
开启 nscd 的 hosts 缓存服务后,每次内部接口请求不会都发起 dns 解析请求,而是直接命中 nscd 缓存散列表,从而获取对应服务器 ip 地址,这样可以在大量内部接口请求时减少接口的响应时间。
https://www.fanhaobai.com/2017/06/nscd-dns-cache.html
测试nscd
https://blog.csdn.net/heshan307/article/details/52444722
DNS缓存在服务器上的作用
在需要通过域名与外界进行数据交互的时候,dns缓存就派上用场了,它可以减少域名解析的时间,提高效率.例如以下情况:
- 使用爬虫采集网络上的页面数据,
- 使用auth2.0协议从其他平台(如微博或QQ)获取用户数据,
- 使用第三方支付接口,
- 使用短信通道下发短信等.
DNS缓存到底能提升多少性能呢?
首先要看网络和dns服务器的能力,dns解析越慢,dns缓存的优势就越大.比如我们在北京用的dns服务器202.106.0.20和google的dns服务器8.8.8.8速度会差不少.
如果dns服务器比较稳定,那它对效率的影响就是一个常数.这个常数有多大呢?
我简单试了一下.在局域网内进行压力测试,压一个nginx下的静态页面,使用202.106.0.20这个dns服务器,不用dns缓存.平均一分钟可以访问27万次.压一个简单的php页面,平均一分钟可以访问22万次.加上nscd服务后,静态页面平均一分钟可以访问120万次,要快4倍多.php页面平均一分钟可以访问50万次,快一倍多.
如果是做搜索引擎或是一些代理服务类的项目,比如短信通道,数据推送服务,这个性能提升还是比较可观的.但在一般的项目中,一台服务器每分钟发22万次请求的情况是很少见的,所以这个性能提升也微呼其微.
https://blog.51cto.com/shenliyang/1387576
如何根据ip的请求来源地址实现dns的就近解析?
在named.conf中定义ACL和启用VIEW
https://cloud.tencent.com/developer/article/1569976
http://www.toxingwang.com/linux-unix/linux-admin/1215.html
为什么要有 DNS,没有dns可以吗?
网络通讯大部分是基于TCP/IP的,而TCP/IP是基于IP地址的,所以计算机在网络上进行通讯时只能识别
如“202.96.134.133”之类的IP地址,而不能认识域名。我们无法记住10个以上IP地址的网站,所以我们访问网站时,更多的
是在浏览器地址栏中输入域名,就能看到所需要的页面,这是因为有一个叫“DNS服务器”的计算机自动把我们的域名“
翻译”成了相应的IP地址,然后调出IP地址所对应的网页。
所以使用DNS的原因是简单方便易记。
为什么说DNS根服务器只有13台?
DNS 协议是应用层协议,它大多数情况下使用传输层的 UDP 协议进行数据传输(仅在重试的情况下可能使用 TCP 协议)),而UDP协议是不可靠的,所以根据RFC 791规定,为了保证 UDP 数据包传输成功率,数据包的大小会尽量控制在 576 字节以使数据包不会被分片传输。
除去 UDP 数据包自身包头占用的字节数,DNS 数据包被设计为不超过512字节。
综上所述,数据包总长度为12+5+(31+(15(N-1))+16N,再根据前述 DNS 大小限制不超过512字节的要求,可以得 N 不超过15组,再加上早期设计的时候考虑到预留一些 buffer 于是就有了现在全球13组根域名服务器的结果。
https://cloud.tencent.com/developer/article/1366044
需要注意的是:
根域名服务器地址的数量被限制为13个。幸运的是,采用任播技术架设镜像服务器可解决该问题,并使得实际运行的根域名服务器数量大大增加。截至2017年11月,全球共有800台根域名服务器在运行。
什么是dns域名劫持和域名污染
一些组织或个人为了某些目的,通过某些无法通过域名解析出正确的IP地址。常用的手段有:DNS劫持和DNS污染。
什么是DNS劫持
DNS劫持定义
通过某种技术手段,篡改正确域名和IP地址的映射关系,使得域名映射到了错误的IP地址,因此可以认为DNS劫持是一种DNS重定向攻击。
DNS劫持通常可被用作域名欺诈,如在用户访问网页时显示额外的信息来赚取收入等;也可被用作网络钓鱼,如显示用户访问的虚假网站版本并非法窃取用户的个人信息。
DNS劫持症状
连接宽带后首次打开任何页面都指向ISP提供的“电信互联星空”、“网通黄页广告”等内容页面。访问Google域名的时候出现了百度网站。输错网址后出现电信的114搜索网站,这些都属于DNS劫持。
DNS劫持分类
【一、本地DNS劫持】
客户端侧发生的DNS劫持统称为本地DNS劫持。本地DNS劫持可能是:
- 黑客入侵PC,篡改DNS配置(hosts文件,DNS服务器地址,DNS缓存等)。
- 黑客入侵路由器并且篡改DNS配置。
【二、DNS解析路径劫持】
DNS解析过程中发生在客户端和DNS服务器网络通信的过程中。
通过对DNS解析报文在查询阶段的劫持路径进行划分,又可以将DNS解析路径劫持划分为如下三类:
• DNS请求转发
通过技术手段(中间盒子,软件等)将DNS流量重定向到其他DNS服务器。
• DNS请求复制
利用分光等设备将DNS查询复制到网络设备,并先于正常应答返回DNS劫持的结果。
案例:一个DNS查询抓包返回两个不同的应答。
• DNS请求代答
网络设备或者软件直接代替DNS服务器对DNS查询进行应答。
案例:一些DNS服务器实现了SERVFAIL重写和NXDOMAIN重写的功能。
【三、篡改DNS权威记录】
黑客入侵dns管理账号,直接修改DNS解析记录。
案例:黑客黑入域名的管理账户,篡改DNS解析记录指向自己的恶意服务器IP
黑客黑入域名的上级注册局管理账户,篡改域名的NS授权记录,将域名授权给黑客自己搭建的恶意DNS服务器以实现DNS劫持。
如何确认DNS劫持
查看路由器DNS配置是否被篡改。
阿里DNS域名检测工具地址:https://zijian.aliyun.com/#/domainDetect
通过工具查看回复DNS应答的DNS服务器,确认DNS解析是否被重定向。
• whatismydnsresolver http://whatismydnsresolver.com/
移动端可以安装一些DNS相关的测试工具进行排查:
• 安卓 ping & dns
• IOS IOS iNetTools
DNS劫持防范
- 使用可靠的DNS服务器解决,例如8.8.8.8。
- 安装杀毒软件;定期修改路由器管理账号密码和更新固件
- 选择安全技术实力过硬的域名注册商,并且给自己的域名权威数据上锁,防止域名权威数据被篡改。
- 选择支持DNSSEC的域名解析服务商,并且给自己的域名实施DNSSEC。DNSSEC能够保证递归DNS服务器和权威DNS服务器之间的通信不被篡改。
- 在客户端和递归DNS服务器通信的最后一英里使用DNS加密技术,如DNS-over-TLS,DNS-over-HTTPS等。
https://developer.aliyun.com/article/720203?spm=a2c6h.13262185.0.0.1aa06432XRr0OB
什么是DNS污染
DNS污染又叫DNS缓存投毒(DNS cache poisoning),DNS缓存污染(DNS cache pollution),是指一些刻意制造(投毒)或无意中制造(污染)出来的DNS数据包,让DNS缓存服务器缓存了错误的域名解析记录。
DNS缓存投毒工作方式是:由于通常的DNS查询没有任何认证机制,而且DNS查询通常基于的UDP是无连接不可靠的协议,因此DNS的查询非常容易被篡改,通过对UDP端口53上的DNS查询进行监听,一经发现与关键词相匹配的请求则立即伪装成目标域名的解析服务器(NS,Name Server)给查询者返回错误结果。
为了减少网络上的流量,一般的DNS缓存服务器都会把域名数据缓存起来,待下次有其他DNS客户端要求解析同样的域名时,可以立即提供服务。当缓存服务器缓存了错误的域名数据时,DNS客户端在请求这些域名时就会得到错误的结果。
DNS受污染的途径主要要有两种:
① 是攻击者监测到DNS查询的请求报文时,伪装成DNS服务器向请求主机发送响应报文。
因为DNS报文通常是无连接的UDP报文,没有确认机制,源主机不能识别出这个报文并非出自DNS服务器。攻击者 并不需要丢弃真正DNS服务器发回来的响应报文,因为DNS的机制会导致源主机只接受最先到达的响应报文(甚至 不管是谁发的)而忽略后继到达的其他报文。这样,源主机得到的就是攻击者伪造的域名解析结果。
② 是本地DNS服务器的缓存已受到污染,里面缓存的是错误的结果。
DNS服务器通常将DNS查询的结果缓存在本地一段时间,这本意是为了减少重复DNS查询,从而降低DNS报文占用的网络带宽。可如果某次DNS查询的结果受到污染,则后继一段时间内向该DNS服务器查询的结果都会受到污染。
DNS缓存投毒原理
目前DNS采用UDP协议传输查询和应答数据包,采用简单信任机制,对首先收到的DNS应答数据包仅进行原查询包发送IP地址、端口和ID的确认,而不会对数据包的合法性做任何分析,若匹配,则接受其为正确应答数据包,继续DNS解析过程,并且丢弃后续到达的所有应答数据包。这就使得攻击者可以仿冒权威DNS服务器向缓存DNS服务器发送伪造应答包,力争抢先完成应答以污染DNS缓存。若攻击者发送的伪造应答包在权威名字服务器发送的正确应答包之前到达缓存DNS服务器,并与原查询包IP地址、端口、ID相匹配,就能够成功污染DNS缓存。
下面我们来看看几种投毒类型:
1、通过随机响应包造成投毒的“生日攻击”
在 2008 年之前,所有DNS请求包都使用固定源端口53发送解析请求。因此,除了ID之外,欺骗DNS回复所需的所有信息都是有限的。用这种弱点攻击 DNS 被称为“生日悖论”,平均需要256次来猜测ID。为了使攻击成功,伪造的DNS回复必须在合法权威DNS服务器响应之前到达缓存DNS服务器。如果伪造响应首先到达,它将由缓存DNS缓存,并且直到其生存时间(TTL)到期,递归DNS不会向权威DNS请求解析相同的域名。
2、Kaminsky缓存投毒
2008年,在Black Hat上有人公布了一种新型缓存投毒的原理。其中基本的随机猜测技术不变。该攻击利用了 DNS 响应包的AUTHORITY SECTION字段,因为 DNS 响应可以是直接应答(请求的直接IP地址)或引用(对给定区域具有权威性的服务器)。基本思想是攻击者选择他们希望攻击的域,然后向目标解析器查询尚未被解析器缓存的子域(查询不存在的子域是一个很好的选择,因为不存在的子域记录是没有被DNS服务器缓存的)。由于子域不在缓存中,因此DNS递归服务器向该域的权威服务器发送查询。正是在这一点上,攻击者用大量伪造的响应来淹没正常应答,每个伪造的响应都有不同的伪造ID号。如果攻击者成功注入伪造响应,则递归DNS服务器将为权威服务器缓存错误的IP。对受感染域的递归DNS服务器的未来 DNS 查询将导致所有请求被转发到攻击者控制器权威解析器,使攻击者能够提供恶意响应,而无需为每个新 DNS 记录注入假条目。
DNS缓存投毒应对
- 防止DNS缓存投毒的最佳方法是实施加密和身份验证的安全方法DNSSEC。作为整个互联网的骨干和基石协议,DNS目前最常用的实施方式,是未加密的明文传输的方式。DNSSEC是一种较好的对DNS进行身份验证的方法,DNS服务器对DNS解析器的应答,采用DNSSEC的签名方式。然后DNS解析器使用签名来验证DNS响应,确保记录未被篡改。此外,它还提供从TLD到域权威区域的信任链,确保整个DNS解析过程是安全的。尽管有这些明显的好处,但DNSSEC的采用速度很慢。主要问题是DNSSEC设置很复杂,需要升级设备和系统、以及相应的服务,才能处理新协议。此外,由于DNS缓存投毒等攻击形式并没有得到相应的重视。DNSSEC也没有被提高到较高的优先级上进行实施。
- 个人测试环境下可以通过修改Hosts的方法,设置域名正确的IP地址。
https://developer.aliyun.com/article/718497
DNS劫持和DNS污染的区别
DNS的记录类型
(1) A
:地址记录(Address),将域名指向一个IPv4地址(例如:100.100.100.100)。
(2)AAAA记录: 将主机名(或域名)指向一个IPv6地址(例如:ff03:0:0:0:0:0:0:c1),需要添加AAAA记录
(3) NS
:域名服务器记录(Name Server),如果要将子域名指定某个域名服务器来解析,需要设置NS记录。该记录只能设置为域名,不能设置为IP地址。
(4)MX
:邮件记录(Mail eXchange),建立电子邮箱服务,将指向邮件服务器地址,需要设置MX记录。建立邮箱时,一般会根据邮箱服务商提供的MX记录填写此记录
(5)CNAME
:规范名称记录(Canonical Name),a指向1.2.3.4, 将b和c指向a,则b、c的解析IP与a的相同都是1.2.3.4。好处是修改解析IP的时候只需要修改a就行了。如果没有cname,需要修改3个。
(6)PTR
:逆向查询记录(Pointer Record),A记录的逆向记录,又称做IP反查记录或指针记录,负责将IP反向解析为域名
(7)TXT:为某个主机名或域名设置说明,可任意填写,可为空。一般做一些验证记录时会使用此项,如:做SPF(反垃圾邮件)记录、阿里云申请免费ssl证书时使用域名解析验证,也会用到TXT记录
(8)SRV记录: 添加服务记录服务器服务记录时会添加此项,SRV记录了哪台计算机提供了哪个服务。格式为:服务的名字.协议的类型(例如:_example-server._tcp)。
(9)SOA记录: SOA叫做起始授权机构记录,NS用于标识多台域名解析服务器,SOA记录用于在众多NS记录中那一台是主服务器
(10)显性URL转发记录: 将域名指向一个http(s)
协议地址,访问域名时,自动跳转至目标地址。例如:将www.liuht.cn显性转发到www.itbilu.com后,访问www.liuht.cn时,地址栏显示的地址为:www.itbilu.com。
(11)隐性UR转发记录L: 将域名指向一个http(s)
协议地址,访问域名时,自动跳转至目标地址,隐性转发会隐藏真实的目标地址。例如:将www.liuht.cn显性转发到www.itbilu.com后,访问www.liuht.cn时,地址栏显示的地址仍然是:www.liuht.cn。
一般来说,为了服务的安全可靠,至少应该有两条NS
记录,而A
记录和MX
记录也可以有多条,这样就提供了服务的冗余性,防止出现单点失败。CNAME
记录主要用于域名的内部跳转,为服务器配置提供灵活性,用户感知不到。举例来说,facebook.github.io
这个域名就是一个CNAME
记录。
$ dig facebook.github.io
...
;; ANSWER SECTION:
facebook.github.io. 3370 IN CNAME github.map.fastly.net.
github.map.fastly.net. 600 IN A 103.245.222.133
上面结果显示,facebook.github.io
的CNAME记录指向github.map.fastly.net
。也就是说,用户查询facebook.github.io
的时候,实际上返回的是github.map.fastly.net
的IP地址。这样的好处是,变更服务器IP地址的时候,只要修改github.map.fastly.net
这个域名就可以了,用户的facebook.github.io
域名不用修改。
由于CNAME
记录就是一个替换,所以域名一旦设置CNAME
记录以后,就不能再设置其他记录了(比如A
记录和MX
记录),这是为了防止产生冲突。举例来说,foo.com
指向bar.com
,而两个域名各有自己的MX
记录,如果两者不一致,就会产生问题。由于顶级域名通常要设置MX
记录,所以一般不允许用户对顶级域名设置CNAME
记录。
DNS相关命令
1、 dig:根据域名查询ip地址
指定域名服务器查询 dig @4.2.2.2 math.stackexchange.com
简短显示 dig math.stackexchange.com +short
显示查询过程 dig math.stackexchange.com +trace
反向查询(由ip查询域名) dig -x 192.30.252.153
DNS报文
参考
https://www.cnblogs.com/zhangmingda/p/9725746.html
https://cloud.tencent.com/developer/article/1449227
https://www.ichenfu.com/2018/10/09/resolv-conf-desc/