一、涉及理论和工具
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百出,老是追踪不到报错的缘由,差点就想放弃了,不过也是积累了很多教训,最后总算是搭建出来了,虽然感觉也还是差点意思,很多地方也没有去深究,但是也尽力了,最后能成功的开放使用也还是很有成就感的;
当然也学习巩固了很多知识,动手去感受域名解析的层层推进,根据日志文件去了解到很多域名解析的流程方法,理解了本地解析和权威解析的关系,算是懂了域名解析到底是怎么个流程,收获还是很足的,虽然踩了很多坑,但也算跌跌撞撞的成功了,果然理论和实践是不一样的啊,还得要沉淀!!