在 Red Hat Enterprise Linux 8 搭建 DNS 服务器

在 Red Hat Enterprise Linux 8 搭建 DNS 服务器

1 DNS 简介

  • DNS 的全称是 Domain Name System, 域名系统. 它在网络中扮演着域名与 IP 地址之间相互映射的角色. 通常使用的端口是 53.
  • DNS正向解释就是通过域名来查找对应的 IP 地址
  • DNS反向解释就是通过 IP 地址来查找对应的域名

2 搭建环境

  • Red Hat Enterprise Linux release 8.4 (Ootpa)
  • bind-9.11.26-4.el8_4.x86_64
  • DNS 服务器 RHEL8.4 , IP 100.100.100.30
  • DNS 测试客户端 RHEL8.4, IP 100.100.100.20
  • 要解释的域名是 samlee.com 对应的IP是 100.100.100.33

3 搭建步骤简介

  • 1 安装 bind RPM
  • 2 配置防火墙 (根据需要可选)
  • 3 配置selinux 上下文 (根据需要可选)
  • 4 修改 /etc/named.conf 配置文件
  • 5 修改 named.rfc1912.zones 域配置文件
  • 6 创建正向与方向解释的 zone 文件 named.samlee.zone.pos , named.samlee.zone.rev
  • 7 启动 named 服务并设定开机启动
  • 8 测试验证

4 具体搭建步骤

4.1 安装 bind RPM

1
# yum install -y bind

4.2 可选 配置防火墙,允许报文访问 DNS 端口 (如果开启防火墙则需要这一步)

1
2
# firewall-cmd --permanent --add-service=dns
# firewall-cmd --reload

4.3 可选 配置 SELinux 上下文 (如果开启了SELinux并且上下文错误,则需要这一步)

  • 首先检查是否上下文是否正确,如果入例子输出则无需修改,否则就需要修改
    1
    2
    3
    4
    # ls -Zl /etc/named.conf
    -rw-r-----. 1 root named system_u:object_r:named_conf_t:s0 1693 Nov 4 08:20 /etc/named.conf
    # ls -Zl /etc/named.rfc1912.zones
    -rw-r-----. 1 root named system_u:object_r:named_conf_t:s0 1138 Nov 3 20:37 /etc/named.rfc1912.zones
  • 修改上下文并使之生效
    1
    2
    3
    4
    # semanage fcontext -a -t named_conf_t /etc/named.conf
    # semanage fcontext -a -t named_conf_t /etc/named.rfc1912.zones
    # restorecon -RFvv /etc/named.conf
    # restorecon -RFvv /etc/named.rfc1912.zones

    4.3 修改 /etc/named.conf 配置文件

  • 修改文件
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    options {
    listen-on port 53 { any; }; # 添加 any,监听所有 IPv4 IP
    listen-on-v6 port 53 { ::1; any; }; # 添加 any,监听所有 IPv6 IP
    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";
    secroots-file "/var/named/data/named.secroots";
    recursing-file "/var/named/data/named.recursing";
    allow-query { any; }; # 添加 any 允许查询
  • 检查配置 (检查正确为无输出)
    1
    # named-checkconf /etc/named.conf

    4.4 修改 named.rfc1912.zones 域配置文件

  • 添加正向解释域信息
    1
    2
    3
    4
    5
    zone "samlee.com" IN {   # 名字为 samlee.com
    type master;
    file "named.samlee.zone.pos"; # 域的配置文件名
    allow-update { none; };
    };
  • 添加反向解释域信息
    1
    2
    3
    4
    5
    zone "33.100.100.100.in-addr.arpa" IN { # 我准备用 100.100.100.33, 所以反着写
    type master;
    file "named.samlee.zone.rev"; # 域的配置文件名
    allow-update { none; };
    };

    4.5 创建正向与方向解释的 zone 文件 named.samlee.zone.pos , named.samlee.zone.rev

  • 创建正向解释的 “named.samlee.zone.pos”
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $TTL 1D
    @ IN SOA @ samlee.com. (
    0 ; serial #更新序列号
    1D ; refresh # 刷新时间
    1H ; retry # 重试时间
    1W ; expire # 过期时间
    3H ) ; minimum # H 刷新间隔
    NS @ # NS 是域名服务器记录
    A 100.100.100.33 # A IPv4 地址资源记录
  • 创建方向解释的 “named.samlee.zone.rev”
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $TTL 1D
    @ IN SOA @ samlee.com. (
    0 ; serial #更新序列号
    1D ; refresh # 刷新时间
    1H ; retry # 重试时间
    1W ; expire # 过期时间
    3H ) ; minimum # H 刷新间隔
    NS @ # NS 是域名服务器记录
    A 100.100.100.33 # A IPv4 地址资源记录
    AAAA ::1 # AAAA 是 IPv6 地址资源记录
    PTR samlee. # PTR 指针记录,只用在反向解释
  • 检查 zone 文件配置
    1
    2
    3
    4
    5
    6
    7
    # named-checkzone samlee /var/named/named.samlee.zone.pos
    zone samlee/IN: loaded serial 0
    OK

    # named-checkzone samlee /var/named/named.samlee.zone.rev
    zone samlee/IN: loaded serial 0
    OK
  • 确保组属性为 named 否则无法解释
    • 检查组属性
      1
      2
      3
      # ll /var/named/named.samlee.zone.*
      -rw-r--r--. 1 root root 144 Nov 4 10:47 /var/named/named.samlee.zone.pos
      -rw-r--r--. 1 root root 167 Nov 4 10:50 /var/named/named.samlee.zone.rev
    • 修改组属性
      1
      # chgrp named /var/named/named.samlee.zone.*
    • 再次确认已经修改为 named
      1
      2
      3
      # ll /var/named/named.samlee.zone.*
      -rw-r--r--. 1 root named 144 Nov 4 10:47 /var/named/named.samlee.zone.pos
      -rw-r--r--. 1 root named 167 Nov 4 10:50 /var/named/named.samlee.zone.rev

      5 启动 named 服务并设定开机启动

      1
      # systemctl enable named --now

      6 测试验证

      6.1 本地端测试

  • 正向解释验证 指定 DNS 服务器
    1
    2
    3
    4
    5
    6
    # nslookup samlee.com 100.100.100.30
    Server: 100.100.100.30
    Address: 100.100.100.30#53

    Name: samlee.com
    Address: 100.100.100.33
  • 反向解释验证 指定 DNS 服务器
    1
    2
    # nslookup 100.100.100.33 100.100.100.30
    33.100.100.100.in-addr.arpa name = samlee.

    6.2 客户端测试

  • 将 DNS 服务器 IP 加入 客户端配置
    1
    2
    # cat /etc/resolv.conf
    nameserver 100.100.100.30
  • 正向测试
    1
    2
    3
    4
    5
    6
    # nslookup samlee.com
    Server: 100.100.100.30
    Address: 100.100.100.30#53

    Name: samlee.com
    Address: 100.100.100.33
  • 反向测试
    1
    2
    nslookup 100.100.100.30
    33.100.100.100.in-addr.arpa name = samlee.

    7 附录

    7.1 我们也可以根据上述步骤所提炼 ansible playbook

  • 运行paybook 的示例
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    # time ansible-playbook config_dns_server_rhel8.yaml
    [WARNING]: provided hosts list is empty, only localhost is available. Note that the implicit localhost does not match 'all'
    [WARNING]: While constructing a mapping from /mnt/sdb/sam_ansible_playbook/config_dns_server_rhel8.yaml, line 31, column 5, found a
    duplicate dict key (ansible.builtin.command). Using last defined value only.

    PLAY [DNS server auto configuration playbook] **********************************************************************************************

    TASK [Gathering Facts] *********************************************************************************************************************
    ok: [127.0.0.1]

    TASK [Step 1/8 Install require rpms] *******************************************************************************************************
    ok: [127.0.0.1]

    TASK [2/8 Update firewall to permit DNS client access] *************************************************************************************
    fatal: [127.0.0.1]: FAILED! => {"changed": false, "msg": "firewall is not currently running, unable to perform immediate actions without a running firewall daemon"}
    ...ignoring

    TASK [Step 3-1/8 Update selinux file context] **********************************************************************************************
    ok: [127.0.0.1] => (item=\etc\named.conf)
    ok: [127.0.0.1] => (item=\etc\named.rfc1912.zones)

    TASK [Step 3-2/8 Apply new SELinux file context] *******************************************************************************************
    changed: [127.0.0.1]

    TASK [Step 4/8 Modify configuration file /etc/named.conf] **********************************************************************************
    ok: [127.0.0.1]

    TASK [Step 5/8 Modify configuration file named.rfc1912.zones] ******************************************************************************
    ok: [127.0.0.1]

    TASK [Step 6/8 Create postive resolve file named.samlee.zone.pos] **************************************************************************
    changed: [127.0.0.1]

    TASK [Step 7/8 Create reverse resolve file named.samlee.zone.rev] **************************************************************************
    changed: [127.0.0.1]

    TASK [Step 8/8 Enable and start named service] *********************************************************************************************
    changed: [127.0.0.1]

    PLAY RECAP *********************************************************************************************************************************
    127.0.0.1 : ok=10 changed=4 unreachable=0 failed=0 skipped=0 rescued=0 ignored=1


    real 0m37.625s
    user 0m37.243s
    sys 0m4.827s