如何在BIND中配置水平拆分DNS

时间:2020-03-21 11:48:06  来源:igfitidea点击:

DNS的一般思想是提供IP地址以换取所请求的名称。
无论请求来自何处,正常的常规配置和普通配置都是以相同的答案进行响应。

但是,存在一些要求和用例,其中我们需要为同一域名使用不同的地址集配置DNS服务器。
让我们举个例子来理解这一点。
假设我们有一台DNS服务器,并且想使用同一台dns服务器处理来自Internet的请求以及来自专用网络的请求。
对于这两种类型,用相同的答案做出回应是没有意义的。
因为内部专用网络用户应该通过专用LAN ip地址itslef(在性能和延迟方面会更好)访问服务,而不是通过面向公众的Internet地址进行访问。

水平拆分DNS也称为“ Split DNS”或者“ Split View DNS”等。
请勿将水平拆分DNS与网络中使用的相同术语混淆。

在网络领域中,同一术语(水平拆分)用于防止路由通告中形成环路的方法。

有多种方法可以实现此拆分视图或者拆分DNS。
其中一些在下面提到。

  • 第一种方法是简单地将不同的DNS服务器放置在具有适用于那些网络的不同配置的所需网络中。
  • 第二种方法是在同一服务器上运行多个DNS服务。
  • 第三个是DNS服务器软件的内置功能,并在DNS配置本身中实现此功能。

在本文中,我们将重点介绍上面列出的第三种技术。
我们将使用BIND DNS服务器来演示此示例配置。
第一步是安装bind。

步骤1:在系统上安装Bind

安装bind就像运行apt-get(如果我们使用Ubuntu或者debian)或者Yum(如果我们使用基于RHEL的基于RPM的Centos)命令一样简单。
让我们直接进行安装。

在Ubuntu中,我们可以运行以下命令来安装bind ..

# apt-get install bind9

如果是Centos或者RHEL,则可以使用以下yum命令安装bind。

# yum install bind*

绑定的主要主要配置文件是/etc/bind/named.conf。
通常,人们不会对此文件进行太多更改,但会包含指向其他文件的指针,这些文件绑定需要检查配置的文件。
让我们看一个典型的named.conf文件。

root@localhost:~# cat /etc/bind/named.conf
include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";

上面named.conf中显示的设置只是说绑定以查看文件/etc/bind/named.conf.options、/etc/bind/named.conf.local、/etc/bind/named.conf.default-zones 。

/etc/bind/named.conf.options文件包含用于绑定的常规选项集。
该文件中提到了类似以下的内容。

  • 监听端口和接口
  • 允许查询
  • 允许转移到源地址
  • 是否允许递归
  • PID文件位置
  • 允许查询该DNS服务器的IP列表
  • 启用/禁用DNSSEC进行区域传输。
  • 缓存位置...等
root@localhost:~# cat /etc/bind/named.conf.options
options {
        listen-on port 53 { 10.1.136.154; 127.0.0.1;};
        directory       "/var/cache/bind/";
        allow-query     { any;};
        recursion no;
        pid-file "/run/named/named.pid";
        notify yes;
};

启用此拆分视图或者水平拆分配置的绑定的最重要功能称为“视图”。
绑定视图将使我们可以为某些主机托管一组配置,而对于其他主机托管另一组配置。

这种方法的主要用例是当我们要对内部客户端和外部客户端使用相同的DNS时。

从技术上讲,即使我们不配置任何视图,... bind也会创建一个视图,并且该视图将内部提供给来自所有来源的所有查询。

绑定视图是使用view子句创建的,如下所示。

view "testview" {
};

“视图”部分组织在我们前面看到的“选项”部分下面。
因此,让我们将视图保留在文件/etc/bind/named.conf.options中,该文件已经包含在named.conf中。

有两种添加适用于视图的源地址的方法。
第一种方法是使用称为“ match-clients”的语句。
match-clients需要一个源地址列表作为参数。
下面显示了带有match-clients子语句的示例视图语句。

view "testview" {
        match-clients { 10.1.12.0/24; };
};

第二种方法是使用acl语句。
让我们看一个示例acl语句,以及如何在bind的views语句内使用它。

acl "testacl" { 10.1.12.0/24; };
view "testview" {
    match-clients { "testacl"; };
};

请记住,我们需要在views语句之外定义acl语句。

我们可以在bind的view语句中放置什么所有选项?

我们几乎可以将options语句支持的所有内容放入views语句中。
我们可以定义诸如递归,类型(即:充当主服务器还是从属服务器),区域,签名等内容。

acl "testacl" { 10.1.12.0/24; };
view "testview" {
    match-clients { "testacl"; };
    zone "test.example.com" {
        type master;
        file "test.exmple.com.zone";
    };
};

视图的另一个完美用例是仅允许内部客户进行递归,而拒绝外部客户进行递归。
使用视图可以轻松实现这一点。
这是因为视图支持指定递归选项(使用该选项,我们可以允许或者拒绝对特定源地址的递归dns查询)

match-clients语句还支持一个名为any的通配符条目,这在制作适用于每个人的视图时非常有用。
像下面显示的示例。

acl "testacl" { 10.1.12.0/24; };
view "testview" {
    match-clients { "testacl"; };
    recursion yes;
    zone "test.example.com" {
        type master;
        file "test.example.com.trusted.zone";
    };
};
view "outside" {
    match-clients { any; };
    recursion no;
    zone "test.example.com" {
        type master;
        file "test.example.com.untrusted.zone";
    };
};

这是一种仅允许递归到已知客户端的常见安全措施。
这是因为递归带来了很多安全风险。
上面的show bind的view子句可用于拒绝对所有匿名请求的递归,而只允许用于我们的选择性视图(allow-recursion语句也可用于相同目的)。

如果服务器分布在不同的地理位置,则要提供相同的服务,可以使用views语句使dns使用离请求者最近的服务器的IP地址进行响应。
使用它,我们可以得到延迟时间减少的分布式网络,类似于CDN网络。
只需将源位置/国家/地区的公共IP范围添加到match-client列表或者acl列表中。