独自ドメイン サーバレンタル 運用

インターネット上でサーバを運営するぜ

のタイトルに興味を惹かれた方向けのブログです
必要ない人には まったくどうでもいい次のような いろいろ実験ができます

  • 自宅以外でサーバ構築など試してスキルアップ
  • 独自ドメイン ***.com などが持てる
  • 固定グローバルIP が持てる 自分の好きなサービスがインターネットに提供できる
  • 自分で Webサーバや アプリケーションサーバなど 自由に構築運営できる
  • 自分で メールサーバや その他サービスなど 自由に構築運営できる

20年くらい前では グローバルIPの取得から 高い独自ドメイン取得とホスティングサーバの契約など
なかなか敷居が高かったのですが 最近の仮想化技術のおかげでリーズナブルになりました

今回紹介する 各種サービス リソース 価格スペックをまとめたものが次の表です

システム構成
独自ドメイン VALUE-DOMAINによる ドメイン申請代行 1300円/年
独自サーバ ABLENETによる VPSサービス 6000円/年
固定グローバルIP
SSL証明書 SSLBOXによる 格安SSL証明書 800円/年

それでも 年間8000円以上…個人の財布には響く値段ですね
2000年前半は同等のサービスが 月に1万円以上だったことを考えると格安と言えます

独自ドメイン

****.com や ****.jp など自身のサービスの看板と言えるドメインを持てるサービスです
かれこれ 10年以上 VALUE-DOMAINを使い続けてます
VALUE-DOMAIN トップページ
.jp や .net .com など人気のある TLDは金額も高いです
.spaceとか 未来を先取りしたようなものもあります

あと VALUE-DOMAINでは VALUE-SERVER XREA CORE-SERVER という 3種類のホスティングサービスも運営しています
ドメインや SSL証明書と併せて ここでまとめて申し込むこともできます
以前は VALUE-SERVERを使っていました
VALUE-DOMAIN 管理画面
poared.com ドメインの例で 管理画面です
ドメイン取得 から 移管 レコード登録 まで Web画面から設定できます

独自サーバ 固定グローバルIP

自宅の電気代や設置スペースを必要としない 独自サーバです
以前は VALUE-SERVERホスティングサービスでしたが ABLENETのVPSサービスに代えました
ABLENETのサービスは いわゆる「IaaS」で仮想サーバ提供してもらえるのです
自分の好きな OSを何度でも入れ直すことができます
ABLENET VPSサービスページ
仮想デスクトッププランというのは Windows環境の提供プランです
今回あくまで個人用途なので VPSプランの一番安い V0で FreeBSDで構築しました
ABLENET 申し込みメール
ABLENET申し込んだ時に届いたメール
試用期間が短くて OSインストールできるかどうか確認するくらいしかできません
ただ固定IPや vps.ablenet.jp の FQDNも割り当ててもらえます
もちろん独自ドメインを持っていれば そちらを使っても構いません
ABLENET 管理画面
ABLENETのサーバ管理画面です シンプルで解りやすいインターフェースです
ABLENET 管理画面 サーバ詳細
サーバ毎に細かい操作を指定できます
電源ON/OFF CDイメージの選択 初期化など サーバ操作に必要な一通りの操作ができます
ABLENET CDイメージ選択
CDイメージの選択画面です メジャーなOS一通り揃ってます
Windowsを使う場合 仮想デスクトッププランにする必要があります
ABLENET 仮想サーバ起動状態
FreeBSDをインストールするために仮想サーバを起動しました
「コンソール(画面)」を押すとブラウザ上で 仮想サーバのコンソール画面が操作できます
一通り初期設定が完了するまでは この管理画面のお世話になります

SSL証明書

独自ドメインを HTTPSとしてインターネットに Webサービスを提供したり
SSL関連のセキュアな認証機能を必要とする場合は SSL証明書が必要になります
SSLBOX トップ画面
GeoTrustなど ほとんどのブラウザが対応している 有名なSSL証明書は高いですね
この辺りは企業が Eコマースなどサービス提供する用です

個人の実験用途としては CoreSSLの安いのでいきます
ただしブラウザやプログラムによって 証明書のセキュリティチェックに失敗することもあります
SSLBOX 管理画面
SSLBOXの証明書管理画面です
「管理画面」を押すと詳細画面に移って
SSL証明書の登録情報や 証明書の更新 サーバ証明書のダウンロード など必要な操作ができます

VPSサービスなどもそうですが 全てWeb管理画面で操作できる反面 サーバ運営の基礎知識が必要になります

DHCPサービスの導入

IPv6にも対応した DHCPサーバの設定

UNIX系のDHCPの有名な実装は ISC-DHCPWIDE-DHCP(リンクは WIDE-DHCPv6)です
今回は ISC-DHCPを使って IPv4 IPv6 両対応のDHCPサービスを構築します

検証システムK/caption>

CPU AMD PhenomII X4 905e (2.5GHz 4コア)
メモリ 16GB
ネットワーク Realtek 8168 (8111D) GbE
OS Gentoo-1.12.14 Linux-3.10.1 x86_64 UTF-8
コンパイラ gcc-4.5.2
Cライブラリ glibc-2.13
LDAPサーバ OpenLDAP-2.4.23
DHCPサーバ ISD-DHCP-4.2.5

ISC-DHCPを利用して 自宅のネットワークを IPv4 IPv6 ハイブリッドにしました
下記の図は 構成概要です
自宅DHCPv4 DHCPv6構成
ISC-DHCPサービスを入れるのは 図の左上のサーバマシンです
サーバマシンは DNS(IPv4/IPv6)と IPv4のDHCPサーバの機能も持たせます

IPv6アドレスの払出しは v6のポリシー上ルータに行わせる必要があるため
フレッツ光のゲートウェイルータがその役目を担います

今回の DHCPv6導入の目的は ネットワーク内にDNSサーバアドレスを広報することです
サーバで ISD-DHCPをビルドした結果は次の通りです

$ tar -xzf /ram/dhcp-4.2.5.tar.gz
$ cd dhcp-4.2.5
$ ./configure --prefix=/usr --libdir=/usr/lib64 --localstatedir=/var --with-ldap
checking for a BSD-compatible install... /bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p

〜

config.status: executing depfiles commands

     ISC DHCP source configure results:
    -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-

Package:
  Name:          DHCP
  Version:       4.2.5

C Compiler:      gcc

Flags:
  DEFS:          -DHAVE_CONFIG_H
  CFLAGS:        -g -O2  -Wall -Werror -fno-strict-aliasing -I${top_srcdir}/bind/include

Features:
  debug:         no
  failover:
  execute:

Developer:
  ATF unittests : no


Now you can type make to build ISC DHCP

$ make
Making all in bind
make[1]: ディレクトリ `/home/admin/dhcp-4.2.5/bind' に入ります
Configuring BIND Export libraries for DHCP.

〜

make[1]: ディレクトリ `/home/admin/dhcp-4.2.5/server' から出ます
make[1]: ディレクトリ `/home/admin/dhcp-4.2.5' に入ります
make[1]: `all-am' に対して行うべき事はありません.
make[1]: ディレクトリ `/home/admin/dhcp-4.2.5' から出ます
$ su
# make install
Making clean in server
make[1]: ディレクトリ `/home/admin/dhcp-4.2.5/server' に入ります

〜

make[1]: ディレクトリ `/home/admin/dhcp-4.2.5' に入ります
make[1]: `clean-am' に対して行うべき事はありません.
make[1]: ディレクトリ `/home/admin/dhcp-4.2.5' から出ます
#
 

下記ファイルがインストールされました

bin/:
omshell

etc/:
dhclient.conf.example  dhcpd.conf.example

include/dhcpctl:
dhcpctl.h

include/isc-dhcp:
dst.h

include/omapip:
alloc.h   convert.h  isclib.h  omapip_p.h  trace.h
buffer.h  hash.h     omapip.h  result.h

lib/:
libdhcpctl.a  libdst.a  libomapi.a

sbin/:
dhclient  dhcpd  dhcrelay

share/man/man1/:
omshell.1

share/man/man3/:
dhcpctl.3  omapi.3

share/man/man5/:
dhclient.conf.5    dhcp-eval.5     dhcpd.conf.5
dhclient.leases.5  dhcp-options.5  dhcpd.leases.5

share/man/man8/:
dhclient-script.8  dhclient.8  dhcpd.8  dhcrelay.8
 

dhcpdは IPv4 IPv6 両対応ですが別々にプロセスを起動する必要あります
そのため設定ファイルも別々に作成する必要があります

IPv4用の設定ファイルを /etc/dhcpd.conf
IPv6用の設定ファイルを /etc/dhcpd6.conf としましょう

IPv4用 dhcpd.conf は下記の通りです

ldap-server "[::1]";
ldap-port 389;
ldap-username "cn=Manager,dc=mydomain";
ldap-password "*****";
ldap-base-dn "cn=dhcp,dc=mydomain";
ldap-method dynamic;
ldap-debug-file "/var/log/dhcp-ldap-startup.log";
 

IPv4のDHCPについては 普段と趣を変えて LDAPバックエンドとしました
DHCP用のLDAPスキーマは ソースディレクトリ/contrib/ldap/dhcp.schema にあるので
LDAPサーバにあらかじめ取り込んでおく必要があります

また LDAPデータベースには下記のようなエントリを登録します

# dhcp, mydomain
dn: cn=dhcp,dc=mydomain
objectClass: top
objectClass: dhcpService
objectClass: dhcpOptions
dhcpStatements: ddns-update-style interim
dhcpStatements: log-facility local7
dhcpStatements: deny client-updates
dhcpStatements: default-lease-time 3600
dhcpStatements: max-lease-time 43200
cn: dhcp
dhcpPrimaryDN: cn=phenom4,cn=dhcp,dc=mydomain

# group-192.168.0.0, dhcp, mydomain
dn: cn=group-192.168.0.0,cn=dhcp,dc=mydomain
cn: group-192.168.0.0
objectClass: top
objectClass: dhcpGroup
objectClass: dhcpOptions
dhcpOption: domain-name "mydomain"
dhcpOption: domain-name-servers 192.168.0.254, 192.168.0.1
dhcpOption: subnet-mask 255.255.255.0
dhcpOption: broadcast-address 192.168.0.255
dhcpOption: routers 192.168.0.1
dhcpOption: smtp-server 192.168.0.254

# 192.168.0.0, group-192.168.0.0, dhcp, mydomain
dn: cn=192.168.0.0,cn=group-192.168.0.0,cn=dhcp,dc=mydomain
cn: 192.168.0.0
objectClass: top
objectClass: dhcpSubnet
dhcpNetMask: 24
dhcpRange: 192.168.0.200 192.168.0.239
dhcpStatements: authoritative

# turion4, group-192.168.0.0, dhcp, mydomain
dn: cn=turion4,cn=group-192.168.0.0,cn=dhcp,dc=mydomain
cn: turion4
objectClass: top
objectClass: dhcpHost
dhcpHWAddress: ethernet 0*:**:**:**:**:*2
dhcpStatements: fixed-address 192.168.0.3

# xbox360, group-192.168.0.0, dhcp, mydomain
dn: cn=xbox360,cn=group-192.168.0.0,cn=dhcp,dc=mydomain
cn: xbox360
objectClass: top
objectClass: dhcpHost
dhcpHWAddress: ethernet 0*:**:**:**:**:*9
dhcpStatements: fixed-address 192.168.0.13

# phenom4, dhcp, mydomain
dn: cn=phenom4,cn=dhcp,dc=mydomain
cn: phenom
cn: phenom4
objectClass: top
objectClass: dhcpServer
dhcpServiceDN: cn=dhcp,dc=mydomain
 

必要な設定は以上です
DHCPv4の起動は下記のコマンドで行います

# dhcpd -q -4 -cf /etc/dhcpd.conf eth0
 

うまく動作したら サーバ起動時に自動実行されるように設定しましょう

次に DHCPv6の設定を行います
DHCPv6は LDAPバックエンドでうまく動作しなかったので
dhcpd6.confに必要な設定を記述します

# dhcpd.conf
#
default-lease-time 86400;
max-lease-time 604800;

subnet6 fe80::/64 {
  option dhcp6.name-servers fe80::1***:****:****:***a;
  option dhcp6.domain-search "mydomain";
}
 

設定はこれだけです IPv6アドレスを払い出す必要もなく
DNSサーバのアドレスだけ広報してもらえばよいので簡潔な設定になっています

ネットワークが fe80:: のリンクローカルに対して設定されていますが
これがあるべき姿かどうかは分かりません

DHCPv6の起動は下記コマンドで行います

# dhcpd -q -6 -cf /etc/dhcpd6.conf eth0
 

サーバの設定は以上で完了です
クライアントマシンで DNSサーバを DHCPv6を通じて解決するには
特にWindowsでは設定が必要です (管理者権限で設定します)

C:\Windows\system32>netsh interface ipv6 show interface

Idx     Met         MTU          状態                 名前
---  ----------  ----------  ------------  ---------------------------
  3          10        1500  connected     イーサネット
  1          50  4294967295  connected     Loopback Pseudo-Interface 1
  4          50        1280  disconnected  isatap.local
  5          50        1280  connected     Teredo Tunneling Pseudo-Interface


C:\Windows\system32>netsh interface ipv6 set interface 3 otherstateful=enabled
OK
C:\Windows\system32>
 

Windowsでは IPv6のネットワークインターフェースに対して
「otherstateful=enabled」に設定する必要があります

解説はここまでです
自前で DNSサーバを運用するような状況では DHCPまで正しく構築する必要あります

逆に 自宅のネット環境など パソコンやゲーム機が数台だけの環境なら
特に IPv6ではブロードバンドルータさえあればネットの設定は自動化され楽です

IPv6サーバツールへ戻る

無線ルータ MZK-RP150N

格安な無線小型ルータ

MZK-RP150N という小型無線ルータです
ソフマップで 3000円くらいで購入しまして特に問題なく使えたのでその紹介です
MZK-RP150N 1
当初は サーバマシンに PCIの無線LANカードを挿す形を考えていたのですが
録画サーバとして使っていて PCIの空きスロットがなく断念
MZK-RP150N 2
有線イーサネットの口は 2口用意されていて LAN側 WAN側 と扱いが異なります
ブロードバンドルータとしての使いかたも可能です
今回は 家庭内部セグメントに接続しているので LAN側ポートを使いました
MZK-RP150N 3
無線LANは IEEE802.11n仕様で 150Mbpsまで可能ですが LAN部分は 100Mbpsまでです
またかなりの小型サイズで USB給電のため外出先で利用することも可能です
(最近のモバイルPCは ほぼ無線LAN搭載なので持ち運ぶニーズはないですが)
MZK-RP150N Web管理メニュー
設定も Webインターフェースから行え NATやファイヤウォールの設定も可能です
初期状態では 無線LAN側から設定画面へアクセスできます
ブロードバンドルータに必要な設定が一通り可能です
MZK-RP150N Web管理メニュー ステータス1
コンバータモードというのは MZK-RP150Nが無線LAN子機となる
つまり LAN と 無線LAN のコンバータとして動作するというモードです
無線LAN非搭載の PC持ち出すといった際に使えそうです
MZK-RP150N Web管理メニュー ステータス2
ステータスメニューから 無線LANの状況も確認できます
仮想AP1〜4を使えば 別設定のアクセスポイントを最大4つまで併設できます
MZK-RP150N Web管理メニュー ネットワーク1
LAN側設定としては DHCPサーバ設定が可能です
MZK-RP150N Web管理メニュー ネットワーク2
WAN側の設定画面です 今回WANポート利用していないので未設定です
MZK-RP150N Web管理メニュー 管理1
管理メニューからは 無線LANの設定が可能です
MZK-RP150N Web管理メニュー 管理2
無線LANの詳細パラメータも設定できます
電波を遠くに飛ばしたくないので 送信電力を落とすぐらいしか設定してません
MZK-RP150N Web管理メニュー 管理3
グリーンAPとは 指定の時間帯無線機能を止めて省電力にする設定です

アクセス方式は セキュリティ強度のある WPAを利用するようにしましょう

Dovecot IMAPサーバの導入

IMAP4 構築ログ

IMAPサーバが 64bit + IPv6 環境で動作するかの検証です
IMAPサーバの有名な実装は以下 4つありますが今回 Dovecot を導入してみたので紹介します

IMAP4実装
Cyrus-IMAP Courier-IMAP UW Dovecot
メール保存形式 独自形式 Maildir mbox可能
Maildir不可
その他多数の形式に対応
mbox Maildir
通信方式 IPv4/IPv6 IPv4/IPv6 別途 inetd/xinetd 必要 IPv4/IPv6
vpopmail 不可 不可 不可
DB認証
LDAP,MySQL,PostgreSQL
対応 対応 非対応 対応

まず Cyrus-IMAP と UW は Maildir形式に対応していないため Postfixと相性が悪そうです
Courier-IMAPは 今まで使えていて不満もありませんでしたが
今回新しい実装ということで mbox形式にも対応している Dovecot を試すことにしました

また近い将来 インターネット経由でIMAPを利用することを考えて下記 セキュリティを重視します

  • imapsプロトコルで SSL利用
  • アカウント管理を LDAPで行い UNIXパスワードと別パスワードを使う
検証環境
CPU PhenomII X4 905e (2.5GHz 4コア)
マザーボード GA-880GM-USB3
メモリ 16GB (DDR3-1066)
イーサネット Realtek8111D (R8168 GbE)
Linuxカーネルバージョン 3.0.0 (x86_64)
GCC 4.5.2
glibc 2.13.1
Linux-PAM 1.1.3
OpenSSL 1.0.0d
LDAP 2.4.23
PostgreSQL 9.1.0
MySQL 5.5.15
Postfix 2.8.4
Dovecot 2.0.17

インストール

ソースコードからのインストール手順は下記の通りです

Dovecotダウンロードサイトから最新のソースコードを取得します
Dovecotダウンロードサイト

$ tar -xzf dovecot-2.0.17.tar.gz
$ cd dovecot-2.0.17
$ ./configure --prefix=/usr --localstatedir=/var --with-ssldir=/usr/etc/ssl --with-ldap=yes --with-pgsql --with-mysql
checking for a BSD-compatible install... /bin/install -c
checking whether build environment is sane... yes
checking for a thread-safe mkdir -p... /bin/mkdir -p
checking for gawk... gawk

〜

Install prefix . : /usr
File offsets ... : 64bit
I/O polling .... : epoll
I/O notifys .... : inotify
SSL ............ : yes (OpenSSL)
GSSAPI ......... : no
passdbs ........ : static passwd passwd-file shadow pam checkpassword ldap sql
                 : -bsdauth -sia -vpopmail
userdbs ........ : static prefetch passwd passwd-file checkpassword ldap sql nss
                 : -vpopmail
SQL drivers .... : pgsql mysql
                 : -sqlite
$ make
make  all-recursive
make[1]: ディレクトリ `/home/admin/dovecot-2.0.17' に入ります
Making all in .

〜

make[3]: ディレクトリ `/home/admin/dovecot-2.0.17/doc' から出ます
make[2]: ディレクトリ `/home/admin/dovecot-2.0.17/doc' から出ます
make[1]: ディレクトリ `/home/admin/dovecot-2.0.17' から出ます
$ su
# make install
Making install in .
make[1]: ディレクトリ `/home/admin/dovecot-2.0.17' に入ります
/bin/sh ./update-version.sh . .

〜

make[3]: ディレクトリ `/home/admin/dovecot-2.0.17/doc' から出ます
make[2]: ディレクトリ `/home/admin/dovecot-2.0.17/doc' から出ます
make[1]: ディレクトリ `/home/admin/dovecot-2.0.17/doc' から出ます
#
 

DBでアカウント管理も可能です
OpenLDAP PostgreSQL MySQL はインストール済なので
–with-ldap –with-pgsql –with-mysql を付けています
(今回は LDAPのみ使います)

/usr/bin/ 配下には doveadm doveconf dsync コマンドが
/usr/sbin/ 配下には dovecot デーモンがインストールされます

次に サーバの設定ファイルを記述します
いずれもサンプルがあるので まずサンプルをコピーしてから必要な編集を行います

# cp -r /usr/share/doc/dovecot/example-config/* /usr/etc/dovecot/
# ls -R /usr/etc/dovecot/
/usr/etc/dovecot/:
README  dovecot-db.conf.ext        dovecot-ldap.conf.ext  dovecot.conf
conf.d  dovecot-dict-sql.conf.ext  dovecot-sql.conf.ext

/usr/etc/dovecot/conf.d:
10-auth.conf      20-lmtp.conf                 auth-master.conf.ext
10-director.conf  20-pop3.conf                 auth-passwdfile.conf.ext
10-logging.conf   90-acl.conf                  auth-sql.conf.ext
10-mail.conf      90-plugin.conf               auth-static.conf.ext
10-master.conf    90-quota.conf                auth-system.conf.ext
10-ssl.conf       auth-checkpassword.conf.ext  auth-vpopmail.conf.ext
15-lda.conf       auth-deny.conf.ext
20-imap.conf      auth-ldap.conf.ext
#
 

dovecot.conf がメインで それ以外の設定ファイルは
dovecot.conf からインクルードされている構成です

まずは dovecot.conf から

(編集した行のみ記載します)
protocols = imaps pop3s
listen = ::
 

protocols には IMAPs POP3s のみを指定しました SSLの設定は後述します
listen には :: を指定しIPv6のみとしましたが 通常は IPv4も可能となる *, :: で指定します

次は dovecot-ldap.conf.ext です LDAPアカウント管理が必要な場合編集します

(編集した行のみ記載します)
hosts = ::1
dn = cn=Manager,dc=mydomain
dnpass = パスワード
base = ou=People,dc=local
pass_attrs = uid=user,userPassword=password,uidNumber=uid,gidNumber=gid,homeDirectory=home,mailDirectory=mail
 

hosts は LDAPサーバのホストを指定します
dn dnpass base はそれぞれ検索に使う LDAPアカウント パスワード 検索ベース位置 の指定です
pass_attrs の設定が重要です 1回のLDAP検索で uid gid home mail 情報も取る設定にします
LDAP自体の設定とアカウント情報の投入方法については後述します

conf.d/10-auth.conf の設定です

(編集した行のみ記載します)
disable_plaintext_auth = no
#!include auth-system.conf.ext
!include auth-ldap.conf.ext
 

プレインテキストを許可しているのは プロトコルが暗号化される imaps pop3s だからです
また !include の行を修正して 利用したい auth-ldap.conf.ext のみを有効化します

conf.d/10-mail.conf の設定です

(編集した行のみ記載します)
mail_location = maildir:~/Maildir
 

ここで Maildir形式を指定しています

ひとまず Dovecot本体のインストールと設定は以上です

SSL証明書の作成

IMAPs と POP3s に必要な SSL証明書を作成します
Dovecotのソースコードに mkcert.sh スクリプトが付属しているのでそれを利用します

まずは 設定ファイル /usr/etc/dovecot/dovecot-openssl.cnf を下記のように作成します

[ req ]
default_bits                    = 1024
encrypt_key                     = yes
distinguished_name              = req_distinguished_name
x509_extensions                 = cert_type
prompt                          = no

[ req_distinguished_name ]
countryName                     = JP
stateOrProvinceName             = Tokyo
localityName                    = Test-ku
0.organizationName              = Test Coporation
organizationalUnitName          = Test Section
commonName                      = phenom.mydomain
emailAddress                    = postmaster.mydomain

[ cert_type ]
nsCertType = server
 

mkcert.shを実行します

# cd /usr/etc/dovecot
# SSLDIR=/usr/etc/ssl sh ~admin/dovecot-2.0.17/doc/mkcert.sh
 
Generating a 1024 bit RSA private key
.................................................++++++
.............................++++++
writing new private key to '/usr/etc/ssl/private/dovecot.pem'
-----

subject= /C=JP/ST=Tokyo/L=Test-ku/O=Test Coporation/OU=Test Section/CN=phenom.mydomain/emailAddress=postmaster.mydomain
SHA1 Fingerprint=41:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:**:80
#
 

LDAPアカウント設定

arinux (参考サイト)を参考にしました
http://sourceforge.jp/projects/postldapadmin/ から postLDAPadmin_admin パッケージを取得します
このパッケージ 元々 Postfix用の LDAPアカウント管理ツールですが
中に含まれる postLDAPadmin.schema だけを拝借します

# tar --strip-components=1 -xzf postLDAPadmin_admin-2.20.tar.gz postldapadmin/postLDAPadmin.schema
# mv postLDAPadmin.schema /usr/etc/openldap/schema/
 

また slapd.conf に postLDAPadmin.schema を読み込む指定
ldap.conf には認証に利用する ou の指定が必要です

/usr/etc/openldap/slapd.conf の追加設定行

include         /usr/etc/openldap/schema/postLDAPadmin.schema
 

/usr/etc/openldap/ldap.conf の追加設定行

#
# nsswitch
#
nss_base_passwd ou=People,dc=mydomain?one
nss_base_group  ou=Group,dc=mydomain?one
 

OpenLDAPを再起動後 早速アカウントを登録していきますが
現在のデータの登録状況を確認します
OpenLDAPのインストールと基本データの登録は OpenLDAPのインストール で行ったので

# ldapsearch -x -b 'dc=mydomain' -D 'cn=Manager,dc=mydomain' -LLL -W
Enter LDAP Password: 
dn: dc=mydomain
objectClass: dcObject
objectClass: organization
dc: mydomain
o: mydomain

dn: ou=People,dc=mydomain
objectClass: organizationalUnit
ou: People

dn: ou=Group,dc=mydomain
objectClass: organizationalUnit
ou: Group

#
 

となっており ou=People と ou=Group まで作られています
今回 メール関連の登録情報はアカウント登録情報に統合する形で People 内に登録します

# ldapadd -a -x -D 'cn=Manager,dc=mydomain' -W
Enter LDAP Password: 
dn: cn=users,ou=Group,dc=local
gidNumber: 100
objectClass: top
objectClass: posixGroup
cn: users

adding new entry "cn=users,ou=Group,dc=mydomain"

dn: uid=imaptest,ou=People,dc=mydomain
objectClass: top
objectClass: posixAccount
objectClass: account
objectClass: postLdapAdmin
uid: imaptest
cn: for IMAP
uidNumber: 500
gidNumber: 100
homeDirectory: /home/admin
loginShell: /usr/bin/bash
userPassword: (パスワードを設定)
gecos: admin mailbox
mail: admin@mydomain
mailDirectory: /home/admin/Maildir/

adding new entry "cn=imaptest,ou=People,dc=mydomain"

Ctrl+D を入力
#
 

下線箇所が objectClass: postLdapAdmin に関するメールアカウント設定で
それ以外の箇所が通常の LDAPアカウント登録情報です

ここでは imaptestというアカウント名と個別のパスワードを登録しました
実体(メールボックス)は 別の既存UNIXアカウントです

実際は メールアカウント名とUNIXアカウント名を一致させたほうが
運用上の紛らわしさが少ないでしょう

その他設定

あとは /etc/services に下記設定があることを確認するくらいです

imaps           993/tcp                 # IMAP over SSL
imaps           993/udp                 # IMAP over SSL
pop3s           995/tcp                 # POP-3 over SSL
pop3s           995/udp                 # POP-3 over SSL
 

運用

サービスの開始と起動は単純で
dovecotプログラムを実行したり stop引数を付けて停止させるだけです

dovecotを起動した後の 確認としてはTCPポート番号が開いているかの確認と

$ netstat -a
〜
tcp6       0      0 [::]:imaps              [::]:*                  LISTEN
tcp6       0      0 [::]:pop3s              [::]:*                  LISTEN
〜
〜
$
 

プロセスでも確認できます

$ ps aux | grep dovecot
root      3532  0.0  0.0  23580   876 ?        Ss   01:55   0:00 /usr/sbin/dovecot
mail      3544  0.0  0.0  15116  1024 ?        S    01:55   0:00 dovecot/anvil
root      3545  0.0  0.0  15240  1016 ?        S    01:55   0:00 dovecot/log
root      3555  0.0  0.0  25896  3516 ?        S    01:55   0:00 dovecot/config
mail      4537  0.0  0.0  23732  2752 ?        S    02:12   0:00 dovecot/imap-login
admin     4538  0.0  0.0  18944  2588 ?        S    02:12   0:00 dovecot/imap
mail      9178  0.0  0.0  69656  4040 ?        S    10:13   0:00 dovecot/auth
root      9179  0.0  0.0  21316  1404 ?        S    10:13   0:00 dovecot/ssl-params
$
 

プログラムは 1つだけでしたが プロセスとしては複数起動しています
admin (一般ユーザ権限) で dovecot/imap が起動しているのは
メーラーから実際にクライアント接続しているためです
Sylpheedメールクライアント設定1
メーラーである Sylpheed (Linux版) の設定画面です
pop3sで Dovecotへの正常接続が確認できました

サーバ指定は IPv6アドレスを指定していますが
IPv6 DNS環境があれば IPv6ホスト名でもつながります
Sylpheedメールクライアント設定2
pop3s を利用しているので SSLタブの設定で
「SSLを使用」にチェックが必要です
Sylpheedメールクライアント設定3
Sylpheed(Windows8版) の動作画面です 問題なく動作しました
Thunderbirdメールクライアント設定1
Thunderbirdメールクライアント設定2
Thunderbird (Windows版) でも動作確認できました
「サーバ名」に IPv6ホスト名を指定する必要があり IPv6アドレスは不可でした
そのため Thunderbirdを使うには IPv6 DNS環境が必須なので注意が必要です
Windowsメールクライアント設定1
Windowsメールクライアント設定2
Windowsメールクライアント設定3
Windows Vistaに標準搭載の Windowsメールです 手軽にメールやニュースをやり取りできます
これも IPv6の設定で問題なくメールが使えました

IPv6サーバツールへ戻る

BIND DNSの導入検証

DNSサーバの標準である BINDを64bit+IPv6環境で検証します

BINDは DNSサーバで UNIX系システムでは事実上の標準と言えるほど有名です
ISCがソースの保守を行っていて 年に1回は新機能リリースをやっているようです

今回 BIND9 をインストールして 64bit環境 IPv6環境での動作検証を行います

検証環境
CPU AMD PhenomII X4 905e (2.5GHz 4コア)
メモリ 16GB
OS Gentoo-1.12.14ベース Linux-3.0 UTF-8
コンパイラ gcc-4.5.2
Cライブラリ glibc-2.13
ODBC libiodbc-3.52.7
BerkeleyDB 5.1.25.NC
PostgreSQL 9.1
MySQL 5.5.15
Oracle 11g Express Edition Release2
LDAP OpenLDAP-2.4.23
BIND 9.8.1

ここで なぜ(自宅に)DNSサーバが必要で DNSのIPv6化が何を指しているのかを説明します
まず IPv6ネットワークの状況ですが
フレッツ IPv6 DNS
フレッツルータから下の部分は 自宅LANの状況です
今回 IPv6対応の DNSサーバを構築するのが目的です

フレッツ網は IPv6も可能ですが インターネット上の他のIPv6網と分断されています (2011年状況)
従って インターネット上の他のIPv6ネットワークへは直接通信が届きません

自宅内に複数の 端末/サーバ/ルータ があってホスト名をつけたい場合
今回のように 「自宅にDNSサーバを立てる必要がある」のです

IPv6通信するのは 赤の矢印の部分です 通信は IPv6ですが
IPv4ホスト名(Aレコード)/IPv6ホスト名(AAAAレコード) どちらも解決できます

インターネットの IPv6通信は分断された状態ですが
フレッツ網の DNSサーバはどうやって 他IPv6網の名前情報にアクセスしているのでしょうか?
フレッツ IPv4 DNS
上図は IPv4通信の状況です
フレッツのDNSサーバは IPv4を使って IPv6/IPv4名前解決をしていると思われます
(フレッツ網内の仕組みは詳しくないので ひょっとしたら違うかも)

いずれにしても 自宅の IPv6/IPv4 DNS化は下記前提で行います

  • フレッツ網内の DNSサーバが IPv6(AAAA)/IPv4(A) どちらも解決可能
  • フレッツ網内の DNSサーバへ IPv6通信で問い合わせる (IPv4通信でも可能だが)
  • 自宅DNSサーバは IPv6(AAAA)/IPv4(A) 解決可能 かつ IPv6通信/IPv4通信 可能

インストール

$ tar -xzf bind-9.8.1.tar.gz
$ cd bind-9.8.1
$ ./configure --prefix=/ram --localstatedir=/ram/var --with-openssl --enable-threads --enable-atomic --with-randomdev=/dev/urandom --enable-getifaddrs --with-dlz-postgres=yes --with-dlz-mysql=/usr/mysql --with-dlz-bdb=yes --with-dlz-filesystem=yes --with-dlz-ldap=yes --with-dlz-odbc=yes --with-dlz-stub=yes
checking build system type... x86_64-unknown-linux-gnu
checking host system type... x86_64-unknown-linux-gnu
checking whether make sets $(MAKE)... yes
checking for gcc... gcc

〜

make[1]: Leaving directory `/ram/bind-9.8.1/doc'
rm -f *.o *.o *.lo *.la core *.core *-symtbl.c *tmp0 *tmp1 *tmp2
rm -rf .depend .libs
rm -f FAQ.tmp
$ make
making all in /home/admin/bind-9.8.1/make
make[1]: ディレクトリ `/home/admin/bind-9.8.1/make&apos に入ります
make[1]: ディレクトリ `/home/admin/bind-9.8.1/make' から出ます

〜

/home/admin/bind-9.8.1/bin/named/../../contrib/dlz/drivers/dlz_postgres_driver.c:487: undefined reference to `sdlzh_build_querystring'
/home/admin/bind-9.8.1/bin/named/../../contrib/dlz/drivers/dlz_postgres_driver.c:484: undefined reference to `sdlzh_build_querystring'
〜
/home/admin/bind-9.8.1/bin/named/../../contrib/dlz/drivers/dlz_odbc_driver.c:1404: undefined reference to `sdlzh_build_sqldbinstance'
collect2: ld はステータス 1 で終了しました
make[2]: *** [named] エラー 1
make[2]: ディレクトリ `/home/admin/bind-9.8.1/bin/named' から出ます
make[1]: *** [subdirs] エラー 1
make[1]: ディレクトリ `/home/admin/bind-9.8.1/bin' から出ます
make: *** [subdirs] エラー 1
$
 

大量の undefined referenceエラーが出ました bind-9.8.1固有のバグのようです
contrib/dlz/drivers/sdlz_helper.c を下記のように修正することで回避できます

 52 
 53 #ifdef DLZ
 54 

  ↓

 52 
 53 //#ifdef DLZ
 54 
 
530 
531 #endif

  ↓

530 
531 //#endif
 

再度 makeします

$ make
making all in /home/admin/bind-9.8.1/make
make[1]: ディレクトリ `/home/admin/bind-9.8.1/make' に入ります
make[1]: ディレクトリ `/home/admin/bind-9.8.1/make' から出ます

〜

making all in /home/admin/bind-9.8.1/doc/doxygen
make[2]: ディレクトリ `/home/admin/bind-9.8.1/doc/doxygen' に入ります
make[2]: ディレクトリ `/home/admin/bind-9.8.1/doc/doxygen' から出ます
make[1]: ディレクトリ `/home/admin/bind-9.8.1/doc' から出ます
$ su
# make install
making all in /home/admin/bind-9.8.1/make
make[1]: ディレクトリ `/home/admin/bind-9.8.1/make' に入ります
make[1]: ディレクトリ `/home/admin/bind-9.8.1/make' から出ます

〜

/bin/sh ./mkinstalldirs /usr/share/man/man1
/usr/bin/install -c isc-config.sh /usr/bin
/usr/bin/install -c -m 644 ./isc-config.sh.1 /usr/share/man/man1
/usr/bin/install -c -m 644 ./bind.keys /usr/etc
$
 

インストールされるファイルは下記の通りです

bin/:
dig  host  isc-config.sh  nslookup  nsupdate

etc/:
bind.keys

include/bind9:
check.h  getaddresses.h  version.h

include/dns:
acl.h         ds.h          message.h       rdataslab.h    tcpmsg.h
adb.h         enumclass.h   name.h          rdatastruct.h  time.h
byaddr.h      enumtype.h    ncache.h        rdatatype.h    tkey.h
cache.h       events.h      nsec.h          request.h      tsig.h
callbacks.h   fixedname.h   peer.h          resolver.h     ttl.h
cert.h        iptable.h     portlist.h      result.h       types.h
compress.h    journal.h     private.h       rootns.h       validator.h
db.h          keyflags.h    rbt.h           rpz.h          version.h
dbiterator.h  keytable.h    rcode.h         sdb.h          view.h
dbtable.h     keyvalues.h   rdata.h         sdlz.h         xfrin.h
diff.h        lib.h         rdataclass.h    secalg.h       zone.h
dispatch.h    log.h         rdatalist.h     secproto.h     zonekey.h
dlz.h         master.h      rdataset.h      soa.h          zt.h
dnssec.h      masterdump.h  rdatasetiter.h  ssu.h

include/dst:
dst.h  gssapi.h  lib.h  result.h

include/isc:
app.h          formatcheck.h    md5.h         quota.h        stdtime.h
assertions.h   fsaccess.h       mem.h         radix.h        string.h
atomic.h       hash.h           msgcat.h      random.h       symtab.h
base64.h       heap.h           msgs.h        ratelimiter.h  syslog.h
bind9.h        hex.h            mutex.h       refcount.h     task.h
bitstring.h    hmacmd5.h        mutexblock.h  region.h       taskpool.h
boolean.h      httpd.h          namespace.h   resource.h     thread.h
buffer.h       int.h            net.h         result.h       time.h
bufferlist.h   interfaceiter.h  netaddr.h     resultclass.h  timer.h
commandline.h  iterated_hash.h  netdb.h       rwlock.h       types.h
condition.h    lang.h           offset.h      serial.h       util.h
dir.h          lex.h            once.h        sha1.h         version.h
entropy.h      lfsr.h           ondestroy.h   sha2.h         xml.h
error.h        lib.h            os.h          sockaddr.h
event.h        list.h           parseint.h    socket.h
eventclass.h   log.h            platform.h    stdio.h
file.h         magic.h          print.h       stdlib.h

include/isccc:
alist.h   cc.h     events.h  result.h  symtab.h   types.h  version.h
base64.h  ccmsg.h  lib.h     sexpr.h   symtype.h  util.h

include/isccfg:
aclconf.h  cfg.h  grammar.h  log.h  namedconf.h  version.h

include/lwres:
context.h  ipv6.h  list.h      lwpacket.h  net.h    platform.h  version.h
int.h      lang.h  lwbuffer.h  lwres.h     netdb.h  result.h

lib/:
libbind9.a  libdns.a  libisc.a  libisccc.a  libisccfg.a  liblwres.a

sbin/:
arpaname             dnssec-revoke    lwresd             named-journalprint
ddns-confgen         dnssec-settime   named              nsec3hash
dnssec-dsfromkey     dnssec-signzone  named-checkconf    rndc
dnssec-keyfromlabel  genrandom        named-checkzone    rndc-confgen
dnssec-keygen        isc-hmac-fixup   named-compilezone

share/man/man1:
arpaname.1  dig.1  host.1  isc-config.sh.1  nslookup.1  nsupdate.1

share/man/man3:
lwres.3                     lwres_gabnresponse_render.3
lwres_addr_parse.3          lwres_gai_strerror.3
lwres_buffer.3              lwres_getaddrinfo.3
lwres_buffer_add.3          lwres_getaddrsbyname.3
lwres_buffer_back.3         lwres_gethostbyaddr.3
lwres_buffer_clear.3        lwres_gethostbyaddr_r.3
lwres_buffer_first.3        lwres_gethostbyname.3
lwres_buffer_forward.3      lwres_gethostbyname2.3
lwres_buffer_getmem.3       lwres_gethostbyname_r.3
lwres_buffer_getuint16.3    lwres_gethostent.3
lwres_buffer_getuint32.3    lwres_gethostent_r.3
lwres_buffer_getuint8.3     lwres_getipnode.3
lwres_buffer_init.3         lwres_getipnodebyaddr.3
lwres_buffer_invalidate.3   lwres_getipnodebyname.3
lwres_buffer_putmem.3       lwres_getnamebyaddr.3
lwres_buffer_putuint16.3    lwres_getnameinfo.3
lwres_buffer_putuint32.3    lwres_getrrsetbyname.3
lwres_buffer_putuint8.3     lwres_gnba.3
lwres_buffer_subtract.3     lwres_gnbarequest_free.3
lwres_conf_clear.3          lwres_gnbarequest_parse.3
lwres_conf_get.3            lwres_gnbarequest_render.3
lwres_conf_init.3           lwres_gnbaresponse_free.3
lwres_conf_parse.3          lwres_gnbaresponse_parse.3
lwres_conf_print.3          lwres_gnbaresponse_render.3
lwres_config.3              lwres_herror.3
lwres_context.3             lwres_hstrerror.3
lwres_context_allocmem.3    lwres_inetntop.3
lwres_context_create.3      lwres_lwpacket_parseheader.3
lwres_context_destroy.3     lwres_lwpacket_renderheader.3
lwres_context_freemem.3     lwres_net_ntop.3
lwres_context_initserial.3  lwres_noop.3

lwres_context_nextserial.3  lwres_nooprequest_free.3
lwres_context_sendrecv.3    lwres_nooprequest_parse.3
lwres_endhostent.3          lwres_nooprequest_render.3
lwres_endhostent_r.3        lwres_noopresponse_free.3
lwres_freeaddrinfo.3        lwres_noopresponse_parse.3
lwres_freehostent.3         lwres_noopresponse_render.3
lwres_gabn.3                lwres_packet.3
lwres_gabnrequest_free.3    lwres_resutil.3
lwres_gabnrequest_parse.3   lwres_sethostent.3
lwres_gabnrequest_render.3  lwres_sethostent_r.3
lwres_gabnresponse_free.3   lwres_string_parse.3
lwres_gabnresponse_parse.3

share/man/man5:
named.conf.5  rndc.conf.5

share/man/man8:
ddns-confgen.8         dnssec-settime.8   named-checkconf.8     nsec3hash.8
dnssec-dsfromkey.8     dnssec-signzone.8  named-checkzone.8     rndc-confgen.8
dnssec-keyfromlabel.8  genrandom.8        named-compilezone.8   rndc.8
dnssec-keygen.8        isc-hmac-fixup.8   named-journalprint.8
dnssec-revoke.8        lwresd.8           named.8

var/run:
 

DNSサービスを開始/停止するのに使う start/stopスクリプトも作成しておきます
検証環境は Gentooベースのシステムのため下記内容 /etc/init.d/bind (0755) となります

#!/sbin/runscript
# Copyright 1999-2004 Gentoo Foundation
# Distributed under the terms of the GNU General Public License v2
# $Header$

PIDFILE=/var/run/named.pid

depend() {
        need net.eth0
        provide dns
}

start() {
        ebegin "Starting bind"
        /usr/local/sbin/named -u daemon
        eend $?
}

stop() {
        ebegin "Stopping bind"
        /bin/kill `cat $PIDFILE`
        eend $?
}
 

デーモンプロセスである named は daemonアカウントで動作させることにしています

ルートネームサーバのアドレスリストを取得しておきましょう
(ただし 今回の構成では実際に利用することはありません)
下記 2通りのいずれかの方法です

  1. FTP ftp://ftp.nic.ad.jp/internic/domain/named.rootから直接取得
  2. digコマンドにより取得 dig @A.ROOT-SERVERS.NET. > /etc/namedb/named.root

named.root は下記のような内容になっています

; <<>> DiG 9.4.2 <<>> @A.ROOT-SERVERS.NET.
; (2 servers found)
;; global options:  printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 21878
;; flags: qr aa rd; QUERY: 1, ANSWER: 13, AUTHORITY: 0, ADDITIONAL: 14
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;.                              IN      NS

;; ANSWER SECTION:
.                       518400  IN      NS      m.root-servers.net.
.                       518400  IN      NS      h.root-servers.net.
.                       518400  IN      NS      b.root-servers.net.
.                       518400  IN      NS      g.root-servers.net.
.                       518400  IN      NS      f.root-servers.net.
.                       518400  IN      NS      c.root-servers.net.
.                       518400  IN      NS      a.root-servers.net.
.                       518400  IN      NS      l.root-servers.net.
.                       518400  IN      NS      d.root-servers.net.
.                       518400  IN      NS      i.root-servers.net.
.                       518400  IN      NS      k.root-servers.net.
.                       518400  IN      NS      j.root-servers.net.
.                       518400  IN      NS      e.root-servers.net.

;; ADDITIONAL SECTION:
m.root-servers.net.     3600000 IN      A       202.12.27.33
m.root-servers.net.     3600000 IN      AAAA    2001:dc3::35
h.root-servers.net.     3600000 IN      A       128.63.2.53
h.root-servers.net.     3600000 IN      AAAA    2001:500:1::803f:235
b.root-servers.net.     3600000 IN      A       192.228.79.201
g.root-servers.net.     3600000 IN      A       192.112.36.4
f.root-servers.net.     3600000 IN      A       192.5.5.241
f.root-servers.net.     3600000 IN      AAAA    2001:500:2f::f
c.root-servers.net.     3600000 IN      A       192.33.4.12
a.root-servers.net.     3600000 IN      A       198.41.0.4
a.root-servers.net.     3600000 IN      AAAA    2001:503:ba3e::2:30
l.root-servers.net.     3600000 IN      A       199.7.83.42
l.root-servers.net.     3600000 IN      AAAA    2001:500:3::42
d.root-servers.net.     3600000 IN      A       128.8.10.90

;; Query time: 69 msec
;; SERVER: 198.41.0.4#53(198.41.0.4)
;; WHEN: Wed Oct 12 22:45:39 2011
;; MSG SIZE  rcvd: 512
 

13個のルートネームサーバが登録されており
うちいくつかのサーバは AAAA つまり IPv6によるクエリに対応していることが分かります

ルートネームサーバの用途としては
自ネームサーバが管理していない 外部ドメインなどの名前解決の問い合わせが来た時に
自力でインターネットに名前解決を問い合わせる 最初の問い合わせ先になります

ただし検証環境の構成では
外部名前解決はプロバイダが提供しているネームサーバに問い合わせることになるので
named.root は実際利用することはありません

続いての準備ですが
rndcコマンドで管理オペレーションをする際の 認証設定を行います
鍵を生成してから 設定ファイルに反映させます

まず鍵の生成ですが 以下のいずれかの方法で行います

dnssec-keygenを使って鍵を作成するのが下記の方法です

$ dnssec-keygen -a HMAC-MD5 -b 512 -n USER -r /dev/urandom mydomain
Kmydomain.+157+15789
$ ls Kmydomain*
Kmydomain.+157+15789.key  Kmydomain.+157+15789.private
$ cat Kmydomain.+157+15789.key
mydomain. IN KEY 0 3 157 3******************************************************* *****************************w==
deer@phenom /ram $ cat Kmydomain.+157+15789.private 
Private-key-format: v1.3
Algorithm: 157 (HMAC_MD5)
Key: 3************************************************************************************w==
Bits: AAA=
Created: 20111013062944
Publish: 20111013062944
Activate: 20111013062944
$
 

上記2ファイルは 鍵の内容を一部伏せていますが HMAC-MD5自体が共通鍵方式なので内容は同じです
.private側の文字列を後で設定ファイルに取り込みます

別の手段として次の rndc-confgenコマンドを使う方が手順としては楽でしょう

$ su
# rndc-confgen -a -b 512 -k mydomain
wrote key file "/usr/etc/rndc.key"
# cat /usr/etc/rndc.key
# Start of rndc.conf
key "mydomain" {
        algorithm hmac-md5;
        secret "c************************************************************************************w==";
};

options {
        default-key "mydomain";
        default-server 127.0.0.1;
        default-port 953;
};
# End of rndc.conf

# Use with the following in named.conf, adjusting the allow list as needed:
# key "mydomain" {
#       algorithm hmac-md5;
#       secret "c************************************************************************************w==";
# };
# 
# controls {
#       inet 127.0.0.1 port 953
#               allow { 127.0.0.1; } keys { "mydomain"; };
# };
# End of named.conf
 

直接 rndc.key フォーマットの設定ファイルを出力してくれます

作成した鍵を 設定ファイルに反映させます
まず クライアント用の設定ですが /usr/etc/rndc.key もしくは /usr/etc/rndc.conf
を上記の内容で作成します
dnssec-keygenを使った場合は secretの箇所に .private の Key: 鍵データを貼り付けます
rndc-confgenを使った場合は /usr/etc/rndc.key がそのまま使えます

サーバ用の設定ですが /usr/etc/named.conf に keyセクションと controlsセクションを記述します
bindの設定も含めて下記内容となります

acl "mydomain4" {
        127.0.0.1/32;
        192.168.1.0/24;
};

acl "mydomain6" {
        ::1/128;
        fe80::/64;
};

options {
        directory "/usr/etc";
        pid-file "/var/run/named.pid";
        port 53;
        max-cache-size 4m;
        listen-on { mydomain4; };
        listen-on-v6 { mydomain6; };
        forwarders { 2408:**:****:0:2***:****:****:***9; };
};

key "mydomain" {
        algorithm hmac-md5;
        secret "c************************************************************************************w==";
};

controls {
        inet ::1 allow { ::1; } keys { mydomain; };
};

zone "." in {
        type hint;
        file "named.root";
};

zone "mydomain" in {
        type master;
        file "mydomain.zone";
};

zone "0.0.127.in-addr.arpa" {
        type master;
        file "0.0.127.in-addr.arpa.zone";
};

zone "1.168.192.in-addr.arpa" {
        type master;
        file "1.168.192.in-addr.arpa.zone";
};

zone "0.0.0.0.0.0.0.0.0.0.0.0.0.8.e.f.ip6.arpa" {
        type master;
        file "0.0.0.fe80.in-addr.arpa.zone";
};
 

optionsセンテンスの listen-onで IPv4用 IPv6用 のアクセスリストを指定しています
それぞれのアクセスリストには ループバックと DNSクエリを受け付けたいネットワークを指定します
(これで 該当するネットワークインターフェースで DNSクエリを受け付けるようになります)

optionsセンテンスの forwardersには 上流フレッツ網のDNSサーバを指定します
IPv6アドレスで指定していますが IPv4アドレスの指定も可能です
forwardersがないと namedは直接インターネットに問い合わせようとして失敗します
(フレッツ光では インターネットへの直接問い合わせを禁止しています)

keyセンテンスには 先ほど設定した rndc用のキーを指定します
また rndc接続許可アドレスを controlsセンテンスで設定しています
これで rndcコマンドを受け付けるようになります

後は zoneセンテンスで各種 IPv6/IPv4問い合わせに対する設定をしています
IPv6の設定は グローバルアドレスではなくリンクローカルアドレス(fe80::/64)を使っていますが
リンクローカルアドレスを設定するのは ルール違反です
今回 IPv6インターネットが使えるようになるまでの暫定措置と動作確認用です

各ゾーンファイルの内容は下記の通りです
mydomain.zone (正引き用)

$TTL 3600
@     IN SOA phenom.mydomain. postmaster.mydomain. (
                         2011102402; serial
                         3600;       refresh
                         100;        retry
                         604800;     expire
                         86400;      negative
                         )
        IN NS     phenom4.mydomain.
        IN MX 10  phenom4.mydomain.
aterm4  IN A      192.168.1.1
aterm   IN AAAA   fe80::2***:****:****:***9
phenom4 IN A      192.168.1.254
phenom  IN AAAA   fe80::1***:****:****:***a
 

0.0.127.in-addr.arpa.zone (IPv4逆引き)

$TTL 3600
@     IN SOA phenom.mydomain. postmaster.mydomain. (
                         2011102003; serial
                         3600;       refresh
                         900;        retry
                         604800;     expire
                         86400;      negative
                         )
        IN NS    phenom4.mydomain.
        IN MX 10 phenom4.mydomain.
1       IN PTR   localhost-v4.mydomain.
 

1.168.192.in-addr.arpa.zone (IPv4逆引き)

$TTL 3600
@     IN SOA phenom.mydomain. postmaster.mydomain. (
                         2011102002; serial
                         3600;       refresh
                         900;        retry
                         604800;     expire
                         86400;      negative
                         )
        IN NS    phenom.mydomain.
        IN MX 10 phenom.mydomain.
1       IN PTR   aterm4.mydomain.
254     IN PTR   phenom4.mydomain.
 

0.0.0.fe80.in-addr.arpa.zone (IPv6逆引き)

$TTL 3600
@     IN SOA phenom.mydomain. postmaster.mydomain. (
                         2011101802; serial
                         3600;       refresh
                         900;        retry
                         604800;     expire
                         86400;      negative
                         )
        IN NS    phenom.mydomain.
        IN MX 10 phenom.mydomain.
9.*.*.*.*.*.*.*.*.*.*.*.*.*.*.2 IN PTR aterm.mydomain.
a.*.*.*.*.*.*.*.*.*.*.*.*.*.*.1 IN PTR phenom.mydomain.
 

IPv6アドレスの一部は伏字にしています
現在 aterm(ルータ)と phenom(DNSサーバ自身)の設定のみですが
後で XBox360 や Wii も設定します

クライアント設定も行っておきましょう
Windowsであれば ネットワークのプロパティ画面から
UNIX系であれば /etc/resolv.conf を設定します

動作確認

namedを起動します

# /etc/init.d/named start
 * Starting bind ...                                                    [ ok ]
# netstat -a | grep domain
tcp        0      0 phenom4.mydomain:domain *:*                     LISTEN     
tcp        0      0 localhost:domain        *:*                     LISTEN     
tcp6       0      0 phenom.mydomain:domain  [::]:*                  LISTEN     
tcp6       0      0 localhost:domain        [::]:*                  LISTEN     
udp        0      0 phenom4.mydomain:domain *:*                                
udp        0      0 localhost:domain        *:*                                
udp6       0      0 phenom.mydomain:domain  [::]:*                             
udp6       0      0 localhost:domain        [::]:*                             
Active UNIX domain sockets (servers and established)
#
 

Linuxクライアントで名前解決できることを確認します

$ ping6 -I eth0 -c 2 aterm
PING aterm(aterm.mydomain) from fe80::1***:****:****:***a eth0: 56 data bytes
64 bytes from aterm.mydomain: icmp_seq=1 ttl=64 time=0.151 ms
64 bytes from aterm.mydomain: icmp_seq=2 ttl=64 time=0.152 ms

--- aterm ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.151/0.151/0.152/0.012 ms
$ ping6 -c 2 ds.test-ipv6.jp
PING ds.test-ipv6.jp(2406:800:3:141::196) 56 data bytes

--- ds.test-ipv6.jp ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 999ms
$
 

自宅内ホストへの ping疎通はOKですが リンクローカルアドレスを設定しているので -I 指定が必要です
インターネット上の IPv6テストサイト(ds.test-ipv6.jp)は疎通しませんでした
IPv6アドレスまでは解決されましたが肝心の IPv6ネットワークが分断されているためです

IPv4も確認しておきましょう

$ ping -c 2 aterm4
PING aterm4.mydomain (192.168.1.1) 56(84) bytes of data.
64 bytes from aterm4.mydomain (192.168.1.1): icmp_req=1 ttl=64 time=0.134 ms
64 bytes from aterm4.mydomain (192.168.1.1): icmp_req=2 ttl=64 time=0.129 ms

--- aterm4.local ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 999ms
rtt min/avg/max/mdev = 0.129/0.131/0.134/0.011 ms
$ ping -c 2 www.google.com
PING www.l.google.com (74.125.31.104) 56(84) bytes of data.
64 bytes from tb-in-f104.1e100.net (74.125.31.104): icmp_req=1 ttl=44 time=36.6 ms
64 bytes from tb-in-f104.1e100.net (74.125.31.104): icmp_req=2 ttl=44 time=37.4 ms

--- www.l.google.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1001ms
rtt min/avg/max/mdev = 36.630/37.040/37.450/0.410 ms
$
 

IPv4 各ネットワークも通常通り疎通します

Windowsの コマンドプロンプトからも確認しておきます

C:\\Users\\admin>nslookup phenom
サーバー:  phenom.mydomain
Address:  fe80::1***:****:****:***a

名前:    phenom.mydomain
Address:  fe80::1***:****:****:***a


C:\\Users\\admin>nslookup phenom4
サーバー:  phenom.mydomain
Address:  fe80::1***:****:****:***a

名前:    phenom4.mydomain
Address:  192.168.1.254


C:\\Users\\admin>nslookup ds.test-ipv6.com
サーバー:  phenom.mydomain
Address:  fe80::1***:****:****:***a

権限のない回答:
名前:    ds.test-ipv6.com
Addresses:  2001:470:1:18::2
          216.218.228.114


C:\\Users\\admin>
 

IPv6 IPv4 どちらのクエリにも対応できています

自宅の IPv6環境を構築しました
プロバイダの DNSサーバまでIPv6で通信して IPv6アドレスの解決までできることを確認しました
IPv6が利用可能な環境はすぐ近くまで来ています
IPv6サーバツールへ戻る