[left] [up] [right]

DNSサーバの設定

ここでは、DNSサーバで国際化ドメイン名を扱う場合の手順や注意点について 述べています。

はじめに

DNSサーバで国際化ドメイン名を扱う方法について、解説します。 とはいえ、従来のASCIIドメイン名の場合の設定方法と大きく変わるわけでは ありません。 ただ一つ注意すべき点は 「ゾーンファイルやDNSサーバの設定ファイルのエンコーディングを 変換する必要がある」 ということです。

DNSサーバの設定ファイルやゾーンファイルの変換

国際化ドメイン名とは」で記したように、 国際化ドメイン名は実際にはUTF-8などのエンコーディングで直接表現される のではなく、PunycodeというASCIIと互換な表現形式を用います。 DNSサーバも同様で、設定ファイルやゾーンファイルに直接UTF-8で国際化 ドメイン名を書いても認識しません。 Punycodeに変換したファイルを用意して、それを読み込ませる必要があります。

DNSサーバで国際化ドメイン名の設定を行う上で必要となるのは、この 「Punycodeに変換したファイル」を用意することです。 もちろん、ゾーンファイルにPunycodeで直接

; こんにちは.example.jp
xn--28j2a3ar1p.example.jp. IN CNAME server.example.jp.

のように書ければ苦労はありませんが、これを手作業で行うのは大変です。 idnkit付属のidnconv2という変換ツールを使うと、ファイルを簡単に Punycodeへ変換することができます。 たとえば、BIND 9の設定ファイル (named.conf) をUTF-8で 直接次のように記述したとします。

options {
 directory "/etc/namedb";
};
zone "привет.jp" {
 type master;
 file "example.jp.zone";
};
zone "мир.jp" {
 type master;
 file "example.jp.zone";
};

この設定ファイルの名前をnamed.conf.utf8とすると、 次のコマンドを実行することで、Punycodeに変換したファイル named.conf.punyが生成されます。 必要に応じて、-in オプションで入力テキストの エンコーディングを指定します。

% idnconv2 -in UTF-8 named.conf.utf8 > named.conf.puny

変換後のファイルを見てみると、国際化ドメイン名の部分がPunycodeで 置き換わっているのが分かります。

options {
 directory "/etc/namedb";
};
zone "xn--b1agh1afp.jp" {
 type master;
 file "example.jp.zone";
};
zone "xn--h1ahn.jp" {
 type master;
 file "example.jp.zone";
};

このようにidnconv2は、国際化ドメイン名の箇所だけを抜き出してPunycode に変換します。 ただし、ASCII以外の文字でファイル内にコメントを記すと、誤って変換して しまうことがありますので、注意して下さい。 上記は設定ファイルの変換例でしたが、ゾーンファイルについても同様の 手順で変換できます。

また大抵の場合は、Punycodeからのデコード (逆変換) も可能です。

% idnconv2 -reverse -out UTF-8 named.conf.puny > named.conf.utf8_2

-reverse オプションで、逆変換を指示しています。 しかし残念ながら、必ず元のUTF-8ファイルに戻せる保証はありません。 これは、入力された文字列の中でPunycodeを用いて表記されている箇所と そうでない通常のASCII表記の箇所を、厳密に区別することはできないため です。

逆変換では必ず元に戻せるとは限らないため、 変換が済んだ後も元のUTF-8ファイルは保管しておくことをお薦めします。

idnconv2の使い方の詳細については、 「idnconv2コマンドの使用方法」をご覧下さい。

最後に、変換の手間を極力減らす方法を紹介します。 たとえばUTF-8版のファイル名の末尾には.utf8、Punycode エンコーディング版に.punyをそれぞれ付けるものとします。

次のようなMakefileを用意します。 ただし、「TARGETS = ...」の部分に、実際に変換したいファイル を書き並べます。ファイル名同士は空白で区切ります。 もしUTF-8ではなく、他のエンコーディングでファイルを記述した場合は、 「LOCALCODE = ...」の部分も適宜書き換えて下さい。

LOCALCODE = UTF-8
TARGETS = named.conf.puny

.SUFFIXES: .utf8 .puny

.utf8.puny:
 rm -f $@   
 idnconv -in $(LOCALCODE) $< > $@

all: $(TARGETS)

UTF-8版のファイルの更新が終わったら、makeコマンドを実行します。

% make

これにより、更新されたUTF-8ファイルすべてについて、Punycode版の ファイルが再作成 (ないし新規作成) されます。

[left] [up] [right]