本文仅做翻译,水平有限,不足之处请指正。转载请标明本文及原文。
本教程将会展示怎样配置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 问题
这是一个典型的问题。在许多正在增长的组织中,人们必须立即解决以下两个难题:
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地址转发和几个数据库。
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地址。
acl internals { 127.0.0.0/8; 10.0.0.0/24; };如果我们有更多的内部网络,把他们加进去就行了。我们不定义外部,因为所有非内部的都是外部。如果你想,你可以定义不同的外部的集合。
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 的数据。
; 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。好吧,我们来将外部区文件中的内容复制到内部区文件中。这样就好使了。
$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年的文章,现在应该很简单了)。只要记住在修改内部区文件时也修改外部区文件的序号就行了,但这不是很重要,如果你忘了,什么坏事情也不会发生,因为你基本不会在你自己的小网络之内还有一个缓存服务器。
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; }; }; };这将会阻止危险的互联网上的任何人将我们的服务器递归使用,但是在我们(在我们自己的网络上)可以这么做。
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