Ubuntu使用bind9搭建DNS服务器 | 青训营

一、涉及理论和工具

DNS服务器(Domain Name System):

DNS是指域名解析系统,用于将网页设置的域名转换为机器可读的IP地址以供设备互访通信,方便用户使用简单易记的域名访问网站而不用记忆冗长的IP地址;

当用户在浏览器中使用URL访问网页时,浏览器需要连接到托管该网页的web服务器,因此浏览器需要向DNS服务器发送DNS查询请求,然后DNS服务器会检查其本地缓存,查找所请求域名的IP地址,如果找到缓存条目,则立即返回 IP 地址,如果没有缓存条目或缓存已过期,则服务器将执行一系列DNS查询来查找IP地址:

  • 本地DNS服务器首先会查询自己的缓存,看是否有相同域名的解析记录,如果有,会直接返回缓存中的IP地址,无需向其他服务器发出查询请求;
  • 如果本地DNS服务器的缓存中没有相应的记录,它会向根DNS服务器发送查询请求,询问负责顶级域名(例如.com、.org、.net等)的权威DNS服务器的地址;
  • 接着,本地DNS服务器会向负责请求的顶级域名的权威DNS服务器发送查询请求,该权威DNS服务器可能会返回负责次级域的权威DNS服务器的地址;
  • 本地DNS服务器继续向次级域名的权威DNS服务器发送查询请求,直到找到包含所需域名解析信息的权威DNS服务器,一旦本地DNS服务器收到来自权威DNS服务器的响应,它会将该信息缓存,并将IP地址返回给发起查询的设备。

权威DNS(Authoritative DNS):

权威DNS服务器是负责管理特定域名解析的服务器,每个特定域名都有一组权威DNS服务器,它们保存该域名及其子域名的DNS记录。这些记录包括与该域名关联的IP地址、邮件服务器记录和其他DNS记录类型。

当本地DNS服务器需要解析特定域名时,它会向该域名的权威DNS服务器发出查询请求。权威DNS服务器将回答该查询并返回该域名对应的IP地址或其他记录。权威DNS服务器是域名解析的最终授权来源,因此其提供的信息被认为是权威和可信的。

本地DNS(Local DNS):

本地DNS服务器也称为递归DNS服务器。当您的计算机或其他网络设备需要解析域名时,通常会首先向本地DNS服务器发送查询请求,本地DNS服务器不直接保存所有域名的完整DNS记录,而是负责进行递归查询以找到所需的IP地址。

bind9工具:

开源的DNS服务器软件,提供域名解析服务,提供域名解析为IP的正向解析和IP解析为域名的反向解析两种服务,同时支持多种DNS记录类型A/AAAA、CMAKE、MX等,对其中的配置文件进行合理的编写配置后可以搭建管理自己的DNS服务器。

二、实验准备:

Linux操作系统:

选择在Linux操作系统下搭建,由于我的机器是Windows系统,事先下载安装了VMware并创建安装了Ubuntu虚拟机:

链接:VMware 中国 - 交付面向企业的数字化基础 | CN,现在不需要注册就可以下载,进入后点击:产品------>Workstation Pro------>下载试用版,选择自己操作系统的版本即可,激活方法大家可以网上找找,Ubuntu建议清华镜像源下载:清华大学开源软件镜像站 | Tsinghua Open Source Mirror

bind9安装:

在Linux命令行依次执行以下命令:

Linux 复制代码
sudo su  //root用户认证
apt-get update  //更新源列表
apt-get install bind9  //安装bind9

在目录/etc中出现bind目录表示安装成功:

目录创建和权限更改:

这一步非常重要,后续的配置代码涉及到日志文件的输出和文件的改写,为了方便和不出错,最好提前设置好,首先使用命令chmod -R 777 /etc/bind打开bind目录的读写权限,方便改写named.conf和创建.com.zone文件;

由于资料【网络与部署 学习资料(上)】字节跳动青训营 - 后端专场 - 掘金 (juejin.cn)中提供的named.conf代码涉及到日志输出,需要改写/var/log/named目录,首先进入目录发现是没有named目录的,使用mkdir /var/log/named创建named目录后同样使用chmod -R 777 /var/log打开读写权限,否则后续会由于没有创建文件的权限,导致看不到日志文件的输出。

三、实验步骤:

1.创建并运行网页:

创建一个html文件并在127.0.0.1:8080运行,由于Linux自带python3,创建HTML文件后终端进入文件所在目录下使用指令python3 -m http.server 8080 --bind 127.0.0.1运行一个简单的HTTP服务器指定IP:127.0.0.1和端口:8080,这样可以实现一个最简单的网页以便后续的调试操作;

2.host劫持:

更改/ect/hosts文件,加入127.0.0.1 www.toutiao.com,将域名www.toutiao.com劫持到指定的127.0.0.1上用于调试;

先执行apt install curl安装curl,然后使用命令:curl http://www.toutiao.com:8080 -w '\n'查看劫持效果,输出为html文件内容,证明劫持成功,如果是后端服务则会输出json等响应:

3.权威DNS和LocalDNS搭建:

代码来源:【网络与部署 学习资料(上)】字节跳动青训营 - 后端专场 - 掘金 (juejin.cn)

创建zone文件:

使用touch lyweb.com.zone创建权威侧zone文件(文件名随意,后缀名不能错),注意其中的IP可以进行更改,最好与前面步骤中绑定的IP相同,ns1后的域名要更改为与文件名相同:

zone 复制代码
$TTL 10M
@   IN    SOA    ns1.example.com    admin.example.com. (
        0       ; serial
        1D      ; refresh
        1H      ; retry
        1W      ; expire
        3H )    ; minimum

@    IN    NS   ns1.lyweb.com.
; 这里ns1主机的ip地址可以换成本机地址
ns1        A    127.0.0.1
; 这里www主机的ip地址可以换成本机地址
www        A    127.0.0.1

更改named.conf主配置文件:

在/etc/bind目录下会看到以下配置文件:

  • /etc/bind/named.conf:主配置文件,包含bind服务器的全局设置和引用其他配置文件的指令;
  • /etc/bind/named.conf.options:包含bind服务器的全局选项设置,如监听地址、转发器等;
  • /etc/bind/named.conf.local:用于配置本地区域(zone)和其他定制区域的文件;
  • /etc/bind/named.conf.default-zones:定义了一些默认的区域(zone),如 localhost、反向解析等。

由于named.conf是主配置文件,配置在其他文件下后也最终会引入主配置文件进行执行,所以我们的配置代码可以直接全部写在该文件下,其中:

  • logging是日志配置,查看代码就知道,日志会写入/var/log/named目录下,所以在最开始我们开这几个文件夹的读写权限就是很必要的,不然就会无法输出日志文件;
  • options配置监听地址和转发器的地方,这里还有一个坑,options配置原本应该写在named.conf.options文件下,此时我们打开named.conf.options文件会发现,其中已经写好了一个简单的options配置,因此我们必须将其删除或注释,否则在运行时会出现重定义的错误;
  • zone即区域配置文件,每一个zone都会对应一个单独存在的.zone结尾的配置文件,此处就直接把我们写好的.com.zone写入即可。

同样需要根据自己的需求更改IP和zone的配置,但是这里的53端口建议暂时不要更改:

conf 复制代码
logging {
 channel default_log {
        #这里注意提前创建log目录
        file "/var/log/named/named.log" versions 10 size 200m;
        severity dynamic;
        print-category yes;
        print-severity yes;
        print-time yes;
    };
    channel query_log {
        file "/var/log/named/query.log" versions 10 size 200m;
        severity dynamic;
        print-category yes;
        print-severity yes;
        print-time yes;
    };
    channel resolver_log {
        file "/var/log/named/resolver.log" versions 10 size 200m;
        severity dynamic;
        print-category yes;
        print-severity yes;
        print-time yes;
    };
    category default {default_log;};
    category queries {query_log;};
    category query-errors {query_log;};
    category resolver {resolver_log;};
};

options {
    #这里的ip地址可以换成本机地址
    listen-on port 53 { 127.0.0.1; };
    directory "/etc/bind";
    dnssec-validation no;
    #支持递归查询
    recursion yes;
    #转发到公共DNS优先,而不是自己去迭代查询,节省网络IO资源消耗
    forward first;
    forwarders {
        223.5.5.5;
        223.6.6.6;
    };
    allow-query { any; };
    listen-on-v6 { any; };
};

zone "lyweb.com" {
    type master;
    file "lyweb.com.zone";
};

运行DNS服务器:

确认上述配置没有问题后使用命令service named start运行配置好的DNS服务器,大家看网上的大部分教程可能都说用systemctl start named命令运行,但是经过我的无数次试错之后,发现还是service命令不会产生奇奇怪怪的报错,systemctl命令总是在一两次成功后突然就不能启动,产生报错,所以建议还是不用;

同时每一次启动了服务器之后,如果发现配置有误,建议先用service named stop停止服务后再更改配置再重新启动,在没有关闭后直接配置重新启动或者用restart命令都会出一些奇怪的错(反正我遇到了);

启动之后可以使用service named status查看启动情况:

4.验证服务:

验证权威DNS服务:

启动服务器后使用dig指令dig @127.0.0.1 www.lyweb.com,注意IP和域名要换成自己配置的;

查看query.log日志:

验证LocalDNS服务:

启动服务器后使用dig指令dig @127.0.0.1 www.toutiao.com:

查看query.log日志:

5.开放DNS服务器:

针对本机开放:

此时直接在本机使用域名访问网站 www.lyweb.com:8080 是无法解析到127.0.0.1:8080进行访问的,因为此时域名服务器是只针对了127.0.0.1地址的服务:

如果想向本地设备开放此域名服务器,就需要在named.conf中将IP改为any(如果考虑安全还是要改成本机IP或需要开放设备的IP),然后把DNS服务器地址改成当前虚拟机的IPv4地址,再次访问 www.lyweb.com:8080 后即可解析成功:

找到IPv4并写入DNS服务器地址:

再次使用域名访问:

使用被劫持的域名访问:

查看query.log日志:

针对外部设备开放:

默认情况下,bind9允许对本地区域的查询,但不允许外部设备进行递归查询,想要开放使用bind9 DNS服务器,需要修改配置允许外部设备进行递归查询,即在neamed.conf的options中增加语句allow-recursion { any; };

增加后重新运行,此时我们使用Windows的真机来连接该服务器进行使用,在真机的网络属性设置中将DNS服务器分配改成手动,在首选DNS中写入虚拟机的IPv4(如果后续操作发现连接有问题,可以把IPv6也写入),此时保证虚拟机开机且bind9正常运行;

在Windows命令行中执行ipconfig /all查看DNS服务器是否更改为虚拟机的IP地址:

看到成功更改后就说明已经连上了虚拟机的DNS服务器,此时我们访问www.juejin.cn 后再查看DNS服务器的query.log日志文件,可以看到成功通过服务器进行了域名解析,这样就成功搭建并连接了属于自己的域名解析服务器了!

四、总结:

虽然这样写下来感觉好像也不是特别复杂,但是这个实验真的花了很多时间,本来想合着web服务器一起做的,但是实在是一时半会搞不下来,虚拟机本就容易出问题,好几次火狐都打不开了,bind9又是bug百出,老是追踪不到报错的缘由,差点就想放弃了,不过也是积累了很多教训,最后总算是搭建出来了,虽然感觉也还是差点意思,很多地方也没有去深究,但是也尽力了,最后能成功的开放使用也还是很有成就感的;

当然也学习巩固了很多知识,动手去感受域名解析的层层推进,根据日志文件去了解到很多域名解析的流程方法,理解了本地解析和权威解析的关系,算是懂了域名解析到底是怎么个流程,收获还是很足的,虽然踩了很多坑,但也算跌跌撞撞的成功了,果然理论和实践是不一样的啊,还得要沉淀!!

相关推荐
千慌百风定乾坤13 小时前
Go 语言入门指南:基础语法和常用特性解析(下) | 豆包MarsCode AI刷题
青训营笔记
FOFO13 小时前
青训营笔记 | HTML语义化的案例分析: 粗略地手绘分析juejin.cn首页 | 豆包MarsCode AI 刷题
青训营笔记
滑滑滑2 天前
后端实践-优化一个已有的 Go 程序提高其性能 | 豆包MarsCode AI刷题
青训营笔记
柠檬柠檬3 天前
Go 语言入门指南:基础语法和常用特性解析 | 豆包MarsCode AI刷题
青训营笔记
用户967136399653 天前
计算最小步长丨豆包MarsCodeAI刷题
青训营笔记
用户52975799354723 天前
字节跳动青训营刷题笔记2| 豆包MarsCode AI刷题
青训营笔记
clearcold4 天前
浅谈对LangChain中Model I/O的见解 | 豆包MarsCode AI刷题
青训营笔记
夭要7夜宵4 天前
【字节青训营】 Go 进阶语言:并发概述、Goroutine、Channel、协程池 | 豆包MarsCode AI刷题
青训营笔记
用户336901104444 天前
数字分组求和题解 | 豆包MarsCode AI刷题
青训营笔记
dnxb1234 天前
GO语言工程实践课后作业:实现思路、代码以及路径记录 | 豆包MarsCode AI刷题
青训营笔记