dns原理与bind部署

谈起DNS,每个人都能说上两句,比如:”解析域名的,用来做负载均衡”,但是谈到DNS的原理能说清楚的人就少得多,再进一步掌握部署搭建的估计只剩下负责基础运维的朋友了。

我们想象这样的场景

我假设这是一个初创公司,一切以业务快速发展为目标,那么轨迹极有可能像这样:

  • 一开始租用了阿里云的服务器,部署在不同服务器上的服务之间基于内网IP互相调用,这个阶段每个服务只需有一台服务器就可以满足。
  • 随着发展,单个服务并发上升需要部署到多台服务器上,于是如何访问一个集群就成了一个当务之急。
  • 接下来,有人选择部署LVS/HAPROXY来负载均衡,并且额外的利用keepalived实现高可用主备切换。
  • 业务发展,服务不断变多,通过给LVS/HAPROXY增加新的服务端口来区分不同的服务调用,尚足以应付。
  • 全站流量上升,单个负载均衡压力增大,不同服务之间互相影响,于是增加新的负载均衡节点并将部分服务迁移过去,那么依赖这批迁移服务的代码需要修改访问地址到新的负载均衡,整个过程称作”垂直切分”。
  • 核心服务压力上升,即便单个负载均衡只支撑核心服务都无法正常工作,此时只能为核心服务添加多个负载均衡节点,对于依赖核心服务的代码来说,面临访问多个负载均衡IP的问题,整个过程称作”横向切分”。
  • 部署内网DNS,所有服务均赋予独立的访问域名,所有服务器均访问该DNS实现域名解析,核心服务的域名随机解析到任意负载均衡节点。

为什么不使用阿里云的DNS呢?因为我们的服务大多数是内部的,IP也是内网IP,本身是不希望外面的人拿到的。另外,内网之间访问调用频率极高,那么保证域名解析的速度和可用性就很重要,因此搭建一个内网DNS解决内网服务的名字问题就很重要了。

随便扯扯

本文不会直接讲解dns,因为有一篇完美的文章已经讲述了一切,所以只罗列一下我觉得挺重要的点:

  • FQDN(完整主机名)= Hostname(主机名)+ Domain(领域名),根Domain是.(注意最后的”点”) 。
  • 我们所说的”域名”就是FQDN,比如:mp3.baidu.com.(注意最后的”点”)。
  • 客户端解析域名是自上而下的,客户端直接与DNS服务多次交互,每一级DNS只管理直接下级Domain的DNS地址(我们称这些DNS为权威服务器,它们只负责与自己相关的事情),过程如下:
    • domain=.的DNS会告诉我们domain=com.的DNS的IP地址。
    • domain=.com的DNS会告诉我们domain=baidu.com.的DNS的IP地址。
    • domain=.baidu.com的DNS会告诉我们FQDN=mp3.baidu.com的IP地址。
  • 客户端可以缓存解析来的IP(就像Linux默认行为那样),如果让DNS服务器即充当服务端也充当客户端,那么这个DNS服务器还可以充当缓存的角色,加速其他客户端的域名解析,实现缓存共享(我们称这种充当客户端的DNS为递归缓存DNS,但这不影响它充当权威DNS)。
  • 正解是FQDN->ip,反解就是ip->FQDN,都是配置出来的效果。反解因为是IP到FQDN,IP不具备全球唯一性,所以反解只用于内网使用。
  • DNS是协议,BIND是一个经典实现。
  • BIND支持主从模式扩展,主要是为了提升负载能力,它会自动将主的配置变动同步给从机,方便管理。
  • 服务器修改配置将解析服务器指向BIND,这样操作系统内发起域名解析默认都将访问BIND获取IP。
  • 为了实现域名智能解析,需要用到view,也就是根据客户端的来源IP返回不同的解析结果。

如何掌握dns

最重要的是理解dns的原理,其次是配置的过程中去加深对原理的理解,唯一的学习办法是阅读:《鸟哥的Linux私房菜》,大概需要花费2-3小时的时间,可以掌握dns原理和bind配置的主要内容。

下面是一份可以测试的bind基础配置,核心配置包含3个文件:

主配置/etc/named.conf

主要描述了:

  • options:
    • listen-on:监听地址
    • directory:数据目录
    • xxx-file:各类统计文件
    • allow-query:允许访问来源
    • recursion:是否递归解析(表现为一个递归解析+缓存服务)。
  • zone:一个zone表示一个domain的解析配置,zone后面的是要正解或反解的domain。括号内,type=是zone的类型,allow-transfer表示允许哪些来源IP同步配置,file是配置文件的具体名字。
    • .:type=hint表示这是根服务器的配置,因为recursion=yes,所以需要配置根dns的地址,用于递归解析域名。
    • centos.vbird:这个centos.vbird的正解配置(表现为一个权威dns),type=master表示这是主节点,只允许192.168.100.10这个服务器来同步配置。
    • 100.168.192.in-addr.arpa:192.168.100.x网段的反解配置,type=master表示这是主节点,只允许192.168.100.10来同步配置。

正解配置/var/named/named.centos.vbird

  • 必须要描述centos.vbird的NS地址是master.centos.vbird,而这个地址解析的A记录就是自己:192.168.100.254。(配置指向自身的NS信息是必要的,一个权威服务器应当能返回自己在哪里,试试dig -t ns centos.vbird @localhost来获取这类信息)
  • 必须要描述slave dns的NS地址以及A记录,因为slave dns是从master dns同步过去的配置,其他原因和上一条一样。
  • 描述各个FQDN的A记录或者CNAME。
  • 如果有下级Domain的DNS服务,则需要配置对应的NS和A记录,如其中的niki.centos.vbird. -> dns.niki.centos.vbird。

如果没有认真阅读鸟哥的书,一头雾水是很正常的。

反解配置/var/named/named.192.168.100

  • 可以很明显的看出配置的就是IP到域名的关系。
  • NS地址依旧要写,和正解的理由一样,权威DNS应该返回自己是谁。
  • 试试反解:dig -x 192.168.100.254  @127.0.0.1

理解DNS是一项重要的技能,做好知识储备。

如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~