在 Linux 中,用来提供 DNS 服务的软件包叫“bind”,软件安装好之后所启动的进程叫“named”,该进程所提供的协议叫“DNS”。

DNS 服务的安装过程非常简单,只需要通过 Yum/DNF 软件包管理器执行 dnf install bind 命令,将 bind 软件包安装到 Linux 操作系统上,示例如下:

[root@clinux ~]# dnf install bind

依赖关系解决

=======================================================================

软件包 架构 版本 仓库 大小

=======================================================================

安装:

bind x86_64 32:9.11.26-6.el8 appstream 2.1 M

事务概要

=======================================================================

安装 1 软件包

---省略部分内容---

已安装:

bind-32:9.11.26-6.el8.x86_64

完毕!

[root@clinux ~]# systemctl start named #启动 DNS 服务,

[root@clinux ~]# ps -ef | grep named #查看 DNS 服务进程

named 51365 1 0 09:41 ? 00:00:00 /usr/sbin/named -u named -c /etc/named.conf

root 51373 4039 0 09:41 pts/0 00:00:00 grep --color=auto named

[root@clinux ~]# netstat -anpt | grep named #查看 DNS 服务占用的端口

tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 51365/named

tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 51365/named

tcp6 0 0 :::1:53 :::* LISTEN 51365/named

tcp6 0 0 :::1:953 :::* LISTEN 51365/named

DNS 服务启动之后默认占用 53 端口来做 DNS 解析,另外的 953 端口是 RNDC(Remote Name Domain Controller)的端口,RNDC 是一个远程管理 DNS 服务工具,通过这个工具可以在本地或远程了解当前服务器的运行状况,也可以对服务器进行关闭、重载、刷新缓存、增加删除 zone 等操作。

DNS 服务安装完成后,其主要配置文件路径如下:

/etc/named.conf:主配置文件,bind 进程的工作属性和区域定义;

/etc/rndc.key:远程域名服务控制器(秘钥文件);

/etc/rndc.conf:远程域名服务控制器(配置信息);

/var/named/:区域数据文件目录;

/var/named/named.ca:存放的是全球的根域名服务器;

/var/named/named.localhost:专门将 localhost 解析为 127.0.0.1;

/var/named/named.loopback:专门将 127.0.01 解析为 localhost;

/var/log/named.log:日志文件;

/usr/lib/systemd/system/named.service:服务文件;

/etc/resolv.conf:Linux 操作系统配置文件,主要用来配置 DNS 服务器的指向。

主配置文件中每一行配置的含义如下:

[root@clinux ~]# vim /etc/named.conf

options {

###监听在哪一个端口(any 表示监听所有 IP 地址的 53 端口)

listen-on port 53 { 127.0.0.1; };

##监听 IPv6 的 53 端口

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";

secroots-file "/var/named/data/named.secroots";

recursing-file "/var/named/data/named.recursing";

##定义允许查询的 IP 地址,any 代表所有 ip

allow-query { localhost; };

##是否选代查询,一般只有缓存 DNS 服务器开启

recursion yes;

##是否使用秘钥

dnssec-enable yes;

##是否确认秘钥

dnssec-validation yes;

managed-keys-directory "/var/named/dynamic";

pid-file "/run/named/named.pid";

session-keyfile "/run/named/session.key";

include "/etc/crypto-policies/back-ends/bind.config";

};

##缓存文件的配置

logging {

channel default_debug {

file "data/named.run";

severity dynamic;

};

};

##根 zone 文件的配置

##zone 表示这是个 zone 配置,引号中间为配置的 zone,IN 为固定格式

zone "." IN {

##包含多种类型,常用的包括:hint 表示根 DNS 服务器,master 表示主 DNS 服务器,slave 表示从 DNS 服务器

type hint;

##对应的 zone 文件的位置

file "named.ca";

};

##读取以下两个文件

include "/etc/named.rfc1912.zones";

include "/etc/named.root.key";

除了要了解主配置文件之外,还需要知道 /var/named/ 目录下的所有 zone 文件。正常在企业中配置 DNS 服务器,需要我们手动编写一个 zone 文件。

一次完整的 DNS 服务器配置的大致过程为:搭建 DNS 服务器,解析域名 baidx.com,这里的 baidx.com是我们凭空捏造的域名,通过 DNS 服务器可以将这个域名指向任何一个IP地址,当用户通过搭建的 DNS 服务器访问 baidx.com 域名时,就会访问指定的IP地址。

需要注意的是,如果这个演示过程由我们来完成,就是一次正常的 DNS 服务器维护,若这个过程由黑客来完成,就可能是一次域名劫持攻击。

域名劫持是互联网攻击的一种方式,通过攻击 DNS 服务器或伪造 DNS 服务器的方法,把目标网站域名解析到错误的 IP 地址从而使得用户无法访问目标网站,或者蓄意要求用户访问指定IP地址(网站)。

DNS 服务器配置的具体步骤如下:

1) 修改主配置文件,增加关于 baidx.com 域名的 zone 配置(正向解析):

[root@clinux ~]# vim /etc/named.conf

----省略部分内容----

##增加关于 baidx.com 域名的 zone 配置(正向解析)

zone "baidx.com" IN {

type master; ##类型为主 DNS 服务器

file "baidx.com.zone"; ##对应的 zone 文件名

};

2) 在 /var/named/ 目录下创建第一步中定义的 zone 文件:

[root@clinux ~]# cd /var/named/

[root@clinux named]# ls

data named.ca named.localhost slaves dynamic named.empty named.loopback

##直接拷贝一个模板,改成对应的 zone 文件名称

[root@clinux named]# cp named.localhost baidx.com.zone

[root@clinux named]# vim baidx.com.zone

$TTL 1D ##生存周期

##定义 SOA 记录 主 DNS 服务器 管理员邮箱地址

@ IN SOA baidx.com. root.baidx.com. (

0 ; serial ##序列号

1D ; refresh ##刷新间隔

1H ; retry ##重试间隔

1W ; expire ##过期间隔

3H ) ; minimum ##无效记录缓存时间

##从这里开始就可以写针对此域名的各种类型的记录

##可以写 A 记录、NS 记录等,记录格式在上文已经介绍过,可以按照对应的语法格式填写

IN NS www

IN NS mail

www IN A 192.168.1.130

mail IN A 192.168.1.130

##检查配置文件中的语法错误

[root@clinux named]# named-checkconf

[root@clinux named]# named-checkzone baidx.com /var/named/baidx.com.zone

zone baidx.com/IN: loaded serial 0

OK

[root@clinux named]#

笔者这里将 www.baidx.com 和 mail.baidx.com 对应到 192.168.1.130 服务器上,在这个服务器上搭建一个网站页面。如果用户通过该 DNS 服务器访问这两个域名,将直接转到 192.168.1.130 服务器上的网页。

可以想象一下,假设这两个域名本来指向的是某个导航网站,而用户通过 DNS 服务器访问这两个域名,访问成功的并不是导航网站,而是另一个网站。其实黑客的 DNS 劫持就是通过修改 DNS 服务器上域名与 IP 地址的对应关系,来达到让用户访问指定网站的目的。

3) 修改新创建的 zone 文件的权限和属组:

[root@clinux named]# ll

------省略部分内容------

-rw-r-----. 1 root root 211 3月 13 16:09 baidx.com.zone

[root@clinux named]# chown :named baidx.com.zone

[root@clinux named]# chmod o= baidx.com.zone

[root@clinux named]# ll

------省略部分内容------

-rw-r-----. 1 root named 211 3月 13 16:09 baidx.com.zone

4) 让 DNS 服务重新加载配置文件:

[root@clinux named]# systemctl reload named

5) 使用 dig 命令验证刚才设置的域名:

[root@clinux named]# dig -t A www.baidx.com

; <<>> DiG 9.11.26-RedHat-9.11.26-6.el8 <<>> -t A www.baidx.com

;; global options: +cmd

;; Got answer:

;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41728

;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

;; OPT PSEUDOSECTION:

; EDNS: version: 0, flags; udp: 1232

; COOKIE: d50108287999f372eabbc530f622da75bf66db932eec3440f (good)

;; QUESTION SECTION:

;www.baidx.com. IN A

;; ANSWER SECTION:

www.baidx.com. 86400 IN A 192.168.1.130

;; AUTHORITY SECTION:

baidx.com. 86400 IN NS mail.baidx.com.

baidx.com. 86400 IN NS www.baidx.com.

;; ADDITIONAL SECTION:

mail.baidx.com. 86400 IN A 192.168.1.130

;; Query time: 0 msec

;; SERVER: 127.0.0.1#53(127.0.0.1)

;; WHEN: 日 3 月 13 16:12:11 CST 2022

;; MSG SIZE rcvd: 135

[root@clinux named]#

通过 dig 命令可以查询到域名对应关系是否配置成功。

6) 找一台主机,让主机的 DNS 服务地址指向这台 DNS 服务器,这样就达到了用户通过 DNS 服务器查找域名对应关系的目的。直接在 Linux 操作系统上修改 DNS 服务的指向。

[root@clinux named]# vim /etc/resolv.conf ##修改本系统的 DNS 服务指向

# Generated by NetworkManager

search localdomain

##指向到本机所搭建的 DNS 服务,这样这台机器所访问的域名都会经过这台 DNS 服务器来解析

nameserver 127.0.0.1

[root@clinux named]# nmcli c reload ens33 ##重新加载网卡,让配置生效

[root@clinux named]# ping www.baidx.com ##测试一下此域名对应的 IP 地址,已生效

PING www.baidx.com (192.168.1.130) 56(84) bytes of data.

64 bytes from 192.168.1.130 (192.168.1.130): icmp_seq=1 ttl=64 time=0.722 ms

64 bytes from 192.168.1.130 (192.168.1.130): icmp_seq=2 ttl=64 time=0.721 ms

64 bytes from 192.168.1.130 (192.168.1.130): icmp_seq=3 ttl=64 time=0.572 ms

64 bytes from 192.168.1.130 (192.168.1.130): icmp_seq=4 ttl=64 time=0.596 ms

^C

--- www.baidx.com ping statistics ---

4 packets transmitted, 4 received, 0% packet loss, time 3102ms

rtt min/avg/max/mdev = 0.572/0.652/0.722/0.076 ms

[root@clinux named]#

7) 在 Linux 操作系统的桌面上用浏览器直接访问域名,效果如下图所示:

图 1 用浏览器直接访问域名

至此,一台 DNS 服务器已经搭建完成了,剩下的步骤就是完善 DNS 服务内部的域名对应记录。综上所述,任何一台网络设备只要将 DNS 服务指向指定的 DNS 服务器,则所有的域名请求都会在该服务器进行解析。

国内有很多公共的 DNS 服务器,这里给大家推荐几个:

114DNS:114.114.114.114;

AliDNS:223.5.5.5;

Baidu Public DNS:180.76.76.76;

Tencent Public DNS:119.29.29.29。