怎样在滴滴云 VPC 内搭建内网 DNS 服务

DNS 服务简介

DNS 简介

DNS(Domain Name System)即域名系统。

互联网中计算机之间如何进行通讯、数据怎么走、走向哪里等等,这些都需要根据 IP 地址来指引。再如客户端访问服务器时,客户端必须知道服务器的 IP 地址才能将数据正确地发送过去。IP 地址的重要性显而易见。

我们知道 IP 地址都是由 32 位的二进制数组成的,为了便于人们记忆,出现了十进制的表示方法,如 192.168.0.1。但是人们对长串数字的记忆太困难了,更何况将来的 IPV6 ( 128 位 ) 时代,要记忆这些 IP 地址根本是不可能的,所以出现了更便于人记忆的域名来替代 IP 的记忆,如:www.didiyun.com

计算机只需要将域名和 IP 转换,就可以通过域名来访问其他的计算机。其中域名和 IP 转换工作就是 DNS 完成的,由于 DNS 极其重要,所以 DNS 在计算机网络中拥有不可缺少的地位。

本文将简单介绍如何使用 BIND(Berkeley Internet Name Domain)软件在滴滴云 VPC 内的 CentOS 云服务器来构建内网 DNS 服务。

BIND 是美国加利福尼亚大学伯克利分校开发的一个开源的 DNS 服务器,已经成为了 DNS 协议实现的事实上的标准。BIND 的服务端软件是被称作 named 的守护进程。

主机名和域名的区别?

  • 主机名是内网的名字
  • 域名是外网的名字

主机名和域名其实是两个完全可以不同的名字,但是有很多软件(如邮件系统 Postfix)会默认为它们一致。

全世界共有 13 台 DNS 根域服务器。

顶级域名:

.com .org .edu .gov .net .mil .info
商业 组织 教育 政府 通讯 军事 信息

根域:

  • cn hk us jp tw in
  • .com.cn .net.us .edu.cn

DNS 服务器特点

  • 分布式的数据库
  • 解决了数据不一致,避免了名字冲突
  • 有缓存机制,提高了性能和可靠性

域名解析过程

  1. 为了将一个名字解析成一个 IP 地址,用户应用程序调用一个称为解析器的库程序,将名字作为参数传递给它,形成 DNS 用户。
  2. DNS 用户发送查询请求给本地域名服务器,服务器首先在其管辖区域内查找名字,名字找到后把对应的 IP 地址返回给 DNS 客户。

系统环境准备

配置服务器主机名:

[dc2-user@10-254-227-137 ~]$ sudo vim /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

127.0.0.1 10-254-227-137
127.0.0.1 didicloud.com
10.254.227.137 didicloud.com -- 添加DNS服务器IP地址和主机名/别名

关闭防火墙。由于滴滴云 DC2 服务器默认带有安全组防护,所以服务器内部 Linux 防火墙 firewalld 服务默认是关闭的,不需要额外操作。

搭建 CentOS 下的 DNS 服务

在 DNS 服务器上安装 BIND 软件

使用 yum 安装 BIND:

sudo yum -y install bind*

安装完毕后,查看软件包:

[dc2-user@didicloud ~]$ rpm -qa | grep ^bind
bind-libs-9.9.4-51.el7_4.2.x86_64
bind-libs-lite-9.9.4-51.el7_4.2.x86_64
bind-sdb-9.9.4-51.el7_4.2.x86_64
bind-sdb-chroot-9.9.4-51.el7_4.2.x86_64
bind-dyndb-ldap-11.1-4.el7.x86_64
bind-license-9.9.4-51.el7_4.2.noarch
bind-utils-9.9.4-51.el7_4.2.x86_64              #提供了对DNS服务器的测试工具程序(如nslookup、dig等)
bind-9.9.4-51.el7_4.2.x86_64                    #提供了域名服务的主要程序及相关文件
bindfs-1.13.10-1.el7.x86_64
bind-pkcs11-utils-9.9.4-51.el7_4.2.x86_64
bind-pkcs11-9.9.4-51.el7_4.2.x86_64
bind-chroot-9.9.4-51.el7_4.2.x86_64             #为bind提供一个伪装的根目录以增强安全性(将“/var/named/chroot/”目录作为BIND的根目录)
bind-devel-9.9.4-51.el7_4.2.x86_64
bind-pkcs11-libs-9.9.4-51.el7_4.2.x86_64
bind-pkcs11-devel-9.9.4-51.el7_4.2.x86_64
bind-lite-devel-9.9.4-51.el7_4.2.x86_64
[dc2-user@didicloud ~]$ 

启动 DNS 服务

[dc2-user@didicloud ~]$ sudo systemctl start named.service      #启动DNS服务
[dc2-user@didicloud ~]$ sudo systemctl enable named.service     #设置为开机启动
Created symlink from /etc/systemd/system/multi-user.target.wants/named.service to /usr/lib/systemd/system/named.service.

服务启动完毕,查看监听端口 53 是否都起来了:

[dc2-user@didicloud ~]$ sudo  netstat -anlp | grep named 
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      2625/named          
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN      2625/named          
tcp6       0      0 ::1:53                  :::*                    LISTEN      2625/named          
tcp6       0      0 ::1:953                 :::*                    LISTEN      2625/named          
udp        0      0 127.0.0.1:53            0.0.0.0:*                           2625/named          
udp6       0      0 ::1:53                  :::*                                2625/named          
unix  2      [ ]         DGRAM                    20330    2625/named           
[dc2-user@didicloud ~]$ 

named 默认监听 TCP、UDP 协议的 53 端口,以及 TCP 的 953 端口。

  • UDP 53 端口一般对所有客户机开放,以提供解析服务
  • TCP 53 端口一般只对特定从域名服务器开放,提高解析记录传输通道
  • TCP 953 端口默认只对本机(127.0.0.1)开放,用于为 rndc 远程管理工具提供控制通道

named 配置文件的路径:

  1. 没有安装 bind-chroot 软件包
    • 配置文件为 /etc/named.conf
    • 数据文件在 /var/named 目录下
  2. 安装了 bind-chroot 软件包
    • 配置文件为 /var/named/chroot/etc/named.conf# 默认不存在,需要创建
    • 数据文件在 /var/named/chroot/var/named 目录

查看 named 服务的配置文件

options {	// options是全局服务器的配置选项,在这里指定的参数,对配置中的任何区域都有效
	listen-on port 53 { 127.0.0.1; };	// 指定域名服务监听的网络端口,建议写本机IP,减少服务器消耗
	listen-on-v6 port 53 { ::1; };
	directory 	"/var/named";		//  指定named从/var/named目录下读取DNS数据文件
	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; };		// 允许哪些客户端访问DNS服务,此处改为“any”,表示任意主机

	recursion yes;				// 开启递归查询

	dnssec-enable yes;			// 开启加密
	dnssec-validation yes;			// 在递归查询服务器上开启DNSSEC验证

	/* 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 {					// named服务的日志文件信息
        channel default_debug {
                file "data/named.run";
                severity dynamic;
        };
};

//  每一个zone就是定义一个域的相关信息以及指定了named服务从哪些文件中获得DNS各个域名的数据文件
zone "." IN {					// 根(.)域的配置及信息
	type hint;				// 服务器类型
	file "named.ca";			// 文件路径位置
};

include "/etc/named.rfc1912.zones";		// include代表该文件是子配置文件
include "/etc/named.root.key";

正向解析(将域名解析为 IP 地址)

修改 DNS 服务配置文件

sudo vim  /etc/named.conf                    # 主配置文件
options {
	listen-on port 53 { 10.254.91.106; };   # 将127.0.0.1改成本机IP地址
	listen-on-v6 port 53 { ::1; };
	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; };               # 将localhost改成any

添加域的信息写在子配置文件

 sudo vim /etc/named.rfc1912.zones 

在配置文件末尾添加如下的配置项:

zone "didicloud.com" IN {
	type master;
	file "data/didicloud.com.zone";
};

编辑正向解析文件

sudo vim /var/named/data/didicloud.com.zone

添加如下的 DNS 解析记录:

$TTL    86400
@               IN SOA  tom jerry (
					20171224      	; serial
     					3H              ; refresh
                                        15M             ; retry
                                        1W              ; expiry
                                        1D )            ; minimum
               IN NS            ns.didicloud.com.            ; notice : don't forget the dot in the end
               IN MX 10         mail.didicloud.com.
www             IN A            10.254.91.106
ns              IN A            10.254.91.106
mail            IN A            10.254.91.106
ftp             IN CNAME        www

配置项解释:

  • serial:序列号。可以供从服务器判断何时获取新数据的,这里我设成今天的日期。更新数据文件必须要更新这个序列号,否则从服务器将不更新。
  • refresh:指定多长时间从服务器要与主服务器进行核对。
  • retry:如果从服务器试图检查主服务器的序列号时,主服务器没有响应,则经过这个时间后将重新进行检查。
  • expire:将决定从服务器在没有主服务器的情况下权威地持续提供域数据服务的时间长短。
  • minimum:高速缓存否定回答的存活时间。
  • SOA 记录:每个区仅有一个 SOA 记录,该区一直延伸到遇见另一个 SOA 记录为止。SOA 记录包括区的名字,一个技术联系人和各种不同的超时值。
  • IN 记录:使用 “IN”,对应的是 internet。
  • A 记录:是 DNS 数据库的核心。一个主机必须为它的每个网络接口得到一条 A 记录。
  • NS 记录:识别对一个区有权威性的服务器(即所有主服务器和从服务器),并把子域委托给其他机构。
  • MX 记录:电子邮件系统就是使用 MX 记录来更有效的路由邮件。
  • PTR 记录:从 IP 地址到主机名的反向映射。与 A 记录一样,必须为每个网络接口有一条 PTR 记录。

客户端测试

修改客户端DNS NameServer 配置:

sudo vim /etc/resolv.conf 

在首行添加如下配置:

nameserver 10.254.91.106

测试 ping 域名:

[dc2-user@10-254-91-106 ~]$ ping www.didicloud.com
PING www.didicloud.com (10.254.91.106) 56(84) bytes of data.
64 bytes from 10-254-91-106 (10.254.91.106): icmp_seq=1 ttl=64 time=0.012 ms
64 bytes from 10-254-91-106 (10.254.91.106): icmp_seq=2 ttl=64 time=0.023 ms
64 bytes from 10-254-91-106 (10.254.91.106): icmp_seq=3 ttl=64 time=0.025 ms
64 bytes from 10-254-91-106 (10.254.91.106): icmp_seq=4 ttl=64 time=0.022 ms
^C

反向解析(将 IP 地址解析成域名)

修改 DNS 服务的配置文件

用 VIM 编辑修改 named 的配置文件:

[dc2-user@10-254-91-106 ~]$ sudo vim  /etc/named.rfc1912.zones

在文件最后添加如下的配置:

zone "91.254.10.in-addr.arpa" IN {
	type master;
        file "data/10.254.91.zone";
};

编辑反向解析文件

[dc2-user@10-254-91-106 ~]$ sudo vim /var/named/data/10.254.91.zone

内容如下所示:

$TTL    86400
@       IN      SOA     ns.didicloud.com. root (
                                        20171224      ; serial
                                        1D      ; refresh
                                        1H      ; retry
                                        1W      ; expire
                                        3H )    ; minimum
@     IN      NS      ns.didicloud.com.
106     IN      PTR     www.didicloud.com.
@     IN      PTR     www.didicloud.com.
106     IN      PTR     mail.didicloud.com.
106     IN      PTR     ns.didicloud.com.

然后,重启 BIND 服务:

[dc2-user@10-254-91-106 ~]$ sudo systemctl restart named

测试反向解析是否生效:

[dc2-user@10-254-91-106 ~]$ nslookup 10.254.91.106
Server:		10.254.91.106
Address:	10.254.91.106#53

106.91.254.10.in-addr.arpa	name = www.didicloud.com.
106.91.254.10.in-addr.arpa	name = ns.didicloud.com.
106.91.254.10.in-addr.arpa	name = mail.didicloud.com.

反向解析已经成功,大功告成!

猜你喜欢

转载自blog.csdn.net/java060515/article/details/86004596
今日推荐