Loading

Linux 搭建 DNS 服务器(BIND9)

Linux 搭建 DNS 服务器

基本概念

DNS 是 Domain Name System(域名系统)的简称,用于将域名翻译成 IP 地址。

域名由多个部分构成:主机名.二级域名.顶级域名.(根域),每个部分称为一个区(zone),越往后的域范围越大等级越高。

  • 主机名:一般代表公司或者组织的主机名或者某个服务名,一般在最左边。
  • 二级域名(second-level domains):一般代表公司或者组织的名字。
  • 顶级域名(top-level domains,TLDS):一般代表的是该公司或者组织在社会中的某个领域,或者所说的国家。在顶级域名中包含两种:
    • 通用顶级域名(generic top-level domains,gTLDs):通用的顶级域名代表的便是在社会中的某个领域,例如 com 表示的是商业,edu 表示的教育机构,gov 表示的政府机构,org 表示的组织机构(例如开源组织什么的)
    • 国家代码顶级域名(country code top-level domains,ccTLDs):国家代码顶级域名显然就是代表所属国家了,例如 cn 代表的是中国,jp 代表的是日本,ca 代表的是加拿大等等
    • 当然 gTDLS 与 ccTLDs 不是说只能用一个,例如南开大学的域名 www.nankai.edu.cn

每个区都有一台主域名服务器,负责解析自己所在域的域名,同时至少应该有一台辅助域名服务器,防止主服务器崩溃。

DNS 解析过程

image

DNS 查询有两种方式:

  • 递归查询:当客户端向域名服务器发送请求后,如果服务器无法解析该域名,会向另一台域名服务器发送请求,直到获取到域名相应的记录后,将记录返回给客户端。
  • 迭代查询:当客户端向域名服务器发送请求后,如果服务器无法解析该域名,域名服务器会将推荐的域名服务器 IP 返回给客户端,让客户端自行查询。

DNS 记录

DNS 服务器中存储着 DNS 记录,用于记录域的相关信息,当收到客户端的域名解析请求后,会根据 DNS 记录进行解析。

常用的 DNS 记录类型有:

  • A 记录:将域名解析为 IP 地址。
  • AAAA 记录:将域名解析为 IPv6 地址。
  • CNAME 记录:将域名指向另一个域名(真实域名),返回真实域名的 IP。
  • MX 记录:将邮件指向电子邮件服务器。
  • TXT 记录:用于存储文本注释,客户端请求 TXT 记录时,返回存储的文本信息。
  • NS 记录:存储域名服务器的地址,当客户端请求解析域名时,服务器返回存储的域名服务器地址,让客户端去该域名服务器查询。
  • PTR 记录:用于反向查询,将 IP 地址指向域名。
  • SOA 记录:用于记录域或区域的相关信息。
  • SRV 记录:用于将域名解析到特定服务,也就是“IP + 端口”,而不是 A 记录那样解析到 IP。

其他 DNS 记录类型:https://www.cloudflare.com/zh-cn/learning/dns/dns-records/

BIND 9

BIND 9 是 一个开源 DNS 服务器软件。

相关配置文件

  • 系统的 DNS 配置文件:/etc/resolv.conf
  • BIND 配置文件:/etc/bind/named.conf
    • BIND9 全局配置文件:/etc/bind/named.conf.options,这个文件包含了 BIND 服务器的全局选项配置,例如服务器的全局参数设置、DNS转发配置、安全选项、日志设置等。通过编辑这个文件,可以配置 BIND 服务器的全局行为和特性。
    • 本地域配置文件:/etc/bind/named.conf.local,这个文件用于配置本地域名(Local Zone)的区域文件(Zone File)和相关的域名解析设置。在这个文件中,可以指定本地区域的域名、对应的区域文件路径、域名服务器信息等。
    • 默认区域配置文件:/etc/bind/named.conf.default-zones,这个文件包含了 BIND 服务器的默认区域(Default Zone)配置,例如根区域(Root Zone)和其他默认配置的区域。这些默认区域通常由 BIND 服务器自动管理,但可以通过编辑这个文件来进行自定义配置。

语句块

BIND 9 的配置文件由若干语句块构成,语句块格式如下:

声明 {
    配置参数;
    配置参数 {
        子配置项;
        子配置项;
    }
    .......;
    .......;
};

例如 options语句块的示例:

options {
    directory "/var/cache/bind";

    recursion  yes;                     # enables resursive queries
    allow-recursion { trusted; };   # allows recursive queries from "trusted" clients
    listen-on { 192.168.42.5;  };   # ns1 private IP address - listen on private network only
    allow-transfer { none; };       # disable zone transfers by default

    forwarders {
        114.114.114.114;            # 当本地的 dns 服务器中找不到记录时向上查询
    };

    dnssec-validation auto;

    auth-nxdomain no;    # conform to RFC1035
    listen-on-v6 { any; };
};

BIND 9 有如下类型语句块:

  • acl:定义一个 IP 地址表列名,用语接入控制和其他用法。
  • controls:宣告 rnde utility 使用的控制通道(channel)。
  • include:包含一个文件。
  • key:设置密匙信息,它应用在通过 TSIG 进行授权和认证的配置中。
  • logging:设置日志服务器,和日志信息的发送地。
  • options:控制服务器的全局配置选项和为其它语句设置默认值。
  • server:在一个单服务器基础上设置特定的配置选项。
  • trusted-keys:定义信任的 DNSSED 密匙。
  • view:定义一个视图。
  • zone:定义一个域。

logging 和 options 语句块在每个配置中出现一次。

ACL 语句

acl acl-name {
	address_match_list
};

ACL 语句给一个地址匹配列表赋予一个名称,定义了之后,这个名称(表示这个列表)可以用于其他地方。

预定义的 ACL 名称:

  • any:匹配所有主机
  • none:不匹配任何主机
  • localhost:匹配主机上所有 IPv4 的网络接口
  • localnets:匹配所有 IPv4 本地网络的主机

地址匹配列表语法

地址匹配列表是由地址匹配列表元素构成,用分号分隔:

address_match_list=address_match_list_element;[address_match_list_element;...]

地址匹配列表元素可以是:

  • 一个 IP 地址(IPv4 或 IPv6)
  • 一个 IP 网段(CIDR 表示法)
  • 已经定义的 ACL 名称
  • 用大括号括起来的匿名地址匹配列表
  • key 语句中定义的一个 key ID
address_match_list_element=[!](ip_address[/length] | key_id | acl_name | {address_match_list})

每个地址匹配列表元素之前可以添加!表示非。
地址匹配列表按照顺序匹配,所以小范围定义要在大范围定义之前,如 1.2.3/24;!1.2.3.13; 后面一个元素就没有用了,因为 1.2.3/24 直接允许所有这一网段的 ip 通过了,应该用 !1.2.3.13;1.2.3/24;

posted @ 2024-10-01 21:31  杨谖之  阅读(0)  评论(0编辑  收藏  举报