PowerDNSとdjango-powerdnsを試す

DNSサーバをいろいろ試しているところ。
PowerDNSはバックエンドにRDBMSなどを使えるDNSサーバ。
今回はMySQL5.1で試す。OSはubuntu9.10。
PowerDNS 2.9.22, Django 1.2.5.

MySQLをインストール。

$ sudo aptitude install mysql-server

PowerDNSをインストール。

$ sudo aptitude install pdns-server

PowerDNSのMySQLバックエンドをインストール。

$ sudo aptitude install pdns-backend-mysql

MySQLにPowerDNS用のデータベースを作る

今回はDjangoも使うのでdefault character setも指定。powerdnsという名前のデータベース。

mysql> create database powerdns default character set utf8;
Query OK, 1 row affected (0.00 sec)

データベースにPowerDNS用のテーブルを作る

PowerDNS用のテーブルはdjango-powerdnsの設定で作成されるので省略。
あえて書くとすれば、次のようになる。
PowerDNSより。
pdnsというユーザにデータベースのアクセス許可を与えている。
また、Djangoから扱うのでsupermastersにも主キーを追加している。

use powerdns;

create table domains (
 id		 INT auto_increment,
 name		 VARCHAR(255) NOT NULL,
 master		 VARCHAR(128) DEFAULT NULL,
 last_check	 INT DEFAULT NULL,
 type		 VARCHAR(6) NOT NULL,
 notified_serial INT DEFAULT NULL, 
 account         VARCHAR(40) DEFAULT NULL,
 primary key (id)
)type=InnoDB;

CREATE UNIQUE INDEX name_index ON domains(name);

CREATE TABLE records (
  id              INT auto_increment,
  domain_id       INT DEFAULT NULL,
  name            VARCHAR(255) DEFAULT NULL,
  type            VARCHAR(6) DEFAULT NULL,
  content         VARCHAR(255) DEFAULT NULL,
  ttl             INT DEFAULT NULL,
  prio            INT DEFAULT NULL,
  change_date     INT DEFAULT NULL,
  primary key(id)
)type=InnoDB;

CREATE INDEX rec_name_index ON records(name);
CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);

create table supermasters (
  id INT auto_increment,
  ip VARCHAR(25) NOT NULL, 
  nameserver VARCHAR(255) NOT NULL, 
  account VARCHAR(40) DEFAULT NULL,
  primary key (id)
)type=InnoDB;

GRANT ALL ON powerdns.* TO pdns;

PowerDNSでMySQLバックエンドを使うように設定する

/etc/powerdns/pdns.conf を編集。

launch=gmysql

を追加。
/etc/powerdns/pdns.local を編集。

gmysql-host=127.0.0.1
gmysql-user=pdns
gmysql-dbname=powerdns
gmysql-password=

を追加。パスワードが空なら gmysql-password の行は省略してもよいみたい。

PowerDNSを再起動

$ sudo /etc/init.d/pdns restart

これで起動するはず。

PowerDNSの状態を確認

pdns_controlというコマンドで動作中のPowerDNSを操作できるようだ。

$ sudo -u  pdns pdns_control status
3827: Child running on pid 3829

ではdjango-powerdnsを動かしてみよう。

setuptools(easy_install)を使えるようにする

$ sudo aptitude install python-setuptools

python-mysqldbをインストール

$ sudo aptitude install python-mysqldb

Djangoをインストール

$ sudo easy_install django==1.2.5

django-powerdnsをインストール

peternixon / django-powerdns / wiki / Home — Bitbucket

$ sudo easy_install django-powerdns

djangoのプロジェクトを作成

$ django-admin.py startproject mypowerdns

settings.pyを編集

作成したプロジェクトの mypowerdns/settings.py を編集。
タイムゾーンをAsia/Tokyoに。

TIME_ZONE = 'Asia/Tokyo'

言語を日本語に。

LANGUAGE_CODE = 'ja'

データベースをmysqlに。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql', # Add 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
        'NAME': 'powerdns',                      # Or path to database file if using sqlite3.
        'USER': 'pdns',                      # Not used with sqlite3.
        'PASSWORD': '',                  # Not used with sqlite3.
        'HOST': '',                      # Set to empty string for localhost. Not used with sqlite3.
        'PORT': '',                      # Set to empty string for default. Not used with sqlite3.
    }
}

INSTALLED_APPSにadminとpowerdnsを追加。

INSTALLED_APPS = (
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.sites',
    'django.contrib.messages',
    'django.contrib.admin',  # added
    'powerdns',  # added
)

管理画面のURLを有効にする

mypowerdns/urls.pyを編集。

from django.conf.urls.defaults import *

from django.contrib import admin
admin.autodiscover()

urlpatterns = patterns('',
    (r'^admin/', include(admin.site.urls)),
)

Django用のテーブルを作成

ここでpowerdns用のテーブルも作成される。
管理者アカウントも作成しておく。

$ cd mypowerdns
$ python manage.py syncdb

Djangoの開発サーバの起動

$ python manage.py runserver
Validating models...
0 errors found

Django version 1.2.5, using settings 'mypowerdns.settings'
Development server is running at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

ログインしてみる

ブラウザで http://127.0.0.1:8000/admin/ へアクセス。
作成しておいた管理者アカウントでログイン。

ドメインを追加する

Domainsの「追加」からドメインを追加する。
今回はexample.comで作成。

レコードを追加する

Recordsの「追加」からレコードを追加する。
Aレコードでtest.example.comに対して192.168.11.123を設定してみる。

動作確認

nslookupで確認

$ nslookup
> server localhost
Default server: localhost
Address: 127.0.0.1#53
> test.example.com
Server:         localhost
Address:        127.0.0.1#53

Name:   test.example.com
Address: 192.168.11.123

おしまい。