0%

DNS与Bind

基于《DNS与Bind》的学习

DNS基础

TCP/IP网络依赖IP地址进行设备间通信,但是数字形式的IP地址难以记忆,所以使用域名(如www.google.com)解析成IP地址,以便访问该网络设备。

本机上的/etc/hosts中存放了部分域名到IP地址的映射,可以手工维护,分散式管理映射。

如在mac中的Finder中按下Shift+command+G,输入/etc/hosts,即可找到本机的名称解析配置文件。

hosts文件不可能存下所有的(域名,IP地址)映射,于是便引入了DNS。

域名系统(Domain Name System,DNS)通过分布式的数据库来实现IP地址和域名的映射。

DNS基于C/S架构,服务端端口号UDP53、TCP53。

DNS域名结构

DNS采用分布式的数据库,是一个逆向的树形结构。

DNS树每个节点代表一个域

DNS域名空间

  • 根域名服务器

    最高层的域就是根域root,全球共13台根域名服务器,根域即是一个点 . ,通常都省略不写。

  • 顶级域名服务器

    又称一级域名,常见的有”.com”、”.org”、”.net”、”.cn”等。

剩下的域为二级、三级、四级域,最多可达127级域名。

FQDN 全称域名 = 主机名 + 域名

www.baidu.comtieba.baidu.com 为例
baidu.com 为域名,wwwtieba 都是 baidu.com 下的主机,一个域下可以定义多台主机,只需配置好主机名和对应主机的IP地址即可。

www.baidu.com本该有一个根域名的 .,即 www.baidu.com.,但根域名的 . 一般省略不写。

DNS查询方法

迭代查询

递归查询

缓存和更新

域名解析顺序

  • 查找 /etc/hosts

DNS软件BIND

BIND是一款提供DNS服务的软件,Centos安装BIND作为DNS服务器,程序名称为named

BIND相关程序包有4个:

  • bind:服务器
  • bind-libs:相关库
  • bind-utils:客户端工具
  • bind-chroot:安全包

Bind安装

在Centos上使用yum安装的bind

  • 切换到root用户,以获取权限

    1
    su root
  • 使用yum安装Bind

    1
    yum -y install bind
  • 安装完bind后,相关程序包存在依赖性,也会一起安装,可以用rpm查看是否顺带安装了相关程序包

    1
    rpm -qi bind-libs
    1
    rpm -qi bind-utils
    1
    rpm -qi bind-chroot

    如缺少bind-libsbind-utils,建议单独安装

BIND包相关文件

查询BIND包相关文件列表

1
rpm -ql bind

里面的常用文件介绍:

  • BIND主程序:/usr/sbin/named
  • 主配置文件:/etc/named.conf
  • 数据库目录:/var/named

启动DNS服务

启动named程序,本机即可充当DNS服务器

1
systemctl start named

查看DNS服务器

方法一:可视化页面中查看DNS

右上角 Wired Settings -> Wired的设置 -> DNS

方法二:查看DNS客户机配置文件(/etc/resolv.conf)

/etc/resolv.conf是DNS客户机配置文件

1
cat /etc/resolv.conf

查看该文件

1
2
3
# Generated by NetworkManager
search localdomain
nameserver 192.168.45.2

查看nameserver项,可以看出使用的DNS服务器的IP地址为192.168.45.2

方法三:查看网卡配置文件(/etc/sysconfig/network-scripts/ifcfg-ens33)

每种Linux系统的网卡配置文件路径不同,详见 相关文件配置 -> 网卡配置文件

1
cat /etc/sysconfig/network-scripts/ifcfg-ens33

查看DNS配置选项

设置DNS服务器

CentOS配置网卡为静态IP

DHCP协议会自动动态配置IP和DNS服务器,为了方便学习DNS,建议改为静态IP模式学习。

如本身就是静态IP,请跳过此步。

查看是静态IP还是动态IP

可以在网卡配置文件中查看采用的是DHCP协议还是静态IP

查看网卡配置文件

1
cat /etc/sysconfig/network-scripts/ifcfg-ens33

显示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TYPE="Ethernet"
PROXY_METHOD="none"
BROWSER_ONLY="no"
BOOTPROTO="dhcp"
DEFROUTE="yes"
IPV4_FAILURE_FATAL="no"
IPV6INIT="yes"
IPV6_AUTOCONF="yes"
IPV6_DEFROUTE="yes"
IPV6_FAILURE_FATAL="no"
IPV6_ADDR_GEN_MODE="stable-privacy"
NAME="ens33"
UUID="0a5c00b5-f7bc-49cf-9a58-11ca6df07fe2"
DEVICE="ens33"
ONBOOT="yes"

查看BOOTPROTO选项,如果是dhcp,则采用DHCP协议;如是static,则采用静态IP

配置网卡为静态IP

  • 打开网卡配置文件

    1
    vi /etc/sysconfig/network-scripts/ifcfg-ens33
  • 修改配置

    1
    2
    BOOTPROTO=static
    ONBOOT=yes
  • 增加配置

    查看网络配置,手动填入

    1
    2
    3
    IPADDR=192.168.45.130
    NETMASK=255.255.255.0
    GATEWAY=192.168.45.2
  • 重启网卡

    1
    nmcli connection reload
    1
    nmcli connection up ens33

    或者

    1
    systemctl restart network

此时,网卡配置文件内容如下

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=0a5c00b5-f7bc-49cf-9a58-11ca6df07fe2
DEVICE=ens33
ONBOOT=yes
IPADDR=192.168.45.130
NETMASK=255.255.255.0
GATEWAY=192.168.45.2

没有配置DNS服务器,查看DNS服务器,也都是为空

此时,尝试ping一下域名

1
ping baidu.com

没有DNS服务器,域名解析失败

设置DNS服务器

  • 编辑网卡配置文件,修改DNS服务器,如尝试加入本机IP作为DNS服务器

    1
    vi /etc/sysconfig/network-scripts/ifcfg-ens33

    加入一行DNS配置,127.0.0.1是送回地址,指本机。

    1
    DNS1=127.0.0.1

    如有多个DNS服务器,则DNS1、DNS2依次类推

  • 重启该网卡

    1
    nmcli connection reload
    1
    nmcli connection up ens33
  • 重新查看DNS服务器

    1
    cat /etc/resolv.conf

    显示

    1
    nameserver 127.0.0.1

    可以看到127.0.0.1添加进了DNS服务器中,此时本机既是DNS服务器,又是DNS的客户端

  • 启动BIND的DNS服务

    1
    systemctl start named
  • ping一下域名

    1
    ping baidu.com

    ping成功,本机作为DNS服务器完成了baidu.com的域名解析

多IP配置

一台虚拟机可以配置多个静态IP,即多网卡。

上面的DNS配置只利用了单网卡ens33,同时作为DNS服务器和客户机。

可以配置多个IP地址,分别作为DNS服务器和客户机。

多IP配置

1
2


主DNS配置

相关文件配置

DNS客户机配置文件 /etc/resolv.conf

/etc/resolv.conf是DNS客户机配置文件,用于设置DNS服务器的IP地址及DNS域名,供域名解析器(resolver)使用。

每一行以一个关键字开头,后接一个或多个由空格隔开的参数。

关键字

关键字有四个:(nameserver是必填项,其余的关键字都是可选)

  • nameserver
    • 表明DNS服务器的IP地址
    • 可以有多行,按顺序查询,如果前面的IP无响应,则查询下一个IP
  • domain
    • 声明主机的域名
    • 很多程序用到它,如邮件系统;当为没有域名的主机进行DNS查询时,也要用到。如果没有域名,主机名将被使用,删除所有在第一个点( .)前面的内容
  • search
    • 它的多个参数指明域名查询顺序。当要查询没有域名的主机,主机将在由search声明的域中分别查找
    • 如要域名 www 解析,但 www 无法解析,如配置中有 search baidu.com ,则在www后加上 . + baidu.com ,对 www.baidu.com重新进行解析
    • domainsearch不能共存;如果同时存在,后面出现的将会被使用
  • sortlist
    • 允许将得到域名结果进行特定的排序。它的参数为网络/掩码对,允许任意的排列顺序

域名解析顺序

  1. 查找 etc/hosts
  2. 根据 nameserver 指定的DNS服务器解析域名
  3. 如果所有的 nameserver 都找不到域名,则进行search补全,重新走1~2步

示例分析

查看/etc/resolv.conf文件

1
cat /etc/resolv.conf

1
2
3
# Generated by NetworkManager
search localdomain
nameserver 192.168.45.2

网卡配置文件 /etc/sysconfig/network-scripts/ifcfg-ens33

Centos可在/etc/sysconfig/network-scripts目录下查找网卡配置文件,Linux传统网卡设备命名是eth0eth1这样的,而Centos提供了不同的命名规则,比如ens33(Ubuntu的网卡配置文件有所不同)

查看网卡配置文件

1
cat /etc/sysconfig/network-scripts/ifcfg-ens33
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
TYPE=Ethernet   #网卡类型:为以太网
PROXY_METHOD=none # 代理方式:关闭状态
BROWSER_ONLY=no # 只是浏览器:否
BOOTPROTO=dhcp # 网卡的引导协议:DHCP[中文名称: 动态主机配置协议]
DEFROUTE=yes # 默认路由:是
IPV4_FAILURE_FATAL=no # 是不开启IPV4致命错误检测:否
IPV6INIT=yes # IPV6是否自动初始化: 是
IPV6_AUTOCONF=yes # IPV6是否自动配置:是
IPV6_DEFROUTE=yes # IPV6是否可以为默认路由:是
IPV6_FAILURE_FATAL=no # 是不开启IPV6致命错误检测:否
IPV6_ADDR_GEN_MODE=stable-privacy # IPV6地址生成模型:stable-privacy
NAME=ens33 # 网卡物理设备名称
UUID=0a5c00b5-f7bc-49cf-9a58-11ca6df07fe2 # 通用唯一识别码, 每一个网卡都会有, 不能重复, 否两台linux只有一台网卡可用
DEVICE=ens33 # 网卡设备名称, 必须和 `NAME` 值一样
ONBOOT=yes # 是否开机启动,要想网卡开机就启动或通过 `systemctl restart network`控制网卡,必须设置为 `yes`

参考