一个区域文件内的不同域名 - Bind9 DNS

一个区域文件内的不同域名 - Bind9 DNS

我必须创造A国家标准100 个域名的记录,我可以通过以下默认/常用方式执行此操作

以一个域为例,一个

nano /etc/bind/named.conf.default-zones

附加

zone "a.com" {
        type master;
        file "/etc/bind/a.com";
};

然后创建一个区域文件并添加以下内容

nano /etc/bind/a.com

$TTL 1h
@              IN SOA          a.com.    root.a.com. (
                               2013080701      ; serial
                               3h              ; refresh
                               1h              ; retry
                               1w              ; expiry
                               1d )            ; minimum

a.com.     IN NS           a.com.
a.com.     IN A            11.11.11.11

这种方式的问题是我必须手动创建100 个区域文件并更新默认区域文件并创建 100 个匹配区域条目

我想知道是否有办法可以做到类似以下的事情理论伪代码

nano /etc/bind/named.conf.default-zones

zone "." {
        type master;
        file "/etc/bind/all";
};


nano /etc/all

$TTL 1h
@              IN SOA          a.com.    root.a.com. (
                               2013080701      ; serial
                               3h              ; refresh
                               1h              ; retry
                               1w              ; expiry
                               1d )            ; minimum

a.com.     IN NS           a.com.
a.com.     IN A            11.11.11.11

b.com.     IN NS           b.com.
b.com.     IN A            22.22.22.22

c.com.     IN NS           c.com.
c.com.     IN A            33.33.33.33

d.com.     IN NS           d.com.
d.com.     IN A            44.44.44.44

e.com.     IN NS           e.com.
e.com.     IN A            55.55.55.55
...

这样,我们只需要更新所有区域文件并添加我们的条目。

答案1

有点。

您不能像您的示例一样简单地将所有内容都放在“。”中。从技术上讲您可以这样做,但这样做会给自己带来比您尝试解决的问题更多的问题。千万不要这样做。“。”是所有 DNS 的根区域。您应该已经将“。”定义为类型提示区域。

您需要在配置文件中定义每个区域,但您当然可以将它们全部指向一个文件。

zone "a.com" {
        type master;
        file "/etc/bind/default-zone";
};
zone "b.com" {
        type master;
        file "/etc/bind/default-zone";
};
zone "c.com" {
        type master;
        file "/etc/bind/default-zone";
};
zone "d.com" {
        type master;
        file "/etc/bind/default-zone";
};

我个人的做法是结合上述内容,并大量使用$INCLUDE 指令

更像:

zone "a.com" {
        type master;
        file "/etc/bind/a.com-zone";
};
zone "b.com" {
        type master;
        file "/etc/bind/b.com-zone";
};
zone "c.com" {
        type master;
        file "/etc/bind/c.com-zone";
};
zone "d.com" {
        type master;
        file "/etc/bind/d.com-zone";
};

在名为 default-zone-data 的文件中:

$TTL 1h
@              IN SOA          a.com.    root.a.com. (
                               2013080701      ; serial
                               3h              ; refresh
                               1h              ; retry
                               1w              ; expiry
                               1d )            ; minimum
               IN NS           ns1.example.com.
               IN NS           ns2.example.com.
               IN NS           ns3.example.com.

然后您的个人区域文件将如下所示:

a.com 区域:

$INCLUDE default-zone-data
a.com.             IN A            11.11.11.11

b.com 区域:

$INCLUDE default-zone-data
b.com.             IN A            22.22.22.22

c.com-区域:

$INCLUDE default-zone-data
c.com.             IN A            33.33.33.33

d.com 区域:

$INCLUDE default-zone-data
d.com.             IN A            44.44.44.44

这看起来似乎工作量很大,但您可以使用一个简单的 shell 脚本消除几乎所有的手动工作。

答案2

您可以使用脚本创建 100 个文件。

这是一个 Python 示例。

from jinja2 import Template

template = '''$TTL 1h
@              IN SOA          {{ zone }}    root.{{ zone }} (
                               1               ; serial
                               3h              ; refresh
                               1h              ; retry
                               1w              ; expiry
                               1d )            ; minimum

{{ zone }}     IN NS           {{ zone }}
{{ zone }}     IN A            {{ ip }}'''
dnsfile = Template(template)

zones = {
    'a.com.':'11.11.11.11',
    'b.com.':'22.22.22.22',
    'c.com.':'33.33.33.33'
}

for zone, ip in sorted(zones.items()):
    with open('/var/named/zones/{}dns'.format(zone), 'w+') as f:
        f.write(dnsfile.render(zone=zone, ip=ip))

相关内容