本教程将向您介绍如何配置BIND9 DNS服务器以同时提供内部网络和外部网络,并提供不同的信息。 为了实现这一目标,使用了一个称为视图的BIND9的新功能。 作为一个教程,它将引导您完成整个设置,但需要初步了解BIND和DNS,有大量文档可以覆盖互联网上的信息。
内容
1问题
正在发展的组织中,一个典型的问题是它们必须同时解决两个问题:
解决这个问题成为一个更大的问题,当不断增长的组织不能提供比一个DNS服务器更多的资源3 。 这是一个更大的问题,因为如果您只是使用所有您的名称(公共和私人)配置服务器,那么最终会以私有地址污染Internet,这是非常糟糕的,并且还显示了您的内部网络。 你不想要一个可能的攻击者/破解者。
问题的另一部分是,为了提高效率,当您在外部时,您可能希望在内部IP和外部IP时解决内部IP。 在这里,我正在接触有公共和私人连接的电脑。
这个问题有很多不同的解决方案,我记得用BIND4来解决问题,但现在我要用BIND9做一个非常干净的解决方案。 这部署在Debian GNU / Linux 3.1服务器中,但它也适用于运行BIND9的其他操作系统,只需确保正确更改路径。
2初始配置
让我们想象一下我所在的组织是什么样的例子? 我不知道,但可以在example.com上订购。 示例公司已经分配了网络192.0.2.0/24,内部我们使用10.0.0.0/24。
我们开始提供外部名称和IP,我们编辑/etc/bind/named.conf.local 4并添加:
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.
正如你所看到的,我们的启动有一台电脑为所有服务,除了邮件,它甚至拥有IP转发和几个数据库。
现在,一个良好的DNS设置至少有一个辅助服务器,实际上,一些注册服务商(注册域名)强制执行此操作。 由于我们没有第二台计算机,所以我们去XName ,打开一个帐号,并注册example.com作为第二个192.0.2.1作为IP转移。 我们现在需要让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; };
};
我们可以直接键入我们键入“从属”的IP。
3内部和外部
现在我们有了坚实的基础,我们可以开始把内容和外部网络的不同内容放在一起,但首先我们要定义什么是内部的,什么是外部的。
在/etc/bind/named.conf.local中,我们添加以下定义(在从站的顶部或下方):
acl internals {
127.0.0.0/8;
10.0.0.0/24;
};
如果我们有更多的内部网络,我们可以把它们添加到那里。 我们不定义外部因素,因为不是内部的所有内容都是外部的。 如果您想要将不同的内容提供给不同的互联网块,您可以定义不同外部的集合。
我们将使用一个称为视图的BIND9的新功能。 一个视图让我们将一个配置放在一个可以依赖于一些事情的条件中,在这种情况下,我们只需要依赖于内部。 我们用/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; };
};
};
匹配客户端配置指令允许我们有条件地显示基于一组IP的视图,“任何”代表任何IP。 内部IP将被内部视图缓存,其余的将被丢弃在外部视图中。 外部世界看不到内部视图,其中包括我们的次要DNS提供商XName,但是我们从内部视图中删除了允许转移,因为我们不希望任何人在任何情况下能够转移内容内部观点。
我们也改变了路径,我们必须创建目录/ 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
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指令是很难的..只要记住更改外部区域文件的序列,只要你改变内部的文件,但它不是一件大事,如果你忘记,没有什么不好会发生,因为你是不可能在您自己的小型网络中有缓存服务器。
4安全
不建议使用与某些域(在我们的example.com中)相同的DNS服务器,以及缓存DNS服务器,但在我们的例子中,我们被迫执行此操作。 从外部世界192.0.2.1是example.com的主要DNS服务器,从我们自己的内部网络,192.0.2.1(或其私有地址,10.0.0.1)是我们的缓存Nameservers,应该配置为要使用的Nameservers在我们每个工作站上
其中一个问题是有人可能会从外面开始使用我们的缓存Nameservers,有一种称为缓存中毒的攻击和许多其他令人讨厌的事情,可以在[ 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; }; }; };
这将阻止任何危险的Internet上的用户递归地使用我们的服务器,而在我们自己的网络上,我们仍然可以这样做。
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
参考书目
脚注
- ... IP 1
- 对我来说,两台电脑已经有资格将太多的电脑记住他们的IP了。
- ...文件 2
- 主机文件驻留在/ etc / hosts上,是本地计算机从名称到IP的简单映射。 这是解决名称到IP的第一种方法,很久以前,维护了一个中央大型主机文件,后者通过FTP或类似的方式分发。 它迅速发展成由DNS的发明解决的问题。 尝试不要让你的主机文件成为一个问题,然后再把它变成DNS,从先驱者学习!
- ...服务器 3
- 或者当你是一个完美主义者,并相信这应该只能用一台服务器。
- ... / etc / bind / named.conf.local 4
- 如果不是Debian,您的操作系统可能只是/etc/bind/named.conf。