BIND9 DNS服务器二合一

原文地址: http://pupeno.com/2006/02/20/two-in-one-dns-server-with-bind9/

本文仅做翻译,水平有限,不足之处请指正。转载请标明本文及原文。

    本教程将会展示怎样配置BIND9 DNS服务器来使用不同的信息集合同时实现对内部网络和外部网络的服务。BIND9中的视图(view)将会被使用来达到这一目的。本教程将会带领你实现整个建立过程,但是需要读者拥有基础的BIND和DNS知识,网上有大量的文档,本文不再详述。


目录:
1 问题
2 初始配置
3 内部与外部
4 安全性
5 配置文件
 5.1 /etc/bind/named.conf.local
 5.2 /etc/bind/externals/db.example.com
 5.3 /etc/bind/internals/db.example.com
参考文献


1 问题

    这是一个典型的问题。在许多正在增长的组织中,人们必须立即解决以下两个难题:

  • 需要一个用于公司内部网络的DNS服务器(因为长久以来公司里已经有了太多的电脑需要去记住他们的IP,甚至太多的电脑需要维护host文件)
  • 需要一个用于外部网络的DNS服务器供客户端等使用
    一旦正在增长的组织不能提供另外一个DNS服务器,这就会变成一个大问题,所以我们需要立即解决这两个难题。如果你把你的共有和私有名字都设置到服务器上,一来私有地址将会污染互联网(这很不好),二来这会将你的内部网络拓扑结构展示给外部世界(这可能不是你想让黑客们知道的信息)。
    另一方面,对于拥有公有及私有连接的电脑,这是为了高效的在内网时解析内部IP,在外网时解析外部IP。
    这个问题的解决方案很多,我记得甚至在BIND4的时候就解决过这个问题,但是现在我们使用BIND9来做一个非常清晰的解决方案。这是在Debian GNU/Linux 3.1 服务器实现的,这也可以在其他运行BIND9的操作系统上实现,只要记得更改适当的路径即可。

2 初始配置
我们假设拥有example.com 的Examples 公司,使用公有IP 192.0.2.0/24,使用内部私有IP 10.0.0.0/24。
我们开始配置外部域名及IP,编辑/etc/bind/named.conf.local文件。添加:
zone "example.com" {
    type master;
    file "/etc/bind/db.example.com";
};
然后我们创建/etc/bind/db.example.com文件,内容如下:
; example.com
$TTL    604800
@       IN      SOA     ns1.example.com. root.example.com. (
                     2006020201 ; Serial
                         604800 ; Refresh
                          86400 ; Retry
                        2419200 ; Expire
                         604800); Negative Cache TTL
;
@       IN      NS      ns1
        IN      MX      10 mail
        IN      A       192.0.2.1
ns1     IN      A       192.0.2.1
mail    IN      A       192.0.2.128 ; We have our mail server somewhere else.
www     IN      A       192.0.2.1
client1 IN      A       192.0.2.201 ; We connect to client1 very often.
如你所见,我们使用一个服务器来实现所有服务,除了mail之外,还包括IP地址转发和几个数据库。
现在,一个好的DNS服务至少还要有一个辅服务器,有些注册商强制使用辅服务器。既然我们没有第二个服务器,我们使用 XName。去注册一个账号然后注册example.com 作为辅服务器,IP为192.0.2.1。 现在我们需要使XName的IP开始传递数据。我们是一个小组织,但是既然我们要获得好的开端,那就要把每件事做得尽可能睿智。所以我们使用BIND9配置指令ACL来定义指向XName IP的别名,在/etc/bind/named.conf.local的开始我们添加:
acl slaves {
    195.234.42.0/24;    // XName
    193.218.105.144/28; // XName
    193.24.212.232/29;  // XName
};
将区声明改为:
zone "example.com" {
    type master;
    file "/etc/bind/db.example.com";
    allow-transfer { slaves; };
};
我们也可以在将上面的slaves直接替换为IP地址。

3 内部与外部
现在我们有了坚实的基础,可以开始考虑实现对内部与外部网络的不同服务了。但是,有限我们必须定义什么是内部什么是外部。
在/etc/bind/named.conf.local中添加如下定义(在slaves定义的上面或下面都行):
acl internals {
    127.0.0.0/8;
    10.0.0.0/24;
};
如果我们有更多的内部网络,把他们加进去就行了。我们不定义外部,因为所有非内部的都是外部。如果你想,你可以定义不同的外部的集合。
我们会使用BIND9的view特性。一个view可以让我们把配置放到依赖于许多东西的条件语句中,在本例中,我们依赖于内部。我们将/etc/bind/named.conf.local中的区声明替换为:
view "internal" {
    match-clients { internals; };
    zone "example.com" {
        type master;
        file "/etc/bind/internals/db.example.com";
    };
};
view "external" {
    match-clients { any; };
    zone "example.com" {
        type master;
        file "/etc/bind/externals/db.example.com";
        allow-transfer { slaves; };
    };
};
    match-clients配置允许我们基于IP集合来进行控制,"any"表示任何IP地址都可以。内部IP将会被内部view缓存,其余的将会被发送到外部view。外部世界无法看到内部view,包括XName,我们的DNS辅服务器。但是我们删除了内部view中的allow-transfer,因为我们不想任何人能够在任何环境下传输内部view 的数据。
    我们同样改变了路径,我们将会创建/etc/bind/externals 和 /etc/bind/internals目录并且将/etc/bind/db.example.com 移动到/etc/bind/externals/ 目录下。
/etc/bind/internals/db.example.com 将会是一个与外部相对应的区文件,但是拥有内部IP:
; example.com
$TTL    604800
@       IN      SOA     ns1.example.com. root.example.com. (
                     2006020201 ; Serial
                         604800 ; Refresh
                          86400 ; Retry
                        2419200 ; Expire
                         604800); Negative Cache TTL
;
@       IN      A       10.0.0.1
boss    IN      A       10.0.0.100
printer IN      A       10.0.0.101
scrtry  IN      A       10.0.0.102
sip01   IN      A       10.0.0.201
lab     IN      A       10.0.0.103
好的,现在我们来ping一下boss的电脑:
ping boss.example.com
但是我们还不能连接mail.example.com。这是怎么回事?因为在内部区文件中没有到mail.example.com的引用而且由于我们在内部网络,我们可以解析mail.example.com。好吧,我们来将外部区文件中的内容复制到内部区文件中。这样就好使了。
但是我们是一个小而精的创业公司,我们可以做的比仅仅复制粘贴每一项改动到区文件中做得更好,而且这么做是很容易出错的。(你能在每次修改完外部区文件之后都记得再修改内部区文件吗?如果你有天忘了就要花时间来debug你的网络了。)
其实我们只要将外部区文件包含进内部区文件就行了:
$include "/etc/bind/external/db.example.com"
@       IN      A       10.0.0.1
boss    IN      A       10.0.0.100
printer IN      A       10.0.0.101
scrtry  IN      A       10.0.0.102
sip01   IN      A       10.0.0.201
lab     IN      A       10.0.0.103
看!要在目前的文档中找到$include指令很难(译者注:这是06年的文章,现在应该很简单了)。只要记住在修改内部区文件时也修改外部区文件的序号就行了,但这不是很重要,如果你忘了,什么坏事情也不会发生,因为你基本不会在你自己的小网络之内还有一个缓存服务器。

4 安全性
    使用同一个DNS服务器作为主服务器和DNS缓存服务器是不推荐的,但是这里我们不得不这么做。从外部世界来看192.0.2.1是 example.com的主DNS服务器;从我们的内部网络来看192.0.2.1(或是它的私有地址,10.0.0.1)是我们的缓存名字服务器,它应该在我们的每个工作站上作为名字服务器来使用。
    有一个问题是,可能有人会从外部使用我们的缓存名字服务器,有一种攻击方式叫做缓存投毒(cache-poisoning),还有其他一些糟糕的事被记录在[ SINS](包括怎样避免他们)
    为了提升一点我们的安全性,我们会在配置文件中加上几条指令:
view "internal" {
    match-clients { internals; };
    recursion yes;
    zone "example.com" {
        type master;
        file "/etc/bind/internals/db.example.com";
    };
};
view "external" {
    match-clients { any; };
    recursion no;
    zone "example.com" {
        type master;
        file "/etc/bind/externals/db.example.com";
        allow-transfer { slaves; };
    };
};
    这将会阻止危险的互联网上的任何人将我们的服务器递归使用,但是在我们(在我们自己的网络上)可以这么做。

5 配置文件
5.1 /etc/bind/named.conf.local
acl slaves {
    195.234.42.0/24;    // XName
    193.218.105.144/28; // XName
    193.24.212.232/29;  // XName
};

acl internals {
    127.0.0.0/8;
    10.0.0.0/24;
};

view "internal" {
    match-clients { internals; };
    recursion yes;
    zone "example.com" {
        type master;
        file "/etc/bind/internals/db.example.com";
    };
};
view "external" {
    match-clients { any; };
    recursion no;
    zone "example.com" {
        type master;
        file "/etc/bind/externals/db.example.com";
        allow-transfer { slaves; };
    };
};
5.2 /etc/bind/externals/db.example.com
; example.com
$TTL    604800
@       IN      SOA     ns1.example.com. root.example.com. (
                     2006020201 ; Serial
                         604800 ; Refresh
                          86400 ; Retry
                        2419200 ; Expire
                         604800); Negative Cache TTL
;
@       IN      NS      ns1
        IN      MX      10 mail
        IN      A       192.0.2.1
ns1     IN      A       192.0.2.1
mail    IN      A       192.0.2.128 ; We have our mail server somewhere else.
www     IN      A       192.0.2.1
client1 IN      A       192.0.2.201 ; We connect to client1 very often.
5.3 /etc/bind/internals/db.example.com
$include "/etc/bind/external/db.example.com"
@       IN      A       10.0.0.1
boss    IN      A       10.0.0.100
printer IN      A       10.0.0.101
scrtry  IN      A       10.0.0.102
sip01   IN      A       10.0.0.201
lab     IN      A       10.0.0.103

Bibliography
SINS - Securing an Internet Name Server

你可能感兴趣的:(BIND9 DNS服务器二合一)