内网DNS之 Webmin+bind

一、DNS的基本概念

1、内网搭建dns服务,有很多可选的方案比如:

CoreDNS、Bind9、dnsmasq、PowerDNS、WebminDNS

2、DNS是Domain name system的简称,有些地方也称为Domain name server

DNS主要是用于将域名解析为IP地址的协议,有时候也用于将IP地址反向解析成域名,所以DNS可以实现双向解析。

DNS可以使用TCP和UDP的53端口,基本使用UDP协议的53端口

3、域的分类

域是分层管理的,就像中国的行政级别。

最高层的域是根域(root)".",就是一个点,全球只有13个根域服务器,基本上都在美国,中国一台根域服务器都没有。

根域的下一层就是第二层次的顶级域(TLD)了,顶级域一般两种划分方法:按国家划分和按组织性质划分。

◇ 按国家划分:.cn(中国)、.uk(英国)、.us(美国)。基本都是两个字母的。

◇ 按组织性质划分:.org、.net、.com、.edu、.gov、.cc等。

◇ 反向域:arpa。这是反向解析的特殊顶级域。

顶级域下来就是普通域,公司或个人在互联网上注册的域名一般都是这些普通的域,如baidu.com。

域是从上到下授权的,每一层都只负责自己的直辖下层,而不负责下下层。例如根域给顶级域授权,顶级域给普通域授权,但是根域不会给普通域授权。

和现实中的行政管理不一样,域的授权和管理绝对不会向下越级,因为它根本不知道下下级的域名是否存在。

4、主机名、域名、FQDN

◇ 域名

不论是www.baidu.com还是tieba.baidu.com,它们的域名都是baidu.com,严格地说是"baidu.com."。这是百度所购买的com域下的一个子域名。

◇ 主机名

对于www.baidu.com来说,主机名是www,对于tieba.baidu.com来说,主机名是tieba。严格来说,www.baidu.com和tieba.baidu.com才是主机名,它们都是baidu.com域下的主机。

一个域下可以定义很多主机,只需配置好它的主机名和对应主机的IP地址即可。

◇ FQDN(完全合格域名)

FQDN是Fully Qualified Domain Name的缩写,称为完全合格域名,是指包含了所有域的主机名,其中包括根域。

FQDN可以说是主机名的一种完全表示形式,它从逻辑上准确地表示出主机在什么地方。

例如www.baidu.com的FQDN是"www.baidu.com.",com后面还有个点,这是根域;tieba.baidu.com的FQDN是"tieba.baidu.com."

5、递归查询和迭代(轮询)查询

递归的意思是找了谁谁就一定要给出答案。那么允许递归的意思就是帮忙去找位置,如A对B允许递归,那么B询问A时,A就去帮忙找答案,如果A不允许对B递归,那么A就会告诉B的下一层域的地址让B自己去找。

可以想象,如果整个域系统都使用递归查询,那些公共的根域和顶级域会忙到死,因此更好的方案就是把这些压力分散到每个个人定制的DNS服务器。

所以DNS的解析流程才会如下图。并且在客户端到DNS服务器端的这一阶段是递归查询,从DNS服务器之后的是迭代查询。也就是说,顶级域和根域出于性能的考虑,是不允许给其他任何机器递归的。

为什么客户端到DNS服务器阶段是递归查询?因为客户端本身不是DNS服务器,它自己是找不到互联网上的域名地址的,所以只能询问DNS服务器,

最后一定由DNS服务器来返回答案,所以DNS服务器需要对这个客户端允许递归。因此,dns解析器(nslookup、host、dig等)所发出的查询都是递归查询。

6、资源记录(Resource Record,RR)

对于提供DNS服务的系统(DNS服务器),域名相关的数据都需要存储在文件(区域数据文件)中。这些数据分为多种类别,每种类别存储在对应的资源记录(resource record,RR)中。

也就是说,资源记录既用来区分域数据的类型,也用来存储对应的域数据。

DNS的internet类中有非常多的资源记录类型。常用的是SOA记录、NS记录、A记录(IPV6则为AAAA记录)、PTR记录、CNAME记录、MX记录等。

(1)、SOA记录:start of authority,起始授权机构。

该记录存储了一系列数据,若不明白SOA记录,请结合下面的NS记录,SOA更多的信息见"子域"部分的内容。格式如下:

longshuai.com.      IN  SOA dnsserver.longshuai.com.    mail.longshuai.com. (
                                1     
                                3h    
                                1h    
                                1w    
                                1h )

第四指定了"dnsserver.longshuai.com."为该域的master DNS服务器。

第五列是该域的管理员邮箱地址,但注意不能使用@格式的邮箱,而是要将@符号替换为点".",正如上面的例子"mail.longshuai.com.",其实际表示的是"mail@longshuai.com"。

第六列使用括号将几个值包围起来。第一个值是区域数据文件的序列编号serial,每次修改此区域数据文件都需要修改该编号值以便让slave dns服务器同步该区域数据文件。第二个值是刷新refresh时间间隔,表示slave dns

服务器找master dns服务器更新区域数据文件的时间间隔。第三个值是重试retry时间间隔,表示slave dns服务器找master dns服务器更新区域数据文件时,如果联系不上master,则等待多久再重试联系,该值一般比

refresh时间短,否则该值表示的重试就失去了意义。第四个值是过期expire时间值,表示slave dns服务器上的区域数据文件多久过期。第五个值是negative ttl,表示客户端找dns服务器解析时,否定答案的缓存时间长度。

这几个值可以分行写,也可以直接写在同一行中使用空格分开,所以,上面的SOA记录可以写成如下格式:

longshuai.com.   IN  SOA dnsserver.longshuai.com.   mail.longshuai.com. ( 1 3h 1h 1w 1h )

前三列是声明性的语句,表示"longshuai.com."这个域内的起始授权机构为第四列的值"dnsserver.longshuai.com."所表示的主机。第五列和第六列是SOA的附加属性数据。

每个区域数据文件中都有且仅能有一个SOA记录,且一般都定义为区域数据文件中的资源记录。

注意,资源记录的作用之一是存储域相关的对应数据,所以第4、5、6列表示的是该SOA记录所存储的相关值。

(2)、NS记录:name server,存储的是该域内的dns服务器相关信息。

即NS记录标识了哪台服务器是DNS服务器。格式如下:

longshuai.com.    IN  NS  dnsserver.longshuai.com.

前三列仍然是声明性语句,表示"longshuai.com."域内的DNS服务器(name server)为第四列值所表示的"dnsserver.longshuai.com."主机。

如果一个域内有多个dns服务器,则必然有主次之分,即master和slave之分。但在NS记录上并不能体现主次关系。例如:

longshuai.com.    IN  NS  dnsserver1.longshuai.com.
longshuai.com.    IN  NS  dnsserver2.longshuai.com.

表示主机"dnsserver1.longshuai.com."和主机"dnsserver2.longshuai.com."都是域"longshuai.com."内的dns服务器,但没有区分出主次dns服务器。

容易混淆SOA和NS记录。其实,仅就它们的主要作用而言,NS记录仅仅只是声明该域内哪台主机是dns服务器,用来提供名称解析服务,NS记录不会区分哪台dns服务器是master哪台dns服

务器是slave。而SOA记录则用于指定哪个NS记录对应的主机是master dns服务器,也就是从多个dns服务器中挑选一台任命其为该域内的master dns服务器,其他的都是slave,都需要从master上获取域相关数据。由此,

SOA的名称"起始授权机构"所表示的意思也就容易理解了。

(3)、A记录:address,存储的是域内主机名所对应的ip地址。格式如下:

dnsserver.longshuai.com.    IN  A   172.16.10.15

客户端之所以能够解析到主机名对应的ip地址,就是因为dns服务器中的有A记录存储了主机名和ip的对应关系。

AAAA记录存储的是主机名和ipv6地址的对应关系。

(4)、PTR记录:pointer,和A记录相反,存储的是ip地址对应的主机名

该记录只存在于反向解析的区域数据文件中(并非一定)。格式如下:

16.10.16.172.in-addr.arpa.  IN  PTR  www.longshuai.com.

表示解析172.16.10.16地址时得到主机名"www.longshuai.com."的结果。

(5)、CNAME记录:canonical name,表示规范名的意思,其所代表的记录常称为别名记录。

之所以如此称呼,就是因为为规范名起了一个别名。什么是规范名?可以简单认为是fqdn。格式如下:

www1.longshuai.com.     IN  CNAME  www.longshuai.com.

最后一列就是规范名,而第一列是规范名即最后一列的别名。当查询"www1.longshuai.com.",dns服务器会找到它的规范名"www.longshuai.com.",然后再查询规范名的A记录,也就获得了对应的IP地址并返回给客户端。

CNAME记录非常重要,很多时候使用CNAME可以解决很复杂的问题。而且目前常用的CDN技术有一个步骤就是在dns服务器上设置CNAME记录,将客户端对资源的请求引导到与它同网络环境(电信、网通)以及地理位置近

的缓存服务器上。关于CDN的简介,见下文CDN和DNS的关系

(6)、MX记录:mail exchanger,邮件交换记录。

负责转发或处理该域名内的邮件。和邮件服务器有关,且话题较大,所以不多做叙述,如有深入的必要,请查看《dns & bind》中"Chapter 5. DNS and Electronic Mail"。

7、/etc/resolv.conf中关键字searchdomain的作用

  resolv.conf是resolver类库使用的配置文件,每当一个程序需要通过域名来访问internet上面的其它主机时,需要利用该类库将域名转换成对应的IP,然后才可进行访问.

domain:

  声明主机的域名。如果没有域名,主机名将被使用。domain mydomain.com  这个用来指定本地的域名,在没有设置search的情况下,search默认为domain的值。

search:

  它的多个参数指明域名查询顺序。当要查询没有域名的主机,主机将在由search 声明的域中分别查找。domain 和search 不能共存;如果同时存在,后面出现的将会被使用。

主要是用来补全hostname,有时候域名太长,可以做一个短域名做主机名字,但是DNS解析需要的是FQDN,而在resolv.conf中设置search能进行补全。

search google.com baidu.com  该选项可以用来指定多个域名,中间用空格或tab键隔开。当访问的域名不能被DNS解析时,resolver会将该域名加上search指定的参数,重新请求DNS,直到被正确解析或试完search指定的列表为止。

比如 ping  zjz不通

配置后

search firefoxbug.net
nameserver 114.114.114.114 

ping zjz  就成了 ping   zjz.firefoxbug.net

二、部署Webmin+bind 私有DNS服务器

sameersbn/bind - Docker Image | Docker Hub

1、运行容器

docker run --name bind -d --restart=always \
--publish 53:53/tcp \
--publish 53:53/udp \
--publish 10000:10000/tcp \
-v /etc/localtime:/etc/localtime \
-v /home/docker_v/bind/data/:/data \
--env='WEBMIN_INIT_SSL_ENABLED=false'  \
--env='ROOT_PASSWORD=zjz@2022'  \
sameersbn/bind:latest

2、开启防火墙

# 开启 NAT 转发
firewall-cmd --permanent --zone=public --add-masquerade
# 开放 DNS 使用的 53 端口,UDP
firewall-cmd --zone=public --add-port=10000/tcp --permanent
firewall-cmd --zone=public --add-port=53/tcp --permanent
firewall-cmd --zone=public --add-port=53/udp --permanent

3、登录 webmin

https://ip:10000在浏览器中打开,请注意docker env中是否有修改密码,默认账号密码是root/password。

修改语言为中文

 

4、DNS 服务配置

配置转发和传输

对应/opt/docker/bind/bind/etc/named.conf.options 配置文件

访问控制

创建新的主区域

1、添加域名

2、编辑主区域

填写内容:
1:输入名称,比如:test,后面访问的时候会自动加上主区域名称,域名全称变成:test.jingzhiz.moqi.ai
2:域名要映射的主机地址
3:确认

3、重启容器

docker restart bind

4、测试

将电脑的dns地址指向服务器地址

 ping gitlab.jingzhiz.moqi.ai
PING gitlab.jingzhiz.moqi.ai (10.1.1.145) 56(84) bytes of data.
64 bytes from zjz (10.1.1.145): icmp_seq=1 ttl=64 time=0.018 ms
64 bytes from zjz (10.1.1.145): icmp_seq=2 ttl=64 time=0.032 ms
64 bytes from zjz (10.1.1.145): icmp_seq=3 ttl=64 time=0.032 ms
64 bytes from zjz (10.1.1.145): icmp_seq=4 ttl=64 time=0.052 ms

三、DNS域名解析流程

DNS服务器里存着一张,表中放着域名和IP地址,域名和IP地址以映射关系保存,即一对一

浏览器访问某个域名,实际上是访问它的ip地址

所以浏览器需要知道域名对应的ip地址,由此产生dns解析查询流程。

以客户端浏览器访问 www.rootkit.org 域名为例,

1、首先去检查当前浏览器缓存是否有对应IP,如果有,就直接响应,如果没有,就继续往下找。

2、接着,操作系统会去检查自己的hosts文件,如果从中没找到对应关系,会再到系统dns缓存中查,如果缓存中有,就直接返回该域名所对应的ip。

3、如果缓存中没有,则会向我们事先设置好的dns服务器 [ 一般有两个, DNS1 & DNS2 ] 去请求,即所谓的`递归查询`,dns服务器首先会到自身解析数据库中去查。

4、如果dns1(dns2)服务器在自己的解析库中也没找到,它就会自动帮我们向根服务器发送询问请求。

5、此时,根看到要请求的是org的后缀(.org),就会把org所在的dns服务器告诉我们的dns。

6、然后,我们的dns服务器就会去请求org所在的dns服务器

7、当请求到达org dns服务器时,org一看域名是在rootkit这个域下的,就会把rootkit所在的dns服务器告诉我们的dns服务器

8、再然后,我们的dns服务器就会去请求rootkit这个域名的dns服务器

9、rootkit这个域的dns服务器一看是要访问www就直接找到了www对应的A记录的ip,并把它丢给我们的dns,上面逐个询问的过程,即 `迭代查询`

10、最后,我们的dns再把最终解析到的这个ip丢给我们的客户端,然后客户端就直接拿着去访问了

11、返回来的权威结果本地就会就会进行缓存,以便下次查询

简洁版
       1.先向本地dns缓存查看有没有该域名对应的ip地址,有直接跳出,没有接着往下
  2.向根dns服务器询问域名对应的ip地址(根dns服务器会让他去查询顶级dns服务器)
  3.向顶级dns服务器询问域名对应的ip地址(顶级dns服务器会让他去查询权威dns服务器)
  4.向权威dns服务器询问域名对应的ip地址(权威dns服务器会让他去查询二级dns服务器)
  5.向二级dns服务器询问域名对应的ip地址(二级dns服务器会返回对应的ip地址)
  6.接收到ip地址后,会先把ip和域名对应关系保存到本地dns缓存,以便下次方便访问

 

 

 

 

第7章 DNS & bind从基础到深入 - 骏马金龙 - 博客园 (cnblogs.com)   内容详细、全

 

posted @ 2019-10-18 21:37  凡人半睁眼  阅读(2154)  评论(1编辑  收藏  举报