这是一个典型问题关于 DNS 服务器管理。
我有大约一百个域。所有这些域都需要进行相同的配置,但为每个域配置新的区域和/或区域文件似乎太浪费时间了。一定有更好的方法来实现自动化!
我认为我找到了一些方法...如果我创建一个名为 的区域.
,或者使用 DNS 软件中的其他功能在A
请求记录时始终返回特定 IP,这似乎让我非常接近我想要的最终结果。我的服务器正在权威地响应请求,并且管理起来容易得多!
在名称服务器验证软件开始检查这些域之前,这种方法一直很有效。我发现,通过添加记录可以消除大多数错误NS
,但我的软件不允许我SOA
在同一个区域文件中放置多条记录。
我该如何解决这个多重SOA
记录问题?
答案1
除非我误解了这个问题,否则我经常使用 BIND 执行此操作,只要每个区域都是绝对地完全相同的。
在我的主名称服务器上,我有named.conf
指向通用区域文件的条目,例如
zone "example.com" {
type master;
file "primary/example.GENERIC";
};
zone "example.co.uk" {
type master;
file "primary/example.GENERIC";
};
然后是一个区域文件primary/example.GENERIC
,内容如下:
;; Start of Authority
@ IN SOA ns.teaparty.net. dns.gatekeeper.ltd.uk. (
2004091201 ; serial number YYYYMMDDNN
28800 ; refresh 8 hours
7200 ; retry 2 hours
864000 ; expire 10 days
3600 ) ; min ttl 1 day
;;
;; Name Servers
IN NS ns.teaparty.net.
IN NS ns2.teaparty.net.
我完全没有意识到这些区域存在任何问题。我愿意接受别人告诉我我误解了这个问题,或者我的域实际上不起作用,但在此之前我认为它对我来说是有效的。
注意你不能在二级市场使用同样的伎俩;每个区域将要需要存储在不同的文件中。但由于该文件的内容将由来自主区域的区域传输进行填充和保持最新,所以这并不是什么大问题。
答案2
您可以使用多种快捷方式来让您的生活更加轻松:
如果您使用 Bind 或类似的使用文件存储区域数据的软件:将您的区域指向同一个文件,例如:
zone "example.net" {
type master;
file "/etc/bind/zone/default.zone";
};
zone "example.org" {
type master;
file "/etc/bind/zone/default.zone";
};
因为您可以使用某些 DNS 简写,所以您可以创建一个通用区域文件:
$TTL 1h ; default expiration time of all resource records without their own TTL value
@ IN SOA ns1.example.com. username.example.com. (
20140218131405 ; Serial number YYYYMMDDHHMMSS
28800 ; Refresh 8 hours
7200 ; Retry 2 hours
604800 ; Expire 7 days
86400 ; Minimum TTL 1 day )
@ IN NS ns1.example.com. ; ns1.example.com is a primary nameserver
@ IN NS ns2.example.com. ; ns2.example.com is a backup nameserver
@ IN MX 10 mail.example.com. ; mail.example.com is the mailserver
@ IN MX 20 mail2.example.com. ; the secondary mailserver
@ IN A 192.0.2.1 ; IPv4 address for the bare domain
IN AAAA 2001:db8:10::1 ; IPv6 address for the bare domain
www IN A 192.0.2.1 ; www.domain
IN AAAA 2001:db8:10::1 ; IPv6 address for www.domain - note by starting the line with a blank it becomes the continuation of the previous record and this IPv6 record applies to www
wwwtest IN CNAME www ; wwwtest is an alias for www
这利用了这样一个事实:区域文件中不以点结尾的主机名.总是以 扩展,而$ORIGIN
又被隐式设置为区域名称。@是 $ORIGIN 的简写。
您无需手动维护单个区域文件,而是可以启用一种方法以编程方式与您的名称服务器进行交互。
我使用了 PowerDNS,它允许使用 RDMS 作为后端,与我们当时使用的 LAMP 堆栈非常契合。Amazon Route 53 等云服务也公开了 Web API。
但即使是受人尊敬的 Bind 也支持动态更新这是一种通过向主服务器发送特殊形式的 DNS 消息来添加、替换或删除主服务器中的记录的方法。这些消息的格式和含义在RFC 2136。
通过在 zone 语句中包含allow-update
或子句来启用动态更新。有关更多信息,请查看update-policy
绑定管理员参考手册。
答案3
简短答案
如果您正在寻找 BIND 中的“零配置”设置,那么它不存在。设置根区域 ( .
) 似乎是一个好主意,但事实并非如此,您需要找到一种不涉及破坏 DNS 的解决方案来满足您的需求。
长答案
在过去的一年中,我们已多次收到过类似这样的问题。
答案很简单:您无法设置单个区域定义。任何允许您SOA
在此上下文中定义或以其他方式合成多个记录的软件都是破碎的软件,并且执行破坏性操作不符合 ServerFault 的主题。您要么需要选择可简化此管理的 DNS 软件,要么需要想出一种不涉及此特定快捷方式的其他策略。
当然,您可以使用一些技巧来让生活更轻松……以 BIND 为例,定义多个区域并引用同一个模板区域文件是相当常见的做法。这是完全合法的,验证软件不会发现任何问题:请参阅 MadHatter 的回答。大多数人都会忽略这个解决方案,因为每次获取新域名时添加区域声明仍然“太麻烦”,但这种托管没有“配置一次就可以离开”的选项。
较新版本的 BIND 支持名为 的选项,allow-new-zones
该选项可让您通过新功能动态创建区域定义rndc addzone
。您可能想看看它是否适合您的需求。
除了建议的解决方案之外,您的选择会受到一定限制。有时,如果软件没有按照您想要的方式运行,您就只能继续工作。
答案4
当您说“域需要进行相同配置”时,您的意思是它们必须拥有相同的资源记录吗?在这种情况下,DNAME
除了一个域之外,其他所有域的 RR 难道不是更干净的解决方案吗?
我无法打败 @MadHatter 的技巧,即在严格遵守您的问题范围的情况下导入相同的模板文件。我只能为LDAP
后端提供类似的方法(在我的情况下,与 powerDNS 一起使用):添加associatedDomain
相关 SOA 和 NS 记录的属性,如下所示:
dn: dc=vanitydomains,ou=DNS,dc=myDIT
objectClass: dNSDomain2
objectClass: domainRelatedObject
dc: vanitydomains
associatedDomain: vanitydomain.ORG
associatedDomain: vanitydomain.NET
associatedDomain: vanitydomain.COM
associatedDomain: vanitydomain.INFO
sOARecord: NS1.example.com sysadmin.example.com 2011100701 28800 1800 2592000 10800
dNameRecord: example.com
nSRecord: NS1.example.com
nSRecord: NS2.example.com