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 |
---|---|---|---|---|---|---|
商业 | 组织 | 教育 | 政府 | 通讯 | 军事 | 信息 |
根域:
配置服务器主机名:
[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 服务默认是关闭的,不需要额外操作。
使用 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 ~]$
[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 端口。
named 配置文件的路径:
/etc/named.conf
/var/named
目录下/var/named/chroot/etc/named.conf
,#
默认不存在,需要创建/var/named/chroot/var/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";
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
配置项解释:
修改客户端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
用 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.
反向解析已经成功,大功告成!