写在前面的话

网上关于 DNS 的文章其实一搜索一大把,但是看别人的文档一般都会有个问题,乱,不讲究,全是 ctrl c + ctrl v,我个人是看不下去的。头皮发麻。所以决定自己来写写这方面的东西,当然很多概念性的东西还是来源于网络。至于写这篇的目的其实算是做个总结。对于 DNS 这个东西。它可能不是你工作的必须,但是有它能够解决你很多公司内网中复杂问题。我们后面提到的企业级,可能更多的还是说公司内网这样的环境,至于生产环境,人有多大胆,地有多大产吧。

DNS 概念性东西

FQDN:完全限定域名,即每个域在全球唯一,域不是域名,google.com 是域,www.google.com 是域名。

域可以分为根域(.)和顶级域(TLD

顶级域又可以分为三类:

1. 通用顶级域(.com 商业机构,.org 非营利性组织,.net 网络服务机构等)

2. 国家顶级域(.cn 中国,.uk 英国,.us 美国,.jp 日本)

3. 反向域(基础建设顶级域,.arpa

DNS 查询方式包含递归和迭代:

1. 递归是客户端发起一次请求给 DNS 服务器,通过多次查找返回正确解析。

2. 迭代是发出多次请求查询不同的 DNS 服务器。

解析方式包含正向解析和反向解析:正向解析指代将 FQDN 转换成 IP,反向则相反。

一般 DNS 的服务器类型包含:主从 DNS 服务器,缓存服务器,转发服务器。

主从好理解,就是从自动更新同步主的配置,作为 backup 存在。

缓存的服务器作用在于使用递归查询,将查询到的结果返回客户端,并缓存查询的结果。

转发服务器作用在于当发现查询不是本机的时候则将请求转发出去。

DNS 监听 TCP 和 UDP 都是 端口。

以下是一次完整的请求大致过程:

从客户机到服务器之前采用得是递归查询,而服务器之间则是采用迭代查询。

DNS 记录类型:DNS 域名数据库由资源记录和区文件指令组成。

SOA 记录:起始授权机构记录,SOA 备注说明了众多 NS(name server)记录中谁是主名称服务器,不参与功能,但是不能缺少。

NS 记录:域授权记录,当请求到达根域的时候,通过 NS 记录找到对应的域。

A 记录:当通过 NS 记录到达域以后,比如访问 www.baidu.com,通过 NS 我们找到了 baidu.com,此时就需要通过 A 记录找到 www。

MX:将该域下的所有邮件服务器地址指向邮件服务器。

AAAA 记录:A 记录处理 IPV4,AAAA 处理 IPV6。

PTR 记录:反向解析,将 IP 解析成域名。

CNAME:别名记录,允许多个名字映射到另外一个域名。比如我们 ping 百度的时候可以发现返回其实是 www.a.shifen.com 这个域名返回。所有 www.baidu.com 其实是个别名。

搭建单台 DNS

我们这里准备了三台虚拟机:

IP 系统 说明
 192.168.100.111  CentOS Linux release 7.5  DNS 服务器,主机名:demo-node1
 192.168.100.112  CentOS Linux release 7.5  客户机,主机名:demo-node2
 192.168.100.113  CentOS Linux release 7.5  客户机,主机名:demo-node3

1. DNS 服务器安装 bind 服务:

yum -y install bind-utils bind bind-devel bind-libs

2. 配置主配置文件:/etc/named.conf

options {
listen-on port 53 { any; };
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";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
allow-query { any; };
recursion yes;
dnssec-enable yes;
dnssec-validation yes;
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
forwarders { 202.96.128.166;8.8.8.8; };
}; logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
}; zone "." IN {
type hint;
file "named.ca";
}; include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

最终内容如下,红色部分为我们修改的。

3. 追加域名解析入口配置:/etc/named.rfc1912.zones

zone "dylan.com" IN {           # 测试用的域是 dylan.com
type master;
file "dylan.com.zone"; # 配置文件为 dylan.com.zone,该文件目录为 /var/named/ 下
};

4. 配置单独的解析文件:

/var/named/
cp named.localhost dylan.com.zone
chown named.named dylan.com.zone

修改配置:dylan.com.zone

$TTL 1D                                         ;TTL 修改配置生效时间,默认为一天
@ IN SOA @ rname.invalid. (
0 ; serial,配置编号,每次改完配置 +1,这样从服务器就知道更新配置
1D ; refresh,从服务器刷新时间,默认一天刷新一次
1H ; retry,如果刷新失败,默认1小时重试一次
1W ; expire,缓存过期时间,一周
3H ) ; minimum
NS @
A 127.0.0.1
AAAA ::1
www IN A 192.168.100.112

我们新加了个 www.dylan.com 的 A 记录。

4. 启动服务测试:

systemctl start named
systemctl enable named

查看端口:

netstat -tlunp | grep 53

结果如图:

我们看到除了服务本身的 53 端口外,还监听了 953,这是 dns 服务的一个插件,现在我们先不管。

本机测试解析:

dig @127.0.0.1 www.dylan.com

查看结果:

另外介绍两种检查配置的方法:

# 检查主配置
named-checkconf /etc/named.conf # 检查 zone 配置
named-checkzone dylan.com /var/named/dylan.com.zone

结果如下:

我们在客户端修改 DNS 配置测试,修改网卡 DNS 配置重启网卡:

主从 DNS 服务搭建

1. 主从 DNS 的搭建开始的时候其实是和单机搭建一样的,我们修改主服务器的配置文件:/etc/named.rfc1912.zones

将我们之前的配置进行修改:

zone "dylan.com" IN {           # 测试用的域是 dylan.com
type master;
file "dylan.com.zone"; # 配置文件为 dylan.com.zone,该文件目录为 /var/named/ 下
allow-update { 192.168.100.113; };
allow-transfer { 192.168.100.113; }; # 允许同步DNS的辅助服务器IP
also-notify { 192.168.100.113; };
notify yes;
# 启用变更通告,当主文件变更,通知从进行比较同步
};

红色部分是我们新加的,并指定了从的地址,重启服务

systemctl restart named

2. 从服务器也安装 bind 并将 /etc/named.conf 配置拷贝过来。

接着也是配置:/etc/named.rfc1912.zones,此时就能体现主从的不同:

zone "dylan.com" IN {
type slave;
file "slaves/dylan.com.zone";
masters { 192.168.100.111; }; # 指定主服务器的 IP
masterfile-format text; # 指定区域文件的格式为text,不指定有可能会为乱码
};

我们不需要再去配置 dylan.com.zone 文件,因为我们需要去主同步。所有直接启动从的 dns 服务。

systemctl start named
systemctl enable named

重启成功后我们会发现,在从服务器的 /var/named/slaves 目录下,dylan.com.zone 已经同步成功。

3. 修改主配置测试同步情况:

我们修改主服务器的 dylan.com.zone,新加解析的同时,修改配置编号,让从能够探测到变化。

此时我们重启主服务器,会发现从服务器就能够同步成功。

顺便值得一提的是,我这里使用 reload named 服务并没有使配置生效。

小结

值得一提的是,我们在域名解析过程中,还会遇到某些特殊情况:

1. @ 可以引用当区域名字,比如直接访问 baidu.com 就是这样的解析

2. 同一名字通过不同的名字定义多条记录,此时 DNS 会轮询响应。

3. 同一值可以多个名字。

4. * 泛域名解析,比如配置 *.baidu.com 指向某个 IP,那么如果你访问 a.baidu.com 这种没有配置的会默认走这个配置。

DNS:从零搭建公司内网DNS服务器的更多相关文章

  1. 外网zabbix-server使用主动模式监控公司内网windows服务器

    外网zabbix-server使用主动模式监控公司内网windows服务器 1.Zabbix Agent active批量调整客户端为主动模式监控将Template OS Windows模板调整为主动 ...

  2. 由导入paramkio包失败,而pip list又能查到此包,而引出的:离线安装python第三方库的实用方法:解决公司内网,服务器/电脑不能上网却需要安装python三方库问题(下:Linux环境中)

    问题描述: 公司的Linux服务器是内网,今天要实现某个功能,会用到python控制ssh,需要安装一个Paramkio库,和上一篇一样,仅仅依靠Pypi上下载下来的离线.whl安装包是不行的,lin ...

  3. 离线安装python第三方库的实用方法:解决公司内网,服务器/电脑不能上网却需要安装python三方库问题(上:Windows环境中)

    问题描述: 公司的windows电脑是内网,今天需要安装一个Twisted库,用过的应该都晓得,很常见的异步库,但是仅仅依靠Pypi上下载下来的离线.whl安装包是不行的,linux服务器都是远程连接 ...

  4. 使用dnsmasq快速搭建内网DNS

    背景介绍公司有一批测试服务器,之间希望通过自定义的域名进行访问,这样比较方便,但每个人每台机器都维护一个hosts的话会非常麻烦,于是想搭建一个内部的DNS服务器,对自定义的域名进行解析,同时缓存公网 ...

  5. 云计算之路-试用Azure:搭建自己的内网DNS服务器

    之前我们写过一篇博文谈到Azure内置的内网DNS服务器不能跨Cloud Service,而我们的虚拟机部署场景恰恰需要跨多个Cloud Service,所以目前只能选择用Azure虚拟机搭建自己的内 ...

  6. bind搭建内网DNS服务器架构(主从、子域授权、DNS转发器)

    实验目的 模拟企业DNS服务架构服务器及原理 实验环境准备 实验架构图 实验设备 DNS服务器4台 主服务器master(centos8):IP_192.168.100.30, 从服务器slave(r ...

  7. DNS服务——搭建企业内网DNS服务器的作用

    前言 DNS服务——服务端 和 客户端 配置 介绍了如何在DNS安装DNS服务,更改一下配置文件就可以依据根提示解析全球域名.既然使用互联网上的DNS服务器就可以解析全球域名,为何还要自掏腰包搭建DN ...

  8. 用 ROS 做内网DNS服务器

    转载:http://iliuyong.iteye.com/blog/1035692 用 ROS 做内网DNS服务器方法:1.ROS 设置IP ->DNS 选择"static" ...

  9. DNS域名解析之搭建公司内部域--技术流ken

    什么是DNS DNS( Domain Name System)是“域名系统”的英文缩写,是一种组织成域层次结构的计算机和网络服务命名系统,它用于TCP/IP网络,它所提供的服务是用来将主机名和域名转换 ...

随机推荐

  1. npm install 报错 -4048

    方法1: 删除npmrc文件. 强调:不是nodejs安装目录npm模块下的那个npmrc文件,而是在C:\Users\{账户}\下的.npmrc文件. 方法2: https://www.jiansh ...

  2. 13.生产环境中的 redis 是怎么部署的?

    作者:中华石杉 面试题 生产环境中的 redis 是怎么部署的? 面试官心理分析 看看你了解不了解你们公司的 redis 生产集群的部署架构,如果你不了解,那么确实你就很失职了,你的 redis 是主 ...

  3. spring的组件使用

    源代码下载:https://www.lanzous.com/i5p4mvc * 组件扫描 * @Component:表示这个类需要在应用程序中被创建 * @ComponentScan:自动发现应用程序 ...

  4. JS高阶---原型链

    [大纲] [主体] 1.创建函数 注意:Object内置原生对象原来就有 2.添加实例方法 3.根据构造函数创建实例对象 原型链寻找 1.本身有在本身找 2.本身没有往摸着隐式原型链往里找 或者再上层 ...

  5. mysql字段约束-索引-外键---3

    本节所讲内容: 字段修饰符 清空表记录 索引 外键 视图 一:字段修饰符 (约束) 1:null和not null修饰符   我们通过这个例子来看看 mysql> create table wo ...

  6. 201871010128-杨丽霞《面向对象程序设计(Java)》第十一周学习总结

    201871010128-杨丽霞<面向对象程序设计(Java)>第十一周学习总结 项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ ...

  7. 201871010131-张兴盼《面向对象程序设计(java)》第八周学习总结

    项目 内容 这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/ 这个作业的要求在哪里 https://www.cnblogs.com/nwnu-daizh/p ...

  8. 代码审计-strpos数组绕过

    <?php $flag = "flag"; if (isset ($_GET['ctf'])) { if (@ereg ("^[1-9]+$", $_GE ...

  9. 整合SpringTask实现定时任务

    一.框架介绍 SpringTask是Spring自主研发的轻量级定时任务工具,相比于Quartz更加简单方便,且不需要引入其他依赖即可使用. 二.Corn表达式 概述 Cron表达式是一个字符串,包括 ...

  10. nodejs接收post请求参数

    原文 https://blog.csdn.net/u013263917/article/details/78682270#1.2 nodejs接收post请求参数1.1-浏览器发送post请求参数的方 ...