PowerDNS + SQL Server 2008

PowerDNS から ODBC 経由で SQL Server 2008 上のテーブルを参照させてDNS応答させてみた。ファーストインプレッションとしては、動的に変化するDNSサーバとしてはPowerDNSはかなりいけてると感じた。

PowerDNS ダウンロードサイトよりpowerdns-2.9.15.exe をダウンロードしてインストール。インストール先は C:\PowerDNS にしておく。

標準インストールだと、サービスが LocalSystem アカウントで動いているので、NETWORK SERVICE アカウントに変更する。

  1. C:\PowerDNS 以下に対して、エクスプローラを利用して NEWORK SERVICE に対する読み取り許可を付与
  2. サービスの設定で、PowerDNS サービスの実行アカウントを NETWORK SERVICE に変更。パスワードはなし
  3. サービスの設定で、PowerDNS Recursor サービスを無効にする (再帰問い合わせには対応不要だったので)
  4. C:\PowerDNS\pdns.conf の godbc-username, godbc-password エントリをコメントアウトしておく

SQL Server 側では、以下のSQL文でデータベースの設定をした。

-- ================================================================
-- NT AUTHORITY\NETWORK SERVICE ログインを作成
CREATE LOGIN [NT AUTHORITY\NETWORK SERVICE] FROM WINDOWS
GO
-- PowerDNS データベースを作成
CREATE DATABASE PowerDNS
GO
USE PowerDNS
GO
sp_grantdbaccess N'NT AUTHORITY\NETWORK SERVICE', N'NT AUTHORITY\NETWORK SERVICE'
GO
sp_addrolemember 'db_datareader', 'NT AUTHORITY\NETWORK SERVICE'
GO
CREATE TABLE [dbo].[records]
(
[id] [int] NOT NULL IDENTITY(1, 1),
[domain_id] [int] NULL,
[name] [varchar] (255) COLLATE Japanese_XJIS_100_CI_AS_KS_WS NULL,
[type] [varchar] (6) COLLATE Japanese_XJIS_100_CI_AS_KS_WS NULL,
[content] [varchar] (255) COLLATE Japanese_XJIS_100_CI_AS_KS_WS NULL,
[ttl] [int] NULL,
[prio] [int] NULL,
[change_date] [int] NULL,
CONSTRAINT [PK_records] PRIMARY KEY NONCLUSTERED  ([id])
)
GO
CREATE CLUSTERED INDEX [IX_name] ON [dbo].[records] ([name])
CREATE NONCLUSTERED INDEX [IX_domainid] ON [dbo].[records] ([domain_id])
CREATE NONCLUSTERED INDEX [IX_nametype] ON [dbo].[records] ([name], [type])
GO

PowerDNS の挙動をプロファイラで調べると、通常問い合わせに対するSQL文は「SELECT content,ttl,prio,type,domain_id,name from records wher name=@name」となっており、これに最適化するよう name をキーとしたインデックスをクラスタインデックスとした。その他のインデックスについては PowerDNS manual ODBC backend にあるものを作成した。本当に使われるのかどうかは未確認。

照合順序は「大文字小文字は区別しない」「アクセント、ひらがなカナカナ、全角半角は区別する」である。(XJIS_100 は SQLServer2008 で増えたものなので SQLServer2005の場合は、Japanese_90_CI_AS_KS_WS で)DNSは大文字小文字を区別しない…とはいえおそらくSQL問い合わせをする前に大文字小文字については正規化していると想像されるので、それに合わせるかたちでレコードを作成することにすればバイナリ照合順序の方が速くなる。

最後にODBC データソースを作成すれば設定は完了。システムデータソースとして PowerDNS (pdns.conf に godbc-datasource として記載したもの)を作成する。デフォルトデータベースとしてPowerDNS を指定する。

サンプルデータで試してみたい場合は、C:\PowerDNS\powerdns.mdb の内容をインポートすればよい。

確認は bind9 の dig コマンドを利用し、「dig @127.0.0.1 example.com ns」などとやって確認した。

コメントを残す