搭建DNS服务(四)

bind的master/salve设置

Posted by Jht on July 16, 2018

master/slave

配置方式:

  • 方法一:传统的zone file
  • 方法二:web前端GloboDNS
  • 方式三:DLZ

zone file

  • master 的 zone 中有一条NS记录指向slave
  • slave只需要定义区域,从master获取file
  • bind程序的版本应该保持一致
  • master,slave时间需一致

配置

master


zone "example.com" IN {
        type master;                   
        file "zones/example.com.db"; #zone的相关数据
};

zone "4.111.11.in-addr.arpa" IN {
        type master;
        allow-transfer { 11.111.4.200; } #允许slave的ip               
        file "zones/named.11.111.4"; 
};
# allow-transfer也可以全局定义
options {
        allow-transfer { 11.111.4.200; } ;
};

slave

zone "example.com" IN {
        type slave;                    
        masters { 11.111.4.100; }       
        file "zones/example.com.db";  
};

zone "4.168.192.in-addr.arpa" IN {
        type slave;                     
        masters { 11.111.4.100; };        
        file "zones/named.11.111.4";  
};
# 可以使用TSIG
zone "4.168.192.in-addr.arpa" IN {
        type slave;                     
        masters { 11.111.4.100 key hunk-tech-key; };        
        file "zones/named.11.111.4";  
};
#或给master配置key,key是怎么来的看下一节
server 11.111.4.100 { keys hunk-tech-key; };

dnssec-keygen生成key

 #使用命令生成
 dnssec-keygen [-a algorithm] [-b keysize] [-n nametype] [-3] [-A date/offset] [-C] [-c class] [-D date/offset] [-D sync date/offset] [-E engine] [-f flag] [-G] [-g generator] [-h] [-I date/offset]
                     [-i interval] [-K directory] [-k] [-L ttl] [-P date/offset] [-P sync date/offset] [-p protocol] [-q] [-R date/offset] [-r randomdev] [-S key] [-s strength] [-t type] [-V] [-v level]
                     [-z] {name}

master和slave需配置dnssec-key,配置方法同rndc-key一样

参见rndc配置

GloboDNS

GloboDNS的原理就是把zone的数据记录到mysql,在数据库中配置好以后,导出成bind的zone file文件,通过rsync同步到对应的master和slave上,通过rndc进行reload,内部把bind配置变成git仓库,每次变化都git commit,一旦失败回退上一个文件版本。 也就是说你的所有配置都要通过web的前段进行配置。

安装

一定要先阅读:GloboDNS setup

有可能会有更新。注意本文写的时间。我的环境是ununtu 16.04

1.单独机器

不能和master或slave在一起,应单独起一台机器

2.用户

master,slave,GloboDNS使用同一用户, 这只是举例子用globodns用户,你可以自定义,如果自定义的话,以下的globodns需换成your user

#在三台机器上,运行id globodns,结果要一样,要权限一致

id globodns
#结果如下
uid=12386(globodns) gid=12386(globodns) groups=25(named),12386(globodns)
    $ id named
    uid=25(named) gid=25(named) groups=25(named)
    $groups globodns named
    globodns : globodns named
    named : named

3.chroot模式

bind需要运行在chroot模式下

4.SSH keypair

rsync需要使用SSH keypair

5.sudo

globodns  ALL=(ALL) NOPASSWD: /usr/sbin/named-checkconf

6.安装依赖

#安装依赖
sudo apt-get install gcc ruby-dev libxslt-dev libxml2-dev zlib1g-dev ruby libffi-dev libmysqlclient-dev mysql-server mysql-client ruby-bundler
gem install bundler
sudo apt install bind9utils
#下载源码
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
git clone https://github.com/jianghaitao1221/GloboDNS.git --depth=1 #必须是git工程,代码里用到了最后的时间
cd globodns
# Gemfile.lock   修改 rake 12.3.0 为 rake 12.3.1 这一步因为版本问题,没问题的可以不修改
$ bundle install --deployment --without=test,development 

7.rsync

7.1 启用rsync

ubuntu 16.04默认已安装rsync,rsync服务默认不是启动的,我们要修改下面的文件。

sudo vi /etc/default/rsync
#修改 false改true
RSYNC_ENABLE=true   
sudo cp /usr/share/doc/rsync/examples/rsyncd.conf /etc

sudo service rsync start
7.2 rsync
#/etc/ssh/ssh_config or ~/.ssh/config

sudo vi /etc/ssh/ssh_config
#添加
Host your ip #192.168.1.* or *
   StrictHostKeyChecking no
   UserKnownHostsFile=/dev/null

8.配置数据库

vi config/database.yml
development:
  adapter:  mysql2
  database: globodns
  host: localhost
  username: your username
  password: your password
  。。。。。。

9.配置数master&slave

vi config/globodns.yml

development: &devconf
    appname: 'globodns'
    bind:
      master:
        # ipaddr_external: '1.2.3.4' # if use a special ip for master for any slave (optional)
        user:            'globodns'
        host:            'your host' #在/etc/hosts 中配置
        ipaddr:          'your up'
        port:            53
        rndc_port:       953
        chroot_dir:      '/chroot/bind'
        zones_dir:       '/etc/bind'
        named_conf_file: '/etc/bind/named.conf'  # must be inside zones_dir
        named_conf_link: '/etc/named.conf'  # can be anywhere
        export_chroot_dir:    <%= Rails.root.join('tmp', 'named', 'chroot_master') %>
      slaves:
        - user:            'globodns'
          host:            'your host' #在/etc/hosts 中配置,不填就没有slave
          ipaddr:          'your up'
          port:             53
          rndc_port:        953
          chroot_dir:       '/chroot/bind'
          zones_dir:        '/etc/bind'
          named_conf_file:  '/etc/bind/named.conf'  # must be inside zones_dir
          named_conf_link:  '/etc/named.conf'  # can be anywhere
          export_chroot_dir: <%= Rails.root.join('tmp', 'named', 'chroot_slave1') %>
          # masters_external_ip: true # if slave use a different ip for communicate to master, this setting should be set to true


    bind_user:                   'globodns'
    bind_group:                  'globodns'
    additional_dns_servers: ['8.8.8.8', '8.8.4.4'] # additional dns servers ips to check if record is responding correctly


    bind_error_log:         '/var/bind/chroot_master/var/log/globodns.error.log'

    rndc_config_file:       '/etc/bind/rndc.conf' #rndc配置文件的位置
    rndc_key_name:          'rndc-key' #rndc key的名字

10.master&slave配置rndc

文件位置见上一节指定

参见rndc配置

11.初始化数据库

#会创建一个管理员用户: admin@example.com/password
rake db:setup
rake db:migrate
rake globodns:chroot:create

12.导入master和slave的配置

ruby script/importer --remote

13.启动

bundle exec unicorn_rails

DLZ

Dynamically-Loadable Zones 是个第三方的插件。在Bind9的源码包中有所有的第三方插件。`

第三方插件目录contrib。DLZ的性能较差`。

具体安装参见Bind-Web

相关资料

GloboDNS