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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
// 在预设的情况下,这个档案会去读取 /etc/named.rfc1912.zones 这个领域定义档 // 所以请记得要修改成底下的样式啊! options { listen-on port 53 { any; }; //可不设定,代表全部接受 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; }; //可不设定,代表全部接受 recursion yes; //将自己视为客户端的一种查询模式 }; //最终记得要结尾符号! zone "." IN { type hint; file "named.ca"; }; zone "centos.vbird" IN { // 这个 zone 的名称 type master; // 是什么类型 file "named.centos.vbird"; // 档案放在哪里 allow-transfer { 192.168.100.10; }; }; zone "100.168.192.in-addr.arpa" IN { type master; file "named.192.168.100"; allow-transfer { 192.168.100.10; }; }; |
主要描述了:
- 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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
$TTL 600 @ IN SOA master.centos.vbird. vbird.www.centos.vbird. ( 2011080401 3H 15M 1W 1D ) ; 与上面是同一行 @ IN NS master.centos.vbird. ; DNS 服务器名称 @ IN NS slave.centos.vbird. master.centos.vbird. IN A 192.168.100.254 ; DNS 服务器 IP @ IN MX 10 www.centos.vbird. ; 领域名的邮件服务器 www.centos.vbird. IN A 192.168.100.254 linux.centos.vbird. IN CNAME www.centos.vbird. ftp.centos.vbird. IN CNAME www.centos.vbird. forum.centos.vbird. IN CNAME www.centos.vbird. niki.centos.vbird. IN NS dns.niki.centos.vbird. dns.niki.centos.vbird. IN A 192.168.100.200 slave.centos.vbird. IN A 192.168.100.10 clientlinux.centos.vbird. IN A 192.168.100.10 workstation.centos.vbird. IN A 192.168.1.101 winxp.centos.vbird. IN A 192.168.100.20 win7 IN A 192.168.100.30 ; 这是简化的写法! |
- 必须要描述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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
$TTL 600 @ IN SOA master.centos.vbird. vbird.www.centos.vbird. ( 2011080401 3H 15M 1W 1D ) @ IN NS master.centos.vbird. @ IN NS slave.centos.vbird. 254 IN PTR master.centos.vbird. ; 将原本的 A 改成 PTR 的标志而已 10 IN PTR slave.centos.vbird. 254 IN PTR www.centos.vbird. ; 这些是特定的 IP 对应 10 IN PTR slave.centos.vbird. 20 IN PTR winxp.centos.vbird. 30 IN PTR win7.centos.vbird. 101 IN PTR dhcp101.centos.vbird. ; 可能针对 DHCP (第十二章) 的 IP 设定 102 IN PTR dhcp102.centos.vbird. 200 IN PTR dhcp200.centos.vbird. |
- 可以很明显的看出配置的就是IP到域名的关系。
- NS地址依旧要写,和正解的理由一样,权威DNS应该返回自己是谁。
- 试试反解:dig -x 192.168.100.254 @127.0.0.1
理解DNS是一项重要的技能,做好知识储备。
如果文章帮助您解决了工作难题,您可以帮我点击屏幕上的任意广告,或者赞助少量费用来支持我的持续创作,谢谢~
