前段时间做过的域名销售系统,现在公司希望不再依赖 webnic 方面提供的 DNS 解析服务,转而自主研发一台 DNS server,我这里选择了 Bind,写博文记录一下其相关的搭建和测试过程。
Bind
Bind 是一款开放源码的 DNS 服务器软件,Bind 由美国加州大学 Berkeley 分校开发和维护的,全名为 Berkeley Internet Name Domain 它是目前世界上使用最为广泛的 DNS 服务器软件,支持各种 unix 平台和 windows 平台。
安装
Redhat 系列:yum install bind bind-chroot(bind-chroot 包含了一些安全工具)
Ubuntu 系列:apt-get install bind9
Windows 系列:用你妹的 Windows
当然啦,Bind 是开放源代码的,所以我们也可以用源码进行安装,不过很麻烦啊啊啊....
我自己的系统是 CentOS,安装完之后,使用如下的命令能够看到对应结果:
rpm -qa | grep bind
启动
启动命令分为两种,第一种应该是通用的:
/etc/init.d/named start
请注意,我这里加了一个应该,因为我自己也不确定,按照我自己的经验来看,使用 yum 安装后的软件,在/etc/init.d 下面应该会有对应的可执行文件,只是我的 CentOS 下面并没有 named,不知道其他童鞋使用不同的 Linux 发行版本会不会有所不同。
第二种是 CentOS 下的:
systemctl start named
同理,我使用的 CentOS7,启动之后,可以看到如下进程:
[root@iZ28vhwdq63Z /]# ps -aux | grep named
named 30409 0.0 0.7 167268 14380 ? Ssl 09:15 0:00 /usr/sbin/named -u named
配置
首先,我们可以通过以下命令来查找 bind 安装后的配置文件在哪里:
rpm -ql bind | more
如图所示,/etc/named.conf 就是 bind 的主配置文件
配置项
-
options {} : 整个 bind 使用的全局选项,监听端口,文件存储位置,缓存的存储位置,权限加密的控制等等
options { listen-on port 53 { 127.0.0.1; }; //TCP/UDP监听端口及地址,这个一般不用修改 listen-on-v6 port 53 { ::1; }; //ip6的情况下 directory "/var/named";//bind数据库的文件,配置的zone的文件以及主配置文件的目录 dump-file "/var/named/data/cache_dump.db";//DNS解析过的内容缓存的位置 statistics-file "/var/named/data/named_stats.txt";//静态解析文件 memstatistics-file "/var/named/data/named_mem_stats.txt";//内存统计信息 allow-query { localhost; };//权限控制 /* * author:liumapp * homePage:http://www.liumapp.com * * 下面都是DNS加密的选项 */ recursion yes; dnssec-enable yes; dnssec-validation yes; /* Path to ISC DLV key */ bindkeys-file "/etc/named.iscdlv.key"; managed-keys-directory "/var/named/dynamic"; pid-file "/run/named/named.pid"; session-keyfile "/run/named/session.key"; };
-
logging {} : 服务日志选项,日志输出文件的位置,级别等
logging { channel default_debug { file "data/named.run"; //输出文件位置 severity dynamic; //级别 }; };
-
zone . {} : 最重要的一个,DNS 域解析
zone "." IN { //.表示根域 type hint;//这个type有很多种类型,当其为master,表示其为主DNS。 file "named.ca"; // named.ca是一台根域服务器 };
注意事项
- 语法书写,非常严格。每一行必须以;结尾
- @ 是 DNS 记录中的保留字,表示当前域名
- 记录不准折行书写
- 单行记录开头不准有空格或者 tab 开头
- Bind 所有的配置文件,都需要赋予 named 用户可以读取的权限
测试
A 记录解析
测试内容,就是看看能不能成功解析我的 www.liumapp.com 到对应的 ip 地址,请注意:我安装 bind 的服务器跟安装我博客的服务器不是在同一台服务器上面,所以它们两者的 IP 地址是不同的。
首先,我们把原来的配置文件 named.conf 进行备份,之后对它的内容改为如下所示:
#
#User: liumapp
#Email: liumapp.com@gmail.com
#homePage: http://www.liumapp.com
#Date: 6/21/17
#Time: 10:00 AM
#
options {
directory "/var/named";
};
zone "liumapp.com" {
type master;
file "liumapp.com.zone";
};
然后,我们在/var/named 目录下,新建一个 liumapp.com.zone 文件,其内容如下:
#
#User: liumapp
#Email: liumapp.com@gmail.com
#homePage: http://www.liumapp.com
#Date: 6/21/17
#Time: 10:11 AM
#
#time to live的缩写,该字段指定IP包被路由器丢弃之前允许通过的最大网段数量
$TTL 7200
#这里面有一个邮箱,liumapp.com@gmail.com,但是@符号在bind配置文件有自己的特殊含义,所以我们使用.来代替
#最后的222 1H 15M 1W 1D跟DNS主从有关
#配置liumapp.com和管理员的邮箱
liumapp.com. IN SOA liumapp.com. liumapp.com.gmail.com (222 1H 15M 1W 1D)
#配置bind,liumapp.com这个域由哪一台DNS server 进行解析
liumapp.com. IN NS dns1.liumapp.com.
# 对解析liumapp.com的DNS server做一个A纪录
# 这里,我直接把安装了bind的服务器的IP地址写了上去
# 这个dns1.liumapp.com也可以写成dns1
dns1.liumapp.com. IN A 115.29.32.62
# 对www.liumapp.com做一条A纪录的解析
# 这个www.liumapp.com也可以写成www
www.liumapp.com. IN A 106.14.212.41
另外,请大家注意,上面两个文件请不要包含有注释,上面的注释是我为了方便阅读和理解写上去的,真正使用的时候要删除掉的。
之后,重启 bind:
systemctl restart named
好,接下来我们使用 dig 命令来检查一下能否成功解析 www.liumapp.com
输入命令:
dig @115.29.32.62 www.liumapp.com
115.29.32.62 是我们 DNS server 的 IP 地址,www.liumapp.com 如果成功解析的话,应该能指向到 106.14.212.41 这个 IP 地址
敲回车后,我们可以看到下面的结果:
可以看到,解析成功了。
CNAME 记录解析
现在我们使用一个 cnametest.com 这个域名来做一个 cname 记录解析:
首先,基于上面的配置文件的基础,我们在 named.conf 下修改为如下代码:
options {
directory "/var/named";
};
zone "liumapp.com" {
type master;
file "liumapp.com.zone";
};
zone "cnametest.com" {
type master;
file "cnametest.com.zone";
};
然后在/var/named 目录下添加一个 cnametest.com.zone 文件,内容为:
$TTL 7200
cnametest.com. IN SOA cnametest.com. liumapp.com.gmail.com (4012100 1H 15M 1W 1D)
cnametest.com. IN NS dns1.liumapp.com.
dns1.liumapp.com. IN A 115.29.32.62
www.cnametest.com. IN CNAME www.liumapp.com.
重启 bind,使用 dig 命令测试后,如果成功将有如下结果出现:
正向解析测试
正向解析其实跟我们的添加 A 记录解析是一样的,都是从域名到 IP。
反向解析测试
反向解析,这边我查阅到的资料提及到的反向解析一般是应用在 MX 邮件服务里,所以这里以 mail 测试对象。
首先在/var/named/liumapp.com.zone 文件中添加一段 mail 的解析代码:
@ IN MX 10 mail
mail IN A 115.29.32.63
然后回到/etc/named.conf 添加一段:
zone "32.29.115.in-addr.arpa" {
type master;
file "115.29.32.zone";
};
这里需要注意一下,我在写反向解析的 zone 的时候,用的 IP 网段是反过来写的
然后我们在/var/named/下面新建一个 115.29.32.zone 文件,其内容为:
$TTL 3600
@ IN SOA 32.29.115.in-addr.arpa. liumapp.com.gmail.com(2014012200 1H 15M 1W 1D)
@ IN NS dns1.liumapp.com.
62 IN PTR dns1.liumapp.com.
63 IN PTR mail.liumapp.com.
115.29.32.62 是我们的 Bind 服务器地址,115.29.32.63 是我们的 mail 服务器地址。这里把它们两者写在一个网段里面。
最后我们用命令
dig -x 115.29.32.63 @115.29.32.62
如果 mail.liumapp.com 成功解析出来,那就说明测试成功了。
DNS 相关知识
根域
我们经常看见的域名,比如 www.liumapp.com,在 DNS 里面,它是等于 www.liumapp.com.的,注意:
- 最后面有一个“.”,这个".”就表示根域
- .com 表示一级域名
- liumapp.com 表示二级域名
域名解析过程
权威 DNS 解析
现在有这样的一个场景,我在一个 chrome 上,输入 www.liumapp.com,那么浏览器将根据以下步骤去找到我这个域名对应的 IP 地址:
- 解析器向名字服务器(及我将要搭建的 DNS server)发出“www.liumapp.com”的请求(解析器基本上每个浏览器都会有)
- 如果这台 DNS server 有 www.liumapp.com 对应的 IP 记录,那么它直接返回 IP 结果
- 如果没有,那么这台 DNS server 将把“www.liumapp.com”发向根域 server(也是一台 DNS server,全球一共 13 台根域 server)进行查询
- 根域 server 返回一级域名.com 解析服务器的 IP 地址
- 我自己的 DNS server 再将 www.liumapp.com 发往.com 解析服务器进行查询
- .com 解析服务器返回 liumapp.com 域名服务器的 IP 地址
- 我自己的 DNS server 再将 www.liumapp.com 发往 liumapp.com 域名服务器
- liumapp.com 域名服务器就将会返回我这个域名对应的:权威解析 IP 地址,这个时候,我们也把这台 liumapp.com 域名服务器称之为具有对 liumapp.com 的权威解析 server
- 我自己的 DNS server 将权威解析回来的 IP 地址进行缓存,再返回给用户
DNS 解析记录的分类
在阿里云买过域名的童鞋应该能发现,在进行域名解析的时候,会有一个下拉框,里面有:A 记录、CNAME 记录、MX 记录等等,我们的 DNS 解析记录就按这几个进行分类的。
A 记录
根据域名,返回 ip 地址,就称之为 A 记录
CNAME 记录
CNAME 记录怎么解释我自己也不好说,干脆拿一个实际应用来分析吧:
比如,我现在的 www.liumapp.com 以及是一个 A 记录了,它已经对应到了一台固定 IP 的服务器上了,当然啦,用户访问它的时候,就是访问我的博客。
现在我可能要再弄一个专门放我小电影的网站,可我又不想别人知道,所以我再整一个新的子域名:heiheihei.liumapp.com,然后我在解析的时候呢,把 heiheihei.liumapp.com 解析到 www.liumapp.com,这个时候,我们就把 heiheihei.liumapp.com 称之为 CNAME 记录,虽然它们两个域名最终是解析到同一个服务器上,但是服务器的 tomcat 或者 nginx 能够判断出来访域名的不同而做出不同的行为,www.liumapp.com 来访的时候,我的 nginx 就打开我的博客给你,heiheihei.liumapp.com 来访的时候,我的 nginx 就把小电影项目返回。(在浏览器敲了 heiheihei.liumapp.com 的童鞋请自行面壁)
就我个人的项目实战经验来看,CNAME 应用的场景是很多的,包括阿里云的 OSS、阿里云的 CDN 加速等等,这些东西具体怎么应用我之后再写新的博文进行分析。
NS
NS 记录呢,可能阿里云的域名解析并没有,因为它是在 DNS server 找不到对应 IP 的时候,返回另外一个 DNS server 的 ip 地址,这个地址呢我们就称之为 NS。
MX
针对邮件服务进行的解析,比如腾讯企业邮箱...
正向解析与反向解析
正向解析
通过域名查找 IP,返回的是一个 A 记录
反向解析
通过 IP 查找对应域名,返回的是 PTR 记录,一般在邮件系统里面用到
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于